用 PHP 扩展 mysqli 连接数据库

最后更新:
阅读次数:

mysqli 是 PHP 操作 MySQL 的一个扩展,它提供了比原生的 mysql 扩展更强大的功能。详细比较请看这里(mysqli Overview)。

下面只总结了一些入门级或常用的函数,全部的函数请参考:MySQLi 扩展功能概述

创建一个数据库连接

  • 下面的 $mysqli 代表了 PHP 与数据库的一次连接,它有很多相关的方法或属性
$mysqli = new mysqli($host, $name, $password[, $dbname[, $port]]);
// $host 主机名,在主机名前面加上 'p:' 可建立持久化连接
// $user MySQL 的用户名
// $password 密码
// $dbname 默认连接的数据库名
// $port 主机端口
  • 持久化连接背后的思想是客户端进程和数据库之间的连接可以通过一个客户端进程来保持重用, 而不是多次的创建和销毁。这降低了每次需要创建一个新连接的开销,未使用的连接被缓存起来并且准备随时被重用。

$mysqli 的常用属性

  • $mysqli->client_info: 返回字符串类型的 Mysql 客户端版本信息

  • $mysqli->server_info: 返回字符串类型的 Mysql 服务端版本的信息

  • $mysqli->connect_error: 返回一个字符串,描述了最后一次连接调用的错误代码

  • $mysqli->error: 返回字符串,描述了最近一次函数调用产生的错误代码

  • $mysqli->host_info: 返回一个能够代表使用的连接类型的字符串

print_r($conn->host_info);  // localhost via TCP/IP

$mysqli 的常用方法

  • 字符集相关
    • bool $mysqli->set_charset($charset): 设置数据库连接的默认字符集
    • string $mysqli->character_set_name(): 返回数据库连接的默认字符集
print_r($mysqli->character_set_name());  // latin1
$mysqli->set_charset("utf8");
print_r($mysqli->character_set_name()); // utf8
  • 单语句查询

    • mixed $mysqli->query($sql): 在数据库上执行一个查询(失败时返回 FALSE,通过 mysqli_query() 成功执行 SELECT, SHOW, DESCRIBE 或 EXPLAIN 查询会返回一个 mysqli_result 对象,其他查询则返回 TRUE)
  • 多语句查询

    • bool $mysqli->multi_query($sql): 在数据库上执行多语句查询,查询成功则返回 true,否则返回 false
    • $mysqli->store_result(): 返回多语句查询的一个结果集对象(mysqli_result 对象)(默认为第一个查询的结果集,然后通过 $mysqli->next_result() 方法返回第二个,以此类推)
    • bool $mysqli->more_results(): 检查一个多语句查询是否还有其他查询结果集
    • bool $mysqli->next_result(): 从 multi_query 中准备下一个结果集
$sql = "SELECT * FROM lostthings WHERE category='钱包';
SELECT title,description FROM lostthings WHERE lost_time LIKE '%03-04%';
SELECT * FROM lostthings WHERE category='电子设备' ORDER BY lost_time DESC;";

if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
print_r($result->fetch_all());

$result->free();
}
if ($mysqli->more_results()) {
echo '<br/><br/>';
}
} while ($mysqli->more_results() and $mysqli->next_result());
}
  • 预处理语句: 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高
    • mysqli_stmt $mysqli->prepare(string$query): 准备一条预处理语句,成功返回一个状态对象,否则返回 false
$sql = "INSERT INTO $table_name(name, age) VALUES(?, ?)";

if ($preSql = $conn->prepare($sql)) {
$preSql->bind_param("si", $name, $age);
} else {
die("出错: ". $conn->error);
}

// 设置参数并执行
$name = "张 三";
$age = 33;
if ($preSql->execute()) {
echo "execute success~<br/>";
} else {
echo "出错: ". $conn->error."<br>";
}

$name = "李四";
$age = 44;
$preSql->execute();

$name = "王五";
$age = 55;
$preSql->execute();


// 解除绑定
$preSql->close();
  • 事务处理

    • bool $mysqli->autocommit(bool$mode): 打开或关闭本次数据库连接的自动提交事务模式
    • bool $mysqli->rollback(): 回滚当前事务
    • bool $mysqli->commit(): 提交一个事务
  • 数据库相关

    • bool $mysqli->select_db(string$dbname): 选择用于数据库查询的默认数据库
    • bool $mysqli->close(): 关闭先前打开的数据库连接

mysqli_result 类

一个从数据库查询中获取的结果集是 mysqli_result 类的一个实例。

  • mixed $mysqli_result->fetch_all(): 抓取所有的结果行,并且以数值索引的关联数组返回
  • array $mysqli_result->fetch_assoc(): 以一个关联数组方式抓取一行结果
  • void $mysqli_result->free(): 释放与结果集相关联的内存

mysqli_stmt 类

一个预处理语句是 mysqli_stmt 类的一个实例。

  • bool mysqli_stmt->bind_result(string $types ,mixed &$var1 [,mixed &$… ]): 将变量作为参数绑定到 prepared 语句上
  • bool $mysqli_stmt->execute(): 执行一个 prepared 语句
  • bool $mysqli_stmt->close(): 关闭一个 prepared 语句

一个简单的模板

下面是 PHP 利用 mysqli 操作 MySQL 数据库的一个简单例子,可以被当作模板,方便以后直接套用。

<?php
$servername = "localhost";
$username = "root";
$password = "";
$db_name = "percy";
$table_name = "lostthings";

// 创建与数据库系统的连接
$mysqli = new mysqli($servername, $username, $password);

// 检测连接
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
} else {
echo "连接数据库系统成功~<br>";
}

// 选择指定的数据库进行操作
if ($mysqli->select_db($db_name)) {
echo "数据库选择成功~<br>";
} else {
echo "Error: " . $mysqli->error."<br/>";
}

// 设置默认的客户端字符集
$mysqli->set_charset("utf8");

// 执行查询操作
$sql = "SELECT title,description,lost_time FROM $table_name WHERE description LIKE '%王二狗%'";
$result = $mysqli->query($sql);

if ($result->num_rows > 0) {
// 输出每行数据
while ($row = $result->fetch_assoc()) {
echo "<br> title: ". $row["title"]. " <br> description: ". $row["description"]."<br> lost_time: ".$row["lost_time"]."<br>";
}
} else {
echo "0 个结果";
}

// 断开与数据库的连接
$mysqli->close();

?>

最后,安利一片文章:简单 PHP + MySQL 数据库动态网站制作

0.0