--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
--选择当前数据库
- $lnk = mysql_connect('localhost', 'mysql_user', 'mysql_password')
- or die ('Not connected : ' . mysql_error());
- // make foo the current db
- mysql_select_db('foo', $lnk) or die ('Can\'t use foo : ' . mysql_error());
--执行SQL语句
link_identifier
,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。注意: 查询字符串不用以分号结束。
--MySQL错误提示
--关闭连接
link_identifier
,则关闭上一个打开的连接。通常不需要使用 mysql_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
--获取自动增长的ID号
link_identifier
中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier
,则使用上一个打开的连接。 注意:函数 LAST_INSERT_ID() 总是保存着最新产生的 AUTO_INCREMENT 值,并且不会在查询语句之间被重置。
--获取影响的行数
link_identifier
关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。
--处理结果集的步骤(结果集$result来自mysql_query($query,$link))
1.确定取的行数,列数,从哪开始取。
row_number
从 0 开始数。row_number
的取值范围应该从 0 到 mysql_num_rows - 1。2.从结果集中将记录取出。
这些函数,每次从结果集中取1条记录(如果到了末尾则返回FALSE),并将指针移动到下一条。
3.从结果集中将字段信息取出。
result
必须是一个合法的结果标识符,field_index
是该字段的数字偏移量。 注意: field_index
从 0 开始。例如,第三个字段的索引值其实是 2,第四个字段的索引值是 3,以此类推。
4.释放结果集
result
所关联的内存。
--和URL有关的处理函数
注意:本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。
- $url = 'http://username:password@hostname/path?arg=value#anchor';
- print_r(parse_url($url));
- 将输出:
- Array
- (
- [scheme] => http
- [host] => hostname
- [user] => username
- [pass] => password
- [path] => /path
- [query] => arg=value
- [fragment] => anchor
- ) //
query
- 在问号 ? 之后 ,fragment
- 在散列符号 # 之后
- $str = "first=value&arr[]=foo+bar&arr[]=baz";
- parse_str($str);
- echo $first; // value
- echo $arr[0]; // foo bar
- echo $arr[1]; // baz
- parse_str($str, $output);
- echo $output['first']; // value
- echo $output['arr'][0]; // foo bar
- echo $output['arr'][1]; // baz
formdata
可以是数组或包含属性的对象。一个 formdata
数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix
参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。
- $data = array('foo'=>'bar',
- 'baz'=>'boom',
- 'cow'=>'milk',
- 'php'=>'hypertext processor');
- echo http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor
--mysqli
从PHP5开始使用,是一种面向对象技术。
与mysql扩展模块比较:功能增强了,效率提高了,更稳定了。因此通常人们大多使用mysqli扩展模块。
给我们提供了3个类:
前面2个类可以完成mysql所有的功能。
mysqli也支持过程化的编程方式,而且比mysql扩展包更高效,更稳定。
-------------------------mysqli类--------------------------
--mysqli类
--mysqli中连接MySQL,选择数据库
mysqli连接数据库的方法:创建一个mysqli对象,在构造函数中连接MySQL。
- class mysqli {
- __construct ( [string host [, string username [, string passwd [, string dbname [, int port [, string socket]]]]]] )
- }
在参数dbname中可以设置数据库名称,因此创建对象时,不仅连接了MySQL,而且选择了数据库。如果要在后面改变选择的数据库,可以用select_db方法:
- class mysqli {
- bool select_db ( string dbname )
- }
如何检查连接是否成功:使用过程化的函数(这个不是成员方法)mysqli_connect_errno:
- if(mysqli_connect_errno())
- {
- echo '连接数据库失败'.mysqli_connect_error();
- mysqli = null;
- exit;
- }//mysqli_connect_error函数返回一个字符串,描述了连接错误的原因。
此外,还可以选择mysqli_init(),options(),real_connect()方式创建对象,连接MySQL,选择数据库。
--执行SQL语句
- class mysqli {
- mixed query ( string query [, int resultmode] )
- }
SQL语句有两种:
.非SELECT语句中,插入,删除,更新语句会改变记录,成员属性affected_rows记录了影响到的记录行数。(只对执行单条SQL语句有效)
- class mysqli {
- int affected_rows
- }
.获取自动增长的ID,使用成员属性insert_id记录自动增长的ID,此值必须在INSERT操作后才可获取(注意:即使清空表后,再插入新的记录,该字段仍然会接着以前的值继续增加。)
- class mysqli {
- int insert_id
- }
--执行多条SQL语句
- class mysqli {
- bool multi_query ( string query )
- }
query里包含多条SQL语句,各条语句间用";"分开。
SQL语句有两种:
使用成员函数store_result(void)获得结果集,返回mysqli_result类的对象:
- class mysqli {
- mysqli_result store_result ( void )
- }
执行store_result(void)只能获得第1个结果集,如果想获得更多结果集,需要执行next_result(void)调整指针,再执行store_result(void)
- class mysqli {
- bool next_result ( void )
- }
如果还有结果集,返回TRUE;如果已经取过最后1个结果集,返回FALSE。
--获取一些信息
- class mysqli {
- string character_set_name ( void )
- }
返回一个字符串,描述当前数据库的字符集。
- class mysqli{
- string mysqli_get_client_info ( void )
- }
返回一个字符串,描述MySQL客户端的信息。
- class mysqli {
- string host_info(void)
- }
返回一个字符串,描述MySQL服务器的主机信息(ip地址,使用的传输层协议)。
- class mysqli {
- string server_info(void)
- }
返回一个字符串,描述MySQL服务器的信息。
--MySQL错误提示
mysqli用成员属性errno,error记录各成员函数执行过程中的错误号,错误描述。
- class mysqli {
- int errno
- }
- class mysqli {
- string error
- }
--关闭连接
- class mysqli {
- bool close ( void )
- }
-------------------------mysqli_result类--------------------------
--mysqli_result类
使用SELECT语句后,用mysqli_result类处理结果集以及获取一些信息。有两种处理:
--处理记录
- class mysqli_result {
- mixed fetch_row ( void )
- }
- class mysqli_result {
- array fetch_assoc ( void )
- }
- class mysqli_result {
- mixed fetch_array ( [int resulttype] )
- }
- class mysqli_result {
- object fetch_object ( [string class_name [, array params]] )
- }
这些函数,每次从结果集中取1条记录(如果到了末尾则返回FALSE),并将指针移动到下一条。
- class mysqli_result {
- bool data_seek ( int offset )
- }
--处理字段信息(表的内容为记录,表头为字段)
- class mysqli_result {
- object fetch_field ( void )
- }
返回一个对象,对象的成员属性包含各字段的信息(名字(可能是别名),原名,所属表名,表原名,默认值,结果中的最长元素,字段的宽度,字符集,flags,数据类型,decimals)
每次从结果集中取1个字段(如果到了最后一个后面,则返回FALSE),并将指针移动到下一条。
- class mysqli_result {
- bool field_seek ( int fieldnr )
- }
--释放结果集
- class mysqli_result {
- void free ( void )
- void close ( void )
- void free_result ( void )
- }
--获取结果集中行数
依靠成员属性num_rows:
- class mysqli_result {
- int num_rows
- }
--获取结果集中的列数(注意:指的不是表中的字段,是结果集)
依靠成员属性field_count:
- class mysqli_result {
- int field_count
- }
--------------------事务处理---------------------
--事务的含义
事务是确保数据库一致的一种机制,是一个或多个一系列的SQL操作,这多个操作被看做是一件事,其中有任何一个操作出错,都将整个事务撤销,所有操作成功,才提交。
--哪种存储引擎支持事务处理
目前只有InnoDB、BDB表类型支持事务处理。(默认使用的MyISAM表类型并不支持事务处理)
--自动提交
新创建的表(不管哪种类型)都是自动提交(autocommit)的,所谓自动提交是指写完一条语句回车后,自动执行。
--回滚的准备工作
如果要执行回滚,需要关闭自动提交,然后开启事务处理,下面回滚的准备步骤:
SQL中:使用SQL的DCL语句set autocommit=0;
- set autocommit=0;
PHP中:使用mysqli类的成员方法autocommit(0)表示关闭,autocommit(1)表示开启。
- class mysqli {
- bool autocommit ( bool mode )
- }
SQL中:使用SQL的DCL语句start transaction;
- start transaction;
PHP中:PHP5中,默认是开启的。
--回滚的使用
开启回滚功能后,如果事务执行出错,可执行回滚命令。
SQL中:使用SQL的DCL语句rollback;
- rollback;
PHP中:使用mysqli类的成员方法rollback()回滚。
- class mysqli {
- bool rollback ( void )
- }
--提交事务
如果事务执行成功,则执行提交命令:
SQL中:使用SQL的DCL语句commit;
- commit;
PHP中:使用mysqli类的成员方法commit()提交。
- class mysqli {
- 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_stmt使用方法
- class mysqli {
- mysqli_stmt stmt_init ( void )
- }
- $sql="insert into shops(name,price,num,desn) values(?,?,?,?)";
- class mysqli_stmt {
- mixed prepare ( string query )
- }
或者用mysqli的prepare(string query)方法替代上面两个语句:
- class mysqli {
- mysqli_stmt prepare ( string query )
- }
- class mysqli_stmt {
- bool bind_param ( string types, mixed &var1 [, mixed &...] )
- }
- class mysqli_stmt {
- bool execute ( void )
- }
--select的使用方法。
- class mysqli_stmt {
- bool bind_result ( mixed &var1 [, mixed &...] )
- }
----获取记录----
- class mysqli_stmt {
- bool store_result ( void )
- }
- class mysqli_stmt {
- bool fetch ( void )
- }
fetch()每次取1条记录,取完最后1条记录后再去取,返回NULL。如果没有执行store_result则从服务器取,否则从客户端缓冲区取。
- class mysqli_stmt {
- void free_result ( void )
- }
----获取字段----
获取各字段信息,使用mysqli_stmt的result_metadata(void)方法。
- class mysqli_stmt {
- mysqli_result result_metadata ( void )
- }