自学PHP,这几天学到了连接数据库,干脆把MySQLI的API全过一遍吧!
MySQLI
代表PHP和Mysql数据库之间的一个连接。
1.mysqli::affected_rows :
返回影响到数据表的行数
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,数据就不会存入到数据表中;如果加了带星号的那行代码,则不上面事务做任何处理
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 :
等同于上一个的功能;
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。
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
用来一次执行多条语句的函数
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 从指定的文件中读取选项,而不是使用 my.cnf 中的选项 |
| MYSQLI_READ_DEFAULT_GROUP 从 my.cnf 或者 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 |
---------------------------------------------------------------------------------------------------------------
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)语句中。
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()。
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]);
?>//这样会报错
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 服务器端设置字符集。 更多信息请参考 字符集。
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值
select_db("mysql");
$sql="select * from t_member";;
$re=$con->real_query($sql);
var_dump($re);
?>
34.mysqli::refresh
刷新
35.mysqli::rollback
回退当前事务
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(综合错误)表示。
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
获取当前系统状态信息
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(调用)的对象
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
指向取得的结果集中的第一个字段,然后每次循环依次往后值
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
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(两者都有)
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,指针指向下一行
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
从结果集中取得行,然后释放结果内存
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
获取结果集长度,在不需要转换成数组的情况下
select_db("mysql");
$sql="select * from t_member";//注意每一条语句都以分号结尾
$res=$con->query($sql);
echo $res->num_rows;
?>