MySQLi扩展的使用

1.连接数据库

MySQLi扩展为PHP与数据库的连接提供了mysqli_connect()函数,其声明方式如下。

  1. mysqli mysqli_connect(
  2. string $host = ini_get('mysqli.default_host'), //主机名或IP
  3. string $username = ini_get('mysqli.default_user'), //用户名
  4. string $passwd = ini_get('mysqli.default_pw'), //密码
  5. string $dbname = '', //数据库名
  6. int $port = ini_get('mysqli.default_port'), //端口号
  7. string $socket = ini_get('mysqli.default_socket') //socket通信
  8. )

上述语法中,mysqli_connect()函数共有6个可选参数,当省略参数时,将自动使用php.ini中配置的默认值。连接成功时,该函数返回一个表示数据库连接的对象;连接失败时,函数返回false,并提示Warning级错误信息。其中,参数$socket表示mysql.sock文件路径(用于Linux环境),通常不需要手动设置。

示例:

  1. <?php
  2. $link = mysqli_connect('localhost','root','root','test','3306'); //连接数据库
  3. echo $link ? '连接数据库成功' : '连接数据库失败'; //查看连接数据库是否正确
  4. ?>

上述代码表示连接的MySQL服务器主机为“localhost”,用户为“root”,密码为“root”,选择的数据库为“test”,端口号为3306。其中,在数据库连接时,若服务器的端口号为3306,则可以省略此参数的传递。

接下来在浏览器中运行此文件,成功时返回“连接数据库成功”的提示;但若将密码修改为“abc”则会出现下图所示的连接失败提示。

  1. Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES) in C:\Environment\phpstudy\WWW\study\php\test.php on line 2
  2. 连接数据库失败

值得一提的是,在使用MySQL命令行工具操作数据库时,需要使用“SET NAMES”设置字符集,同样也需要在PHP中设置字符集,具体代码如下。

  1. //连接数据库
  2. $link = mysqli_connect('localhost','root','123456');
  3. //设置字符集
  4. mysqli_set_charset($link,'utf8');

上述代码通过mysqli_set_charset()函数将字符集设置为“utf8”。

注意:只有保持PHP脚本文件、Web服务器返回的编码、网页的标记、PHP访问MySQL使用的字符集都统一时,才能避免出现中文乱码问题。

2.执行SQL语句

完成PHP与MySQL服务器的连接后,就可以通过SQL语句操作数据库了。在MySQLi扩展中,通常使用mysqli_query()函数发送SQL语句,获取执行结果,函数的声明方式如下。

  1. mixed mysqli_query(
  2. mysqli $link, //数据库连接
  3. string $query, //SQL语句
  4. int $resultmode = MYSQLI_STORE_RESULT //结果集模式(可选)
  5. )

在上述声明中,7.PHP操作Mysql数据库 - 图1%E5%87%BD%E6%95%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%EF%BC%8C#card=math&code=link%E8%A1%A8%E7%A4%BA%E9%80%9A%E8%BF%87mysqli_connect%28%29%E5%87%BD%E6%95%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%EF%BC%8C)query表示SQL语句。当函数执行SELECT、SHOW、DESCRIBE或EXPLAIN查询时,返回值是查询结果集,而对于其他查询,执行成功返回true,否则返回false。此外,可选参数$resultmode表示结果集模式,其值可以是以下两种常量。

  • MYSQLI_STORE_RESULT模式:会将结果集全部读取到PHP端。
  • MYSQLI_USE_RESULT模式:仅初始化结果集检索,在处理结果集时进行数据读取。

示例:

  1. <?php
  2. //连接数据库库
  3. $link = mysqli_connect('localhost','root','root','test','3306');
  4. mysqli_set_charset($link,'utf8');
  5. echo $link ? '连接数据库成功' : '连接数据库失败';
  6. mysqli_query($link,'USE `test`');
  7. $result = mysqli_query($link,'SHOW TABLES');
  8. if (!$result) {
  9. exit('错误信息:').mysqli_error($link);
  10. }
  11. ?>

从示例的第6行代码可知,PHP通过mysqli_query()函数也可以实现数据库的选择。第7行用于查询当前数据库test中已有的数据表;第8行代码用于对获取的结果集进行判断,若$result的值为false,说明SQL执行失败,然后在第9行调用mysqli_error()函数获取错误信息。

3.处理结果集

由于函数mysqli_query()在执行SELECT、SHOW、EXPLAIN或DESCRIBE的SQL语句后,返回的是一个资源类型的结果集,因此,需要使用函数从结果集中获取信息。MySQLi扩展中常用的处理结果集的函数如下图所示。

函数名 描述
mysqli_num_rows() 获取结果中行的数量
mysqli_fetch_all() 获取所有结果,并以数组方式返回
mysqli_fetch_array() 获取一行结果,并以数据方式返回
mysqli_fetch_assoc() 获取一行结果并以关联数组返回
mysqli_fetch_row() 获取一行结果并以索引数组

在该表中,函数mysqli_fetch_all()和函数mysqli_fetch_array()的返回值,都支持关联数组和索引数组两种形式,它们的第1个参数表示结果集,第2个参数是可选参数,用于设置返回的数组形式,其值是一个常量,具体形式如下所示。

  • MYSQLI_ASSOC:表示返回的结果是一个关联数组。
  • MYSQLI_NUM:表示返回的结果是一个索引数组。
  • MYSQLI_BOTH:表示返回的结果中包含关联和索引数组,该常量为默认值。

示例如下:

  1. <?php
  2. //连接数据库,设置字符集
  3. $link = mysqli_connect('localhost','root','root','test','3306');
  4. mysqli_set_charset($link,'utf8');
  5. //获取查询结果集
  6. $result = mysqli_query($link,'select * from `info`');
  7. //依次查询一行记录
  8. echo '<table><tr><th>学号</th><th>姓名id</th><th>性别</th></tr>';
  9. while ($row = mysqli_fetch_assoc($result)) {
  10. echo '<tr><td>'.$row['学号'].'</td>';
  11. echo '<td>'.$row['姓名'].'</td>';
  12. echo '<td>'.$row['性别'].'</td></tr>';
  13. }
  14. echo '</table>';
  15. ?>

上述示例第9~13行代码中,mysqli_fetch_assoc()函数每次获取结果集中的一行,与while循环配合使用,可以将结果集中的数据全部取出来,直到该函数返回false,跳出while循环。最终显示效果如下图所示。

7.PHP操作Mysql数据库 - 图2

另外,当需要一次查询一行记录时,还可以使用mysqli_fetch_row()函数或mysqli_fetch_array()函数来实现,它们与mysqli_fetch_assoc()函数的用法类似。