php学习_第14章_PhP处理数据库

--PhP和MySQL关系

php有mysql和mysqli,pdo等几个扩展模块,mysql,mysqli用于连接mysql数据库,pdo还可以连接其他数据库。

 

--PHP连接数据库

PHP有多个扩展模块,分别对应不同的数据库,其中也有对应MySQL的模块。PhP使用扩展模块作为MySQL的客户端,处理数据通常是下面5个步骤:

1.连接到MySQL.

2.选择当前数据库.

3.执行SQL语句.

4.MySQL出错处理.

5.关闭MySQL连接。

 

--连接到MySQL

  • resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] ) //打开或重复使用一个到 MySQL 服务器的连接。server是MySQL 服务器。可以包括端口号,例如 "hostname:port"。

 

--选择当前数据库

  • bool mysql_select_db ( string database_name [, resource link_identifier] ) //设定与指定的连接标识符所关联的服务器上的当前激活数据库。如果没有指定连接标识符,则使用上一个打开的连接
  
  
  
  
  1. $lnk = mysql_connect('localhost''mysql_user''mysql_password'
  2.        or die ('Not connected : ' . mysql_error()); 
  3.  
  4. // make foo the current db 
  5. mysql_select_db('foo'$lnkor die ('Can\'t use foo : ' . mysql_error()); 

 

 --执行SQL语句

  • resource mysql_query ( string query [, resource link_identifier] ) //向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。注意: 查询字符串不用以分号结束
  • SQL语句分为SELECT语句和非SELECT语句(插入,删除,修改记录)。
  • SELECT语句,成功返回结果集,失败返回FALSE。处理完结果集后,需要释放结果集。
  • 非SELECT语句,成功返回TRUE,失败返回FALSE。

 

--MySQL错误提示

  • int mysql_errno ( [resource link_identifier] ) //返回上一个 MySQL 函数的错误号码,如果没有出错则返回 0(零)。注意本函数仅返回最近一次 MySQL 函数的执行(不包括 mysql_error()mysql_errno())的错误代码,因此如果要使用此函数,确保在调用另一个 MySQL 函数之前检查它的值。
  • string mysql_error ( [resource link_identifier] ) //返回上一个 MySQL 函数的错误文本,如果没有出错则返回 ''(空字符串)。如果没有指定连接资源号,则使用上一个成功打开的连接从 MySQL 服务器提取错误信息。注意本函数仅返回最近一次 MySQL 函数的执行的错误。

 

--关闭连接

  • bool mysql_close ( [resource link_identifier] ) //关闭指定的连接标识所关联的到 MySQL 服务器的非持久连接。如果没有指定 link_identifier,则关闭上一个打开的连接。通常不需要使用 mysql_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。

 

--获取自动增长的ID号

  • int mysql_insert_id ( [resource link_identifier] ) //返回给定的 link_identifier 中上一步 INSERT 查询中产生 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。 注意:函数 LAST_INSERT_ID() 总是保存着最新产生的 AUTO_INCREMENT 值,并且不会在查询语句之间被重置。

 

--获取影响的行数

  • int mysql_affected_rows ( [resource link_identifier] ) //取得最近一次与 link_identifier 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数

 

--处理结果集的步骤(结果集$result来自mysql_query$query,$link)

1.确定取的行数,列数,从哪开始取。

  • bool mysql_data_seek ( resource result, int row_number ) //将指定的结果标识所关联的 MySQL 结果内部的行指针移动到指定的行号。接着调用 mysql_fetch_row() 将返回那一行。注意:row_number 从 0 开始row_number 的取值范围应该从 0 到 mysql_num_rows - 1。
  • int mysql_num_fields ( resource result ) //返回结果集中字段的数目
  • int mysql_num_rows ( resource result ) //返回结果集中行的数目。注意此命令仅对 SELECT 语句有效。要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()

2.从结果集中将记录取出。

  • mysql_fetch_row($result) //返回索引数组
  • mysql_fetch_assoc($result) //返回关联数组(下标就是字段名)。
  • mysql_fetch_array($result) //返回索引和关联两个数组。
  • mysql_fetch_object($result) //将一条记录以对象的形式返回。

   这些函数,每次从结果集中取1条记录(如果到了末尾则返回FALSE),并将指针移动到下一条。

3.从结果集中将字段信息取出。

  • string mysql_field_name ( resource result, int field_index ) //返回指定字段索引的字段名result 必须是一个合法的结果标识符,field_index 是该字段的数字偏移量。

    注意: field_index 从 0 开始。例如,第三个字段的索引值其实是 2,第四个字段的索引值是 3,以此类推。

4.释放结果集

  • bool mysql_free_result ( resource result ) //将释放所有与结果标识符 result 所关联的内存

 

 --和URL有关的处理函数

  • array parse_url ( string url ) //解析一个 URL返回一个关联数组,包含在 URL 中出现的各种组成部分

    注意:本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。 

  
  
  
  
  1. $url = 'http://username:password@hostname/path?arg=value#anchor'
  2. print_r(parse_url($url)); 
  3. 将输出: 
  4. Array 
  5.     [scheme] => http 
  6.     [host] => hostname 
  7.     [user] => username 
  8.     [pass] => password 
  9.     [path] => /path 
  10.     [query] => arg=value 
  11.     [fragment] => anchor 
  12. ) //query - 在问号 ? 之后 ,fragment - 在散列符号 # 之后
  •  void parse_str ( string str [, array &arr] ) //拆分str中的各个参数,把用&符号连接的各个部分拆分。例如:
  
  
  
  
  1. $str = "first=value&arr[]=foo+bar&arr[]=baz"
  2. parse_str($str); 
  3. echo $first;  // value 
  4. echo $arr[0]; // foo bar 
  5. echo $arr[1]; // baz 
  6.  
  7. parse_str($str$output); 
  8. echo $output['first'];  // value 
  9. echo $output['arr'][0]; // foo bar 
  10. echo $output['arr'][1]; // baz 
  •  string http_build_query ( array formdata [, string numeric_prefix] ) //使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。参数 formdata 可以是数组或包含属性的对象。一个 formdata 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix 参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。
  
  
  
  
  1. $data = array('foo'=>'bar'
  2.               'baz'=>'boom'
  3.               'cow'=>'milk'
  4.               'php'=>'hypertext processor'); 
  5.                
  6. echo http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor 

 

 

 

--mysqli

 从PHP5开始使用,是一种面向对象技术。

与mysql扩展模块比较:功能增强了,效率提高了,更稳定了。因此通常人们大多使用mysqli扩展模块。

给我们提供了3个类:

  • 和连接有关的类。
  • mysqli_result:处理查询所返回的结果集。
  • mysqli_stmt:和预处理有关的类。

 前面2个类可以完成mysql所有的功能。

mysqli也支持过程化的编程方式,而且比mysql扩展包更高效,更稳定。

 

 

-------------------------mysqli类--------------------------

--mysqli类

--mysqli中连接MySQL,选择数据库

     mysqli连接数据库的方法:创建一个mysqli对象,在构造函数中连接MySQL。

  
  
  
  
  1. class mysqli {  
  2. __construct ( [string host [, string username [, string passwd [, string dbname [, int port [, string socket]]]]]] ) 

    

     在参数dbname中可以设置数据库名称,因此创建对象时,不仅连接了MySQL,而且选择了数据库。如果要在后面改变选择的数据库,可以用select_db方法:

  
  
  
  
  1. class mysqli {  
  2. bool select_db ( string dbname ) 

    

     如何检查连接是否成功:使用过程化的函数(这个不是成员方法)mysqli_connect_errno

  • int mysqli_connect_errno ( void ) //返回连接的错误码,如果返回0则表示连接成功。常用例子:
  
  
  
  
  1. if(mysqli_connect_errno()) 
  2.     echo '连接数据库失败'.mysqli_connect_error(); 
  3. mysqli = null;
  4. exit;
  5. }//mysqli_connect_error函数返回一个字符串,描述了连接错误的原因。 

 

     此外,还可以选择mysqli_init(),options(),real_connect()方式创建对象,连接MySQL,选择数据库。

 

--执行SQL语句

  • 使用成员方法query(string query [,int resultmode])执行SQL语句
  
  
  
  
  1. class mysqli { 
  2. mixed query ( string query [, int resultmode] ) 

SQL语句有两种:

  • SELECT语句:返回结果集,返回mysqli_result对象
  • 非SELECT语句:成功返回TRUE,失败返回FALSE。

      .非SELECT语句中,插入,删除,更新语句会改变记录,成员属性affected_rows记录了影响到的记录行数。(只对执行单条SQL语句有效)

  
  
  
  
  1. class mysqli {  
  2. int affected_rows 

      .获取自动增长的ID,使用成员属性insert_id记录自动增长的ID,此值必须在INSERT操作后才可获取(注意:即使清空表后,再插入新的记录,该字段仍然会接着以前的值继续增加。

  
  
  
  
  1. class mysqli {  
  2. int insert_id 

 

--执行多条SQL语句

  • 使用成员方法multi_query(string query)执行SQL语句
  
  
  
  
  1. class mysqli {  
  2. bool multi_query ( string query ) 

    query里包含多条SQL语句,各条语句间用";"分开。

SQL语句有两种:

  • SELECT语句:成功返回TRUE,失败返回FALSE。注意:与单条查询query(string query [,int resultmode])不同,它不返回结果集,需要另外借助store_result(void)获得结果集。

    使用成员函数store_result(void)获得结果集,返回mysqli_result类的对象:

  
  
  
  
  1. class mysqli {  
  2. mysqli_result store_result ( void ) 

    执行store_result(void)只能获得第1个结果集,如果想获得更多结果集,需要执行next_result(void)调整指针,再执行store_result(void)

  
  
  
  
  1. class mysqli {  
  2. bool next_result ( void )  
  3. }  

    如果还有结果集,返回TRUE;如果已经取过最后1个结果集,返回FALSE。

  • 非SELECT语句(insert,updata,delete语句):成功返回TRUE,失败返回FALSE。

 

--获取一些信息

  • 当前数据库的字符集
  
  
  
  
  1. class mysqli {  
  2. string character_set_name ( void ) 

返回一个字符串,描述当前数据库的字符集。

  • 客户端的信息
  
  
  
  
  1. class mysqli{ 
  2. string mysqli_get_client_info ( void ) 

返回一个字符串,描述MySQL客户端的信息。

  • 主机的信息
  
  
  
  
  1. class mysqli {  
  2. string host_info(void)

返回一个字符串,描述MySQL服务器的主机信息(ip地址,使用的传输层协议)。

  • 服务器的信息
  
  
  
  
  1. class mysqli {  
  2. string server_info(void) 

返回一个字符串,描述MySQL服务器的信息。

 

--MySQL错误提示

mysqli用成员属性errno,error记录各成员函数执行过程中的错误号错误描述

  
  
  
  
  1. class mysqli {  
  2. int errno 
  3. class mysqli {  
  4. string error 

 

 --关闭连接

  
  
  
  
  1. class mysqli {  
  2. bool close ( void ) 

 

 

-------------------------mysqli_result类--------------------------

--mysqli_result类

使用SELECT语句后,用mysqli_result类处理结果集以及获取一些信息。有两种处理:

  • 处理记录;
  • 处理字段信息。 

 

--处理记录

  • 成员方法fetch_row(),返回索引数组。对应过程化的mysql_fetch_row($result)
  
  
  
  
  1. class mysqli_result {  
  2. mixed fetch_row ( void ) 
  •  成员方法fetch_assoc(),返回关联数组。对应过程化的mysql_fetch_assoc($result)
  
  
  
  
  1. class mysqli_result {  
  2. array fetch_assoc ( void ) 
  • 成员方法fetch_array(),返回索引和关联数组。对应过程化的mysql_fetch_array($result)
  
  
  
  
  1. class mysqli_result {  
  2. mixed fetch_array ( [int resulttype] ) 
  • 成员方法fetch_object(),将一条记录以对象的形式返回。对应过程化的mysql_fetch_object($result)
  
  
  
  
  1. class mysqli_result {  
  2. object fetch_object ( [string class_name [, array params]] ) 

     这些函数,每次从结果集中取1条记录(如果到了末尾则返回FALSE),并将指针移动到下一条。

  • 使用成员方法data_seek(int offset)设定指针(数值范围:0...num_rows-1)
  
  
  
  
  1. class mysqli_result {  
  2. bool data_seek ( int offset ) 

 

--处理字段信息(表的内容为记录,表头为字段)

  • 获取结果集中的一个字段fetch_field(void)
  
  
  
  
  1. class mysqli_result { 
  2. object fetch_field ( void ) 

    返回一个对象,对象的成员属性包含各字段的信息(名字(可能是别名),原名,所属表名,表原名,默认值,结果中的最长元素,字段的宽度,字符集,flags,数据类型,decimals)

    每次从结果集中取1个字段(如果到了最后一个后面,则返回FALSE),并将指针移动到下一条。

  • 使用成员方法field_seek(int fieldnr)设定指针(数组范围:0..field_count-1
  
  
  
  
  1. class mysqli_result {  
  2. bool field_seek ( int fieldnr ) 

 

--释放结果集

  • 使用成员方法close(void),free(void),free_result(void)释放结果集所占的内存。
  
  
  
  
  1. class mysqli_result {  
  2. void free ( void ) 
  3. void close ( void ) 
  4. void free_result ( void ) 

  

--获取结果集中行数

    依靠成员属性num_rows

  
  
  
  
  1. class mysqli_result {  
  2. int num_rows 

 

--获取结果集中的列数(注意:指的不是表中的字段,是结果集)

    依靠成员属性field_count

  
  
  
  
  1. class mysqli_result { 
  2. int field_count

 

 

 

--------------------事务处理---------------------

--事务的含义

事务是确保数据库一致的一种机制,是一个或多个一系列的SQL操作,这多个操作被看做是一件事,其中有任何一个操作出错都将整个事务撤销,所有操作成功,才提交。

 

--哪种存储引擎支持事务处理

目前只有InnoDB、BDB表类型支持事务处理。(默认使用的MyISAM表类型并不支持事务处理)

 

--自动提交

新创建的表(不管哪种类型)都是自动提交(autocommit)的,所谓自动提交是指写完一条语句回车后,自动执行。

 

--回滚的准备工作

如果要执行回滚,需要关闭自动提交,然后开启事务处理,下面回滚的准备步骤:

  • 关闭自动提交。

         SQL中:使用SQL的DCL语句set autocommit=0;

  
  
  
  
  1. set autocommit=0; 

         PHP中:使用mysqli类的成员方法autocommit(0)表示关闭,autocommit(1)表示开启。

  
  
  
  
  1. class mysqli {  
  2. bool autocommit ( bool mode ) 
  • 开启事务处理(mysqli默认开启了事务处理,PDO默认没开启事务处理)

         SQL中:使用SQL的DCL语句start transaction;

  
  
  
  
  1. start transaction

         PHP中:PHP5中,默认是开启的。 

 

--回滚的使用

开启回滚功能后,如果事务执行出错,可执行回滚命令。

         SQL中:使用SQL的DCL语句rollback;

  
  
  
  
  1. rollback

         PHP中:使用mysqli类的成员方法rollback()回滚。

  
  
  
  
  1. class mysqli {  
  2. bool rollback ( void ) 

 

--提交事务

如果事务执行成功,则执行提交命令:

         SQL中:使用SQL的DCL语句commit;

  
  
  
  
  1. commit

         PHP中:使用mysqli类的成员方法commit()提交。

  
  
  
  
  1. class mysqli {  
  2. bool commit ( void ) 

 

--PHP中事务的处理步骤:

1.关闭自动提交。

2.设置一个flag,如果中间出现错误,flag就赋值false。

3.执行每个SQL语句,判断是否执行成功(a.SQL语句本身是否成功,b.是否影响的行数为0),如果失败flag=false。

4.最后判断flag的值,如果为true,则commit;否则rollback。

5.开启自动提交。

 

--开发工具的字符集与数据库的字符集关系

由于SQL语句中可能包含中文,这些文字的字符集是在开发工具中规定的,假如数据库的字符集与它不同,则会出现问题。所以开发工具的字符集要与数据库的字符集一致

 

 

--mysqli_stmt预处理类(推荐使用的类

  • 作用:mysqli,mysqli_result能做的事情,mysqli_stmt都能做。
  • 优点:效率高,对于多次执行的相同语句,只需要在服务器端编译一次,每次只传数据。
  • 安全:由于是只编辑一次,所以后面传的数据都被当做值使用,即使被恶意用户注入SQL语句,也只会被当做值。

 

--mysqli_stmt使用方法

  • 创建mysqli_stmt对象:使用mysqli的方法stmt_init(void)生成mysqli_stmt对象。
  
  
  
  
  1. class mysqli {  
  2. mysqli_stmt stmt_init ( void ) 
  • 准备好一条SQL语句,语句中的值用占位符"?"表示。比如:
  
  
  
  
  1. $sql="insert into shops(name,price,num,desn) values(?,?,?,?)"
  • 发送准备的SQL语句,使用mysqli_stmt对象的方法prepare(string query)。
  
  
  
  
  1. class mysqli_stmt {  
  2. mixed prepare ( string query ) 

 或者用mysqli的prepare(string query)方法替代上面两个语句:

  
  
  
  
  1. class mysqli {   
  2. mysqli_stmt prepare ( string query )  
  3. }  
  •  绑定参数(给每个占位符"?"传值),使用mysqli_stmt的bind_param( string types, mixed &var1 [, mixed &...] )方法。
  
  
  
  
  1. class mysqli_stmt {  
  2. bool bind_param ( string types, mixed &var1 [, mixed &...] ) 
  • 给每个参数赋值。
  • 执行。使用mysqli_stmt的execute(void)方法。
  
  
  
  
  1. class mysqli_stmt {  
  2. bool execute ( void ) 
  •  关闭stmt所占资源。使用mysqli_stmt的close()方法。

 

--select的使用方法。

  • 准备SQL语句,发送准备的SQL语句。
  • 绑定参数,给每个参数赋值。
  • 绑定结果集。使用mysqli_stmt的bind_result( mixed &var1 [, mixed &...] )方法。
  
  
  
  
  1. class mysqli_stmt { 
  2. bool bind_result ( mixed &var1 [, mixed &...] ) 
  • 执行。

   ----获取记录----

  • (如果是取多行)使用store_result(void),一次性取得所有满足条件的记录,放在客户端缓冲区。
  
  
  
  
  1. class mysqli_stmt {  
  2. bool store_result ( void ) 
  • 取值。使用mysqli_stmt的fetch(void)方法。fetch每次只取1行,把取到的值赋给bind_result方法的各个参数。
  
  
  
  
  1. class mysqli_stmt {  
  2. bool fetch ( void ) 

    fetch()每次取1条记录,取完最后1条记录后再去取,返回NULL。如果没有执行store_result则从服务器取,否则从客户端缓冲区取。

  • (如果存储了结果集)需要释放结果集。使用mysqli_stmt的free_result(void)方法。
  
  
  
  
  1. class mysqli_stmt {  
  2. void free_result ( void ) 

   ----获取字段----

    获取各字段信息,使用mysqli_stmt的result_metadata(void)方法。

  
  
  
  
  1. class mysqli_stmt {  
  2. mysqli_result result_metadata ( void ) 
  • 关闭stmt所占资源。

 

你可能感兴趣的:(PHP,数据库)