100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > PHP面向对象操作数据库--MySQLI类

PHP面向对象操作数据库--MySQLI类

时间:2019-09-17 06:19:55

相关推荐

PHP面向对象操作数据库--MySQLI类

自学PHP,这几天学到了连接数据库,干脆把MySQLI的API全过一遍吧!

MySQLI

代表PHP和Mysql数据库之间的一个连接。

1.mysqli::affected_rows :

返回影响到数据表的行数

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$sql="insert into t_member values('马六','maliu')";$con->query($sql);echo $con->affected_rows;?>

2.mysqli::autocommit :

查看 MySQL 客户端的事务提交方式命令:select @@autocommit;

修改 MySQL 客户端的事务提交方式为手动提交命令:set @@autocommit = 0;

关闭自动提交的原因,事务作为一个独立处理最小单元,往往需要处理一系列连续的数据操作,这些操作被视为一个整体,需要同时成功或同时失败,而不能其中某个操作成功;比如:A汇款给B,B接收到歀;即 A的账户扣款,而B的账户增加;必须同时成功或同时失败;如果成功则commit否则整体回滚;只对局部(当前命令行窗口)有效;若全局有效得修改文件;

下面代码如果不加带星号那行代码,则数据不会插入到表中,但会存在缓存里,然后select会从缓存里取结果,结果里会含有刚刚存入缓存里的数据,但是没有插入到表中。如果程序结束而没有commit,数据就不会存入到数据表中;如果加了带星号的那行代码,则不上面事务做任何处理

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$con->autocommit(false);$sql="insert into t_member values('wewwwwww','aliu')";$con->query($sql);* $con->rollback();$sql="select * from t_member";$result=$con->query($sql);while($row=$result->fetch_row()){print_r($row);}?>

3.mysqli::begin_transaction :

等同于上一个的功能;

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$con->begin_transaction();$sql="insert into t_member values('b','aliu')";$con->query($sql);$con->commit();//此处不可改为autocommit(true),这就是说$con->begin_transaction()不等于将autocommit()的值设为false?>

4.mysqli::change_user;

改变当前所连接的数据库

$con->change_user("root","123456","sys");//转到了sys数据库

5.mysqli::character_set_name :

返回当前数据库连接的默认字符编码

6.mysqli::close :

$con->close();不需要参数,过程化如mysqli_close()需要参数

7.mysqli::commit()

提交事务

8.mysqli::$connect_errno

返回连接数据库时的错误代码

9.mysqli::$connect_errno

返回连接数据库时的错误字符串,即描述信息

10.mysqli::__construct

mysqli的构造函数,当new mysqli的构造函数,当new对象的时候,自动调用

11.mysqli::errno

返回最近函数调用的错误代码,$con->errno 注意没有括号

12.mysqli::$error_list

返回最近函数调用的一系列错误信息,包含错误代码,sqlstate,错误描述,以数组返回,可以利用print_r输出

13.mysqli::$error

返回最近函数调用的错误描述信息

14.mysqli_$field_count

返回最近查询的列数,注意是列数

15.mysqli::get_charset

得到一个含有指定字符集的对象,可以用var_dump()来输出这个对象,因为不是数组所以不能用print_r

16.mysqli::$client_info

获取MySQL客户端信息

17.mysqli::$client_version

作为一个整数返回MySQL客户端的版本

18.mysqli::get_connection_stats

返回客户端连接的统计数据,数组形式

19.mysqli::$host_info

返回一个表述使用的连接类型的字符串

20.mysqli::$protocol_version

返回MySQL使用的协议版本号

21.mysqli::init

初始化 MySQLi 并返回一个资源类型的值,这个值可以作为 mysqli_real_connect() 函数的传入参数,mysqli::real_connect()不需要这种资源类型的值

22.mysqli::$insert_id

函数返回最后一个 SQL 语句(通常是 INSERT 语句) 所操作的表中设置为 AUTO_INCREMENT 的列的值。 如果最后一个 SQL 语句不是 INSERT 或者 UPDATE 语句, 或者所操作的表中没有设置为 AUTO_INCREMENT 的列, 返回值为 0。

Note:

如果在所执行的 INSERT 或者 UPDATE 语句中使用了数据库函数 LAST_INSERT_ID()。 有可能会影响 mysqli_insert_id() 函数的返回值。

23.mysqli::kill

