综述
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 的面向对象编程方式和面向过程方式 面向对象方式
<?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();?>
面向过程方式
<?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. 连接数据库并获取相关信息
<?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. 查询数据
<?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
在这里需要注意的是
这个方法,参数有三个,分别是 MYSQLI_BOTH,MYSQLI_NUM,MYSQLI_ASSOC。 如果参数传入了 MYSQLI_BOTH,返回数组的索引既包括数字和名称。
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,返回数组的索引只包含数字。
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,返回数组的索引只包含名称。
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. 插入数据
<?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. 修改内容
<?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. 预处理语句
<?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 手册。 希望对大家有帮助!