MySQLi扩展的使用
1.连接数据库
MySQLi扩展为PHP与数据库的连接提供了mysqli_connect()函数,其声明方式如下。
mysqli mysqli_connect(string $host = ini_get('mysqli.default_host'), //主机名或IPstring $username = ini_get('mysqli.default_user'), //用户名string $passwd = ini_get('mysqli.default_pw'), //密码string $dbname = '', //数据库名int $port = ini_get('mysqli.default_port'), //端口号string $socket = ini_get('mysqli.default_socket') //socket通信)
上述语法中,mysqli_connect()函数共有6个可选参数,当省略参数时,将自动使用php.ini中配置的默认值。连接成功时,该函数返回一个表示数据库连接的对象;连接失败时,函数返回false,并提示Warning级错误信息。其中,参数$socket表示mysql.sock文件路径(用于Linux环境),通常不需要手动设置。
示例:
<?php$link = mysqli_connect('localhost','root','root','test','3306'); //连接数据库echo $link ? '连接数据库成功' : '连接数据库失败'; //查看连接数据库是否正确?>
上述代码表示连接的MySQL服务器主机为“localhost”,用户为“root”,密码为“root”,选择的数据库为“test”,端口号为3306。其中,在数据库连接时,若服务器的端口号为3306,则可以省略此参数的传递。
接下来在浏览器中运行此文件,成功时返回“连接数据库成功”的提示;但若将密码修改为“abc”则会出现下图所示的连接失败提示。
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连接数据库失败
值得一提的是,在使用MySQL命令行工具操作数据库时,需要使用“SET NAMES”设置字符集,同样也需要在PHP中设置字符集,具体代码如下。
//连接数据库$link = mysqli_connect('localhost','root','123456');//设置字符集mysqli_set_charset($link,'utf8');
上述代码通过mysqli_set_charset()函数将字符集设置为“utf8”。
注意:只有保持PHP脚本文件、Web服务器返回的编码、网页的标记、PHP访问MySQL使用的字符集都统一时,才能避免出现中文乱码问题。
2.执行SQL语句
完成PHP与MySQL服务器的连接后,就可以通过SQL语句操作数据库了。在MySQLi扩展中,通常使用mysqli_query()函数发送SQL语句,获取执行结果,函数的声明方式如下。
mixed mysqli_query(mysqli $link, //数据库连接string $query, //SQL语句int $resultmode = MYSQLI_STORE_RESULT //结果集模式(可选))
在上述声明中,%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模式:仅初始化结果集检索,在处理结果集时进行数据读取。
示例:
<?php//连接数据库库$link = mysqli_connect('localhost','root','root','test','3306');mysqli_set_charset($link,'utf8');echo $link ? '连接数据库成功' : '连接数据库失败';mysqli_query($link,'USE `test`');$result = mysqli_query($link,'SHOW TABLES');if (!$result) {exit('错误信息:').mysqli_error($link);}?>
从示例的第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:表示返回的结果中包含关联和索引数组,该常量为默认值。
示例如下:
<?php//连接数据库,设置字符集$link = mysqli_connect('localhost','root','root','test','3306');mysqli_set_charset($link,'utf8');//获取查询结果集$result = mysqli_query($link,'select * from `info`');//依次查询一行记录echo '<table><tr><th>学号</th><th>姓名id</th><th>性别</th></tr>';while ($row = mysqli_fetch_assoc($result)) {echo '<tr><td>'.$row['学号'].'</td>';echo '<td>'.$row['姓名'].'</td>';echo '<td>'.$row['性别'].'</td></tr>';}echo '</table>';?>
上述示例第9~13行代码中,mysqli_fetch_assoc()函数每次获取结果集中的一行,与while循环配合使用,可以将结果集中的数据全部取出来,直到该函数返回false,跳出while循环。最终显示效果如下图所示。

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