本函数可以用来让服务器杀掉 processid 参数指定的 线程 ID。数据库连接对应的线程 ID 可以通过 调用 mysqli::$thread_id 得到。如果仅仅想中止某个查询,请使用这个 SQL 语句: KILL QUERY processid。

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$id=$con->thread_id;$con->kill($id);$sql="select * from t_member where name='b'";$ree=$con->query($sql);?>

24.mysqli::multi_query

用来一次执行多条语句的函数

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member where name='b';";//注意每一条语句都以分号结尾$sql.="select * from t_member where name='c'";/* 批量执行查询 */if ($con->multi_query($sql)) { //判断此函数执行是否成功do {/* store first result set */if ($result = $con->store_result()) { //用来获取多条查询结果中的第一条查询的结果,这个结果非数组和query得到的是一样的 所以还得用mysqli_result中的方法while ($row = $result->fetch_row()) { //用fetch_row来得到结果集中的第一行,虽然只有一行printf("%s\n", $row[0]);}}/* print divider */if ($con->more_results()) {printf("-----------------\n");}} while (@$con->next_result());//为读取下一个结果集作准备}?>

25.mysqli::more_results

检查批量查询中是否还有查询结果

26.mysqli::next_result

mysqli::multi_query() 函数执行之后, 为读取下一个结果集做准备, 然后可以使用 mysqli::store_result() 或 mysqli::use_result() 函数读取下一个结果集。

27.mysqli::options

设置一个连接的扩展选项,这些选项可以改变这个连接的行为。

如果要对多个选项进行设置,可以多次调用此函数来。

mysqli::options() 需要在 mysqli::init() 函数之后、 mysqli::real_connect() 函数之前被调用。

---------------------------------------------------------------------------------------------------------------

| MYSQLI_OPT_CONNECT_TIMEOUT 连接超时设置,以秒为单位(在 Windows 平台上,PHP 5.3.1 之后才支持此选项)。 |

| MYSQLI_OPT_LOCAL_INFILE 启用或禁用 LOAD LOCAL INFILE 语句|

| MYSQLI_INIT_COMMAND 成功建立 MySQL 连接之后要执行的 SQL 语句 |

| MYSQLI_READ_DEFAULT_FILE 从指定的文件中读取选项,而不是使用 f 中的选项 |

| MYSQLI_READ_DEFAULT_GROUP 从 f 或者 MYSQL_READ_DEFAULT_FILE 指定的文件中 读取指定的组中的选项。 |

| MYSQLI_SERVER_PUBLIC_KEY SHA-256 认证模式下,要使用的 RSA 公钥文件。 |

| MYSQLI_OPT_NET_CMD_BUFFER_SIZE 内部命令/网络缓冲大小, 仅在 mysqlnd 驱动下有效。 |

| MYSQLI_OPT_NET_READ_BUFFER_SIZE 以字节为单位,读取 MySQL 命令报文时候的块大小, 仅在 mysqlnd 驱动下有效 |

| MYSQLI_OPT_INT_AND_FLOAT_NATIVE 将整数和浮点数类型的列转换成 PHP 的数值类型, 仅在 mysqlnd 驱动下有效 |

| MYSQLI_OPT_SSL_VERIFY_SERVER_CERT |

---------------------------------------------------------------------------------------------------------------

<?php$mysqli = mysqli_init();if (!$mysqli) {die('mysqli_init failed');}if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {die('Setting MYSQLI_INIT_COMMAND failed');}if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');}if (!$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db')) {die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());}echo 'Success... ' . $mysqli->host_info . "\n";$mysqli->close();?>

28.mysqli::ping

检查到服务器的连接是否还正常。

在启用 mysqli.reconnect 选项的前提下, 如果连接已经断开, ping 操作会尝试重新建立连接。

Note: mysqlnd 驱动会忽略 php.ini 中的 mysqli.reconnect 选项, 所以它不会自动重连。

客户端建立连接之后,长时间处于闲置状态, 可以用此函数来检查服务器是否关闭了这个连接, 如有必要,将会自动重新建立到服务器的连接。

29.mysqli::prepare ( string $query )

做好执行 SQL 语句的准备,返回一个语句句柄,可以对这个句柄进行后续的操作。 这里仅仅支持单一的 SQL 语句,不支持多 SQL 语句。

