综述
1. 什么是 mysqli
PHP-MySQL 函数库是 PHP 操作 MySQL 资料库最原始的扩展库,PHP-MySQLi 的 i 代表 Improvement ,相当于前者的增强版,也包含了相对进阶的功能,另外本身也增加了安全性,比如可以大幅度减少 SQL 注入等问题的发生。
2. mysql 与 mysqli 的概念相关
(1)mysql 与 mysqli 都是 php 方面的函数集,与 mysql 数据库关联不大。 (2)在 php5 版本之前,一般是用 php 的 mysql 函数去驱动 mysql 数据库的,比如 mysql_query () 的函数,属于面向过程 (3)在 php5 版本以后,增加了 mysqli 的函数功能,某种意义上讲,它是 mysql 系统函数的增强版,更稳定更高效更安全,与 mysql_query () 对应的有 mysqli_query (),属于面向对象,用对象的方式操作驱动 mysql 数据库
3. mysql 与 mysqli 的主要区别
(1)mysql 是非持继连接函数,mysql 每次链接都会打开一个连接的进程,所以 mysqli 耗费资源少一些。 (2)mysqli 是永远连接函数,mysqli 多次运行 mysqli 将使用同一连接进程,从而减少了服务器的开销。mysqli 封装了诸如事务等一些高级操作,同时封装了 DB 操作过程中的很多可用的方法。 (3)mysqli 提供了面向对象编程方式和面向过程编程方式,而 mysql 则只可以面向过程。 例如如下代码分别是 mysqli 的面向对象编程方式和面向过程方式 面向对象方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }
printf("Host information: %s\n", $mysqli->host_info);
/* close connection */ $mysqli->close(); ?>
|
面向过程方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<?php $link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */ if (!$link) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }
printf("Host information: %s\n", mysqli_get_host_info($link));
/* close connection */ mysqli_close($link); ?>
|
(4)mysqli 可以通过预处理语句来减少开销和 SQL 注入的风险,而 mysql 则做不到。 综上所述,如果大家用的是 PHP5,而且 mysql 版本在 5.0 以上,希望大家以后能用 mysqli 的就尽量使用 mqsqli,不仅高效,而且更安全,而且推荐大家使用面向对象编程方式。 在这里,我们也只介绍面向对象编程方式。
函数使用
1. 连接数据库并获取相关信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<?php $mysqli=@new mysqli("localhost", "root", "", "mysql"); if(mysqli_connect_errno()){ echo "连接数据库失败:".mysqli_connect_error(); $mysqli=null; exit; } echo $mysqli->character_set_name()."<br>"; echo $mysqli->get_client_info()."<br>"; echo $mysqli->host_info."<br>"; echo $mysqli->server_info."<br>"; echo $mysqli->server_version."<br>"; $mysqli->close(); ?>
|
如果连接成功则运行结果
latin1 mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $ localhost via TCP/IP 5.6.12-log 50612
如果连接失败则可能结果为
连接数据库失败:Access denied for user ‘root’@’localhost’ (using password: YES) 连接数据库失败:Unknown database ‘hello’
2. 查询数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<?php $mysqli=@new mysqli("localhost", "root", "", "design"); if(mysqli_connect_errno()){ echo "连接数据库失败:".mysqli_connect_error(); $mysqli=null; exit; } $query = "SELECT * FROM designer order by ID LIMIT 3"; $result = $mysqli->query($query); while($row = $result->fetch_array(MYSQLI_BOTH)){ echo "id".$row['id']."<br>"; } $result->free(); $mysqli->close(); ?>
|
运行结果
1 2 3
|
id10062 id10063 id10064
|
在这里需要注意的是
1
|
fetch_array(MYSQLI_BOTH)
|
这个方法,参数有三个,分别是 MYSQLI_BOTH,MYSQLI_NUM,MYSQLI_ASSOC。 如果参数传入了 MYSQLI_BOTH,返回数组的索引既包括数字和名称。
1 2 3 4 5 6 7 8 9
|
array (size=26) 0 => string '10062' (length=5) 'id' => string '10062' (length=5) 1 => string '??' (length=2) 'name' => string '??' (length=2) 2 => string '1016903103@qq.com' (length=17) 'email' => string '1016903103@qq.com' (length=17) 3 => string '18366119732' (length=11) 'phone' => string '18366119732' (length=11)
|
如果参数传入了 MYSQLI_NUM,返回数组的索引只包含数字。
1 2 3 4 5
|
array (size=13) 0 => string '10062' (length=5) 1 => string '??' (length=2) 2 => string '1016903103@qq.com' (length=17) 3 => string '18366119732' (length=11)
|
如果参数传入了 MYSQLI_BOTH,返回数组的索引只包含名称。
1 2 3 4 5
|
array (size=13) 'id' => string '10062' (length=5) 'name' => string '??' (length=2) 'email' => string '1016903103@qq.com' (length=17) 'phone' => string '18366119732' (length=11)
|
其实还有等价的方法 fetch_row (),fetch_assoc ()
他们之间的关系如下
$result->fetch_row () = mysql_fetch_row () = $result->fetch_array (MYSQLI_NUM) = mysql_fetch_array (MYSQLI_NUM) 返回索引数组
$result->fetch_assoc () = mysql_fetch_assoc () = $result->fetch_array (MYSQLI_ASSOC) = mysql_fetch_array (MYSQLI_ASSOC) 返回索引列名
如果 fetch_array () 方法什么也不传,则默认传入了 MYSQLI_BOTH
3. 插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
<?php $mysqli=@new mysqli("localhost", "root", "", "design"); //如果连接错误 if(mysqli_connect_errno()){ echo "连接数据库失败:".mysqli_connect_error(); $mysqli=null; exit; } //插入数据 $sql="insert into designer(name,phone) values('hello','18352682923')"; //执行插入语句 $result=$mysqli->query($sql); //如果执行错误 if(!$result){ echo "SQL语句有误<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit; } //如果插入成功,则返回影响的行数 echo $mysqli->affected_rows; //关闭数据库连接 $mysqli->close(); ?>
|
如果插入成功,那么结果则会是 1,如果失败,则会报出错误。
4. 修改内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
<?php $mysqli=@new mysqli("localhost", "root", "", "design"); //如果连接错误 if(mysqli_connect_errno()){ echo "连接数据库失败:".mysqli_connect_error(); $mysqli=null; exit; } //插入数据 $sql="update designer set name = 'hello' where id = 10062"; //执行插入语句 $result=$mysqli->query($sql); //如果执行错误 if(!$result){ echo "SQL语句有误<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit; } //如果插入成功,则返回影响的行数 echo $mysqli->affected_rows; //关闭数据库连接 $mysqli->close(); ?>
|
如果修改成功,同样返回被修改的行数。
5. 预处理语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
<?php $mysqli = @new mysqli("localhost", "root", "", "design"); if(mysqli_connect_errno()){ echo "连接数据库失败:".mysqli_connect_error(); $mysqli=null; exit; } $sql = "insert into designer(name, email) values(?, ?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("ss", $name, $email); $name = "Mike"; $email = "mike@live.cn"; $stmt->execute(); $name = "Larry"; $email = "larry@live.cn"; $stmt->execute(); echo "最后ID".$stmt->insert_id."<br>"; echo "影响了".$stmt->affected_rows."行<br>"; $mysqli->close(); ?>
|
通过以上的预处理语句,我们也可以实现数据插入。 那么预处理语句有什么特点呢?
1. 效率上更高, 就是如果执行多次相同的语句,只有语句数据不同, 因为将一条语句在服务器端准备好,然后将不同的值传给服务器,再让这条语句执行。相当于编译一次,使用多次。 2. 安全上:可以防止 SQL 注入(? 占位)这样就可以防止非正常的变量的注入。
所以,推荐大家使用 mysqli 的预处理语句的方式,不仅效率高,而且更加安全。
综述
以上就是对 mysqli 的一些方法的介绍,更加详细的内容,请查看 PHP 手册。 希望对大家有帮助!
文章来源: cuiqingcai.com,作者:崔庆才,版权归原作者所有,如需转载,请联系作者。
原文链接:cuiqingcai.com/1534.html
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)