在执行语句之前,需要使用 mysqli_stmt::bind_param() 函数 对占位符参数进行绑定。 同样,在获取结果之前,必须使用 mysqli_stmt::bind_result() 函数对返回的列值进行绑定。

SQL 语句中可以包含一个或者多个问号(?) 表示语句的参数。

SQL 语句中,仅允许在特定的位置出现问号参数占位符。 例如,在 INSERT 语句中的 VALUES() 子句中可以使用参数占位符,来表示对应列的值。也可以在 WHERE 字句中使用参数来表示 要进行比较的值。

但是,并不是所有的地方都允许使用参数占位符, 例如对于表名、列名这样的 SQL 语句中的标识位置, 就不可以使用参数占位。 SELECT 语句中的列名就不可以使用参数。 另外,对于 = 这样的逻辑比较操作也不可以在两侧都使用参数, 否则服务器在解析 SQL 的时候就不知道该如何检测参数类型了。 也不可以在 NULL 条件中使用问号, 也就是说不可以写成:? IS NULL。 一般而言,参数也只能用在数据操作(DML)语句中, 不可以用在数据定义(DDL)语句中。

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");if($bin=$con->prepare("select * from t_member where name=? and password=?")){//返回一个句柄,必须用一个派一个变量$name1="c";$password1="2";$bin->bind_param("ss",$name1,$password1);//绑定参数,除了第一个参数外不能用直接量,得用变量$bin->execute();//mysqli_stmt中的执行查询,不像Mysqli中的query返回的是一个对象,而是将查询的结果放在mysql服务器,等待fetch逐条来取,然后相应的绑定再bind_result中的各个变量中$bin->bind_result($name,$result);//将查询结果的列值绑定到变量,while($bin->fetch()){//获取查询结果的值printf("%s %s",$name,$result);}$bin->close();// 关于语句对象}?>

使用预处理的好处:

(1)可以通过驱动让服务端缓存查询计划,从而提高查询效率;

(2)可以防止SQL注入,自动转义一些特殊字符.

坏处:

(1)本地到一个连接,以便另一个连接不能再使用

(2)存储函数中不能使用(存储过程是可以的)

(3)有可能会导致“泄漏”如果你忘记释放它

30.mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )

对数据库执行一次查询

其后第二个参数默认为MYSQLI_STORE_RESULT,也可以是MYSQLI_USE _RESULT,他们的区别是 mysql_use_result()的结果必须“一次性用完”,也就是说用它得到一个result后,必须反复用mysql_fetch_row()读取其结果直至该函数返回null为止,否则如果你再次进行mysql查询,会得到“Commands out of sync; you can't run this command now”的错误。 而mysql_store_result()得到result是存下来的,你无需把全部行结果读完,就可以进行另外的查询。比如你进行一个查询,得到一系列记录,再根据这些结果,用一个循环再进行数据库查询,就只能用mysql_store_result()。

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";$re=$con->query($sql,MYSQLI_USE_RESULT);$row=$re->fetch_row();printf("%s %s",$row[0],$row[1]);$sql="select * from t_member";$re=$con->query($sql,MYSQLI_USE_RESULT);$row=$re->fetch_row();printf("%s %s",$row[0],$row[1]);?>//这样会报错<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";$re=$con->query($sql);while($row=$re->fetch_row()){printf("%s %s",$row[0],$row[1]);}?>//这样则不会

31.mysqli::real_connect

建立一个 MySQL 服务器连接

32.mysqli::real_escape_string

根据当前连接的字符集,对于 SQL 语句中的特殊字符进行转义

此函数用来对字符串中的特殊字符进行转义, 以使得这个字符串是一个合法的 SQL 语句。 传入的字符串会根据当前连接的字符集进行转义,得到一个编码后的合法的 SQL 语句。

在调用 mysqli_real_escape_string() 函数之前, 必须先通过调用 mysqli_set_charset() 函数或者在 MySQL 服务器端设置字符集。 更多信息请参考 字符集。

<?php// 假定数据库用户名:root,密码:123456,数据库:RUNOOB$con=mysqli_connect("localhost","root","123456","mysql");if (mysqli_connect_errno($con)){echo "连接 MySQL 失败: " . mysqli_connect_error();}$newname="菜鸟'";// 没有转义 $newname 中特殊字符,执行失败//mysqli_query($con,"INSERT into websites2 (name,password) VALUES ('$newname','$newname')");// 转义特殊字符$con->real_escape_string($newname);// 转义后插入,执行成功$re=$con->query("INSERT into websites2 (name,password) VALUES ('$newname','$newname')");if(!$re){echo $con->error;}mysqli_close($con);?>

33.mysqli::real_query

执行一个mysql查询

返回值是bool值

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";;$re=$con->real_query($sql);var_dump($re); ?>

34.mysqli::refresh

刷新

35.mysqli::rollback

回退当前事务

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$con->autocommit(false);$sql="insert into t_member values('m','m')";$con->query($sql);$con->rollback();$con->autocommit(true);$con->close(); ?>

36.mysqli::select_db

选择用于数据库查询的默认数据库

37.mysqli::set_charset

这应该是首选的用于改变字符编码的方法,不建议使用mysqli_query()执行SQL请求的SET NAMES ...(如 SET NAMES utf8)。

38.mysqli::$sqlstate

返回一个包含 SQLSTATE 错误码的字符串,表示上一次 SQL 操作的错误。 错误码是由 5 个字符构成,'00000' 表示没有发生错误。 需要注意的是,并不是所有的 MySQL 错误都映射到 SQLSTATE 了, 未映射的错误消息使用 HY000(综合错误)表示。

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$sql="CREATE TABLE City (ID INT, Name VARCHAR(30))";$re=$con->query($sql);if(!$re){printf("%s",$con->error);}if(!$re){printf("%s",$con->sqlstate);}$con->close(); ?>

39.mysqli::set_local_infile_default

取消用户指定的回调函数

40.mysqli_set_local_infile_handler

设置 LOAD DATA LOCAL INFILE 命令的回调函数

41.mysqli::stat

获取当前系统状态信息

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$sql="CREATE TABLE City (ID INT, Name VARCHAR(30))";$re=$con->query($sql);printf("%s",$con->stat());$con->close(); ?>

输出:Uptime: 105949 Threads: 1 Questions: 11908 Slow queries: 0 Opens: 723 Flush tables: 1 Open tables: 608 Queries per second avg: 0.112

42.mysqli::stmt_init

初始化一条语句并返回一个用于mysqli_stmt::prepare(调用)的对象

<?php$con=new MySQLi("localhost","root","123456");$con->select_db("mysql");$con->stmt_init();$sql="select * from t_member";$pre=$con->prepare($sql);$pre->execute();$pre->bind_result($name,$result);while($row=$pre->fetch()){printf("%s %s",$name,$result);}?>

43.mysqli::store_result

select语句查询之后的结果是出于缓存区的,转移上一次查询返回的结果集

如果上一查询并不产生结果集(例如,执行了一个 INSERT 语句), 那么 mysqli_store_result() 会返回 FALSE。 如果读取结果集失败了,也会返回 FALSE。 如何区分是上面哪种情况导致此函数的调用返回了 FALSE? 你可以通过下面的方法来检测: mysqli_error() 返回了非空的字符串, mysqli_errno() 返回了非零值, 或者 mysqli_field_count() 返回了非零值, 都表示发生错误了。 还有一种可能的情况会导致此函数的调用返回 FALSE:上一次查询 mysqli_query() 本身是成功的, 但是由于返回的结果集太大,无法为其分配足够的内存来进行结果集转移。 如果 mysqli_field_count() 函数返回了一个非零值,那么表示 SQL 语句产生了一个非空的结果集。

执行查询之后, 使用 mysqli_free_result() 函数来释放结果集所占用的内存, 是一个很有用的实战经验。 尤其是当使用 mysqli_store_result() 函数来转移数量较大的结果集的时候, 释放结果集内存的操作尤为重要。

44.mysqli::$thread_id

返回当前连接的线程 ID

线程 ID 是每次连接都重新分配的,也就是说它和连接是紧密相关的, 如果某个连接异常断开了,然后重新建立了到数据库的连接, 这个线程 ID 就不再是原来的那个了,它会发生变化。可以通过执行 SQL 语句:KILL QUERY processid 来杀掉对应连接上正在执行的 SQL 语句。

45.mysqli::thread_safe

返回是否是线程安全的,如果是的话,返回TRUE,否则返回FALSE。

46.mysqli::$warning_count

返回最近一次连接所出现的警告条数

MySQLI::result

代表从一个数据库查询中获取的结果集。

1.mysqli_result::fetch_field

从结果集中取得列信息并作为对象返回。自动指向下一个字段

被返回的对象的属性为:

name - 列名

table - 该列所在的表名

max_length - 该列最大长度

not_null - 1,如果该列不能为 NULL

primary_key - 1,如果该列是 primary key

unique_key - 1,如果该列是 unique key

multiple_key - 1,如果该列是 non-unique key

numeric - 1,如果该列是 numeric

blob - 1,如果该列是 BLOB

type - 该列的类型

unsigned - 1,如果该列是无符号数

zerofill - 1,如果该列是 zero-filled

2.mysqli_result::current_field

指向取得的结果集中的第一个字段,然后每次循环依次往后值

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";$res=$con->query($sql);while($col=$res->fetch_field()){$current=$res->current_field;printf("col:%d\n", $current);printf("Name:%s\n", $col->name);printf("Table: %s\n", $col->table);printf("max. Len: %d\n", $col->max_length);printf("Flags: %d\n", $col->flags);printf("Type:%d\n\n", $col->type);}?>

3.mysqli_result::data_seek

将取得的结果集中的指针指向指定的行数,一开始是0

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";//注意每一条语句都以分号结尾$res=$con->query($sql);$res->data_seek(2);//此处就是将指针指向第2+1行$re=$res->fetch_row();printf("%s %s",$re[0],$re[1]);?>

4.mysqli_result::fetch_all([ int $resulttype = MYSQLI_NUM ])

将结果集转换成数组,参数resulttype有MYSQLI_ASSOC(键值对应不包含数字角标值对应),MYSQLI_NUM(数字角标值对应不包含键值对应),MYSQLI_BOTH(两者都有)

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";//注意每一条语句都以分号结尾$res=$con->query($sql);/*$post=$res->fetch_all( MYSQLI_BOTH);print_r($post);结果:Array ([0] => Array ( [0] => b [name] => b [1] => 5 [password] => 5 )[1] => Array ( [0] => c [name] => c [1] => 2 [password] => 2 )[2] => Array ( [0] => j [name] => j [1] => 2 [password] => 2 )[3] => Array ( [0] => m [name] => m [1] => m [password] => m )[4] => Array ( [0] => n [name] => n [1] => m [password] => m ))*//*$post=$res->fetch_all( MYSQLI_ASSOC);print_r($post);结果:Array ([0] => Array ( [name] => b [password] => 5 )[1] => Array ( [name] => c [password] => 2 )[2] => Array ( [name] => j [password] => 2 )[3] => Array ( [name] => m [password] => m )[4] => Array ( [name] => n [password] => m ))*//*$post=$res->fetch_all( MYSQLI_NUM);print_r($post);结果:Array ([0] => Array ( [0] => b [1] => 5 )[1] => Array ( [0] => c [1] => 2 )[2] => Array ( [0] => j [1] => 2 )[3] => Array ( [0] => m [1] => m )[4] => Array ( [0] => n [1] => m ))*/?>

5.mysqli_result::fetch_array

从结果集中取得一行,作为数组,类型为BOTH,指针指向下一行

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";//注意每一条语句都以分号结尾$res=$con->query($sql);while($row=$res->fetch_array()){printf("%s %s",$row[0],$row[1]);}?>

6.mysqli_result::fetch_assoc

从结果集中取得一行作为关联数组(键值数组即BOTH中非array的那一半),指针指向下一行

7.mysqli_result::fetch_fields

返回结果集中每一行的字段信息,以数组返回;

8.mysqli_result::fetch_object

将结果集的一行作为对象返回

9.mysqli_result::fetch_row

从结果集中取得一行作为关联数组(键值数组即BOTH中非关联数组的那一半),指针指向下一行

10.mysqli_result::$field_count

获取结果中的字段数

11.mysqli_result::free_result

从结果集中取得行,然后释放结果内存

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";//注意每一条语句都以分号结尾$res=$con->query($sql);while($array=$res->fetch_row()){print_r($array); }$res->free_result(); //注意不是$array?>

12.mysqli_result::$num_rows

获取结果集长度,在不需要转换成数组的情况下

<?php$con=new mysqli("localhost","root","123456");$con->select_db("mysql");$sql="select * from t_member";//注意每一条语句都以分号结尾$res=$con->query($sql);echo $res->num_rows;?>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。