PHP使用什么方式操作MySQL?PHP使用mysqli进行数据库交互的技巧
引言
在Web开发中,PHP与MySQL的结合是非常常见的。PHP提供了多种方式来操作MySQL数据库,其中mysqli扩展是一个强大且常用的工具。本文将介绍PHP操作MySQL的方式,并重点讲解使用mysqli进行数据库交互的技巧。
PHP操作MySQL的方式
mysql扩展:这是PHP早期提供的用于操作MySQL的扩展,但已经在PHP 5.5.0中被弃用,并且在PHP 7.0.0中被移除,所以不建议再使用。
mysqli扩展:即MySQL Improved Extension,它是mysql扩展的增强版,提供了更多的功能和更好的性能,支持面向对象和面向过程两种编程风格。
PDO扩展:PHP Data Objects,是PHP的一个数据库抽象层,它提供了一套统一的API来访问不同的数据库,包括MySQL、PostgreSQL、Oracle等。
为什么选择mysqli?
性能更好:mysqli比mysql扩展有更好的性能表现。
支持更多特性:如事务处理、存储过程、预处理语句等。
面向对象和面向过程两种风格:可以根据个人喜好选择编程风格。
更好的安全性:通过预处理语句可以有效防止SQL注入攻击。
mysqli的基本使用
连接数据库
面向对象风格
// 数据库连接参数
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";面向过程风格
// 数据库连接参数
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
echo "连接成功";执行查询
面向对象风格
// SQL查询语句
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出每行数据
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "
";
}
} else {
echo "0 结果";
}面向过程风格
// SQL查询语句
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 输出每行数据
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "
";
}
} else {
echo "0 结果";
}关闭连接
面向对象风格
$conn->close();
面向过程风格
mysqli_close($conn);
mysqli高级技巧
预处理语句
预处理语句可以有效防止SQL注入攻击,并且可以提高性能。
面向对象风格
// 准备预处理语句
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
// 绑定参数
$stmt->bind_param("ss", $name, $email);
// 设置参数并执行
$name = "John Doe";
$email = "john@ippipp.com";
$stmt->execute();
$name = "Jane Doe";
$email = "jane@eippipp.com;
$stmt->execute();
echo "新记录插入成功";
// 关闭预处理语句
$stmt->close();面向过程风格
// 准备预处理语句 $stmt = mysqli_prepare($conn, "INSERT INTO users (name, email) VALUES (?, ?)"); // 绑定参数 mysqli_stmt_bind_param($stmt, "ss", $name, $email); // 设置参数并执行 $name = "John Doe"; $email = "john@ippipp.com"; mysqli_stmt_execute($stmt); $name = "Jane Doe"; $email = "jane@eippipp.com; mysqli_stmt_execute($stmt); echo "新记录插入成功"; // 关闭预处理语句 mysqli_stmt_close($stmt);
事务处理
mysqli支持事务处理,可以确保一组SQL语句要么全部执行成功,要么全部不执行。
面向对象风格
// 开始事务
$conn->begin_transaction();
try {
// 执行SQL语句
$conn->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$conn->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 提交事务
$conn->commit();
echo "事务执行成功";
} catch (Exception $e) {
// 回滚事务
$conn->rollback();
echo "事务执行失败: " . $e->getMessage();
}面向过程风格
// 开始事务
mysqli_begin_transaction($conn);
try {
// 执行SQL语句
mysqli_query($conn, "UPDATE accounts SET balance = balance - 100 WHERE id = 1");
mysqli_query($conn, "UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 提交事务
mysqli_commit($conn);
echo "事务执行成功";
} catch (Exception $e) {
// 回滚事务
mysqli_rollback($conn);
echo "事务执行失败: " . $e->getMessage();
}存储过程
mysqli也支持调用存储过程。
面向对象风格
// 调用存储过程
$stmt = $conn->prepare("CALL GetUserById(?)");
$stmt->bind_param("i", $userId);
$userId = 1;
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row['id'] . ", Name: " . $row['name'];
}
$stmt->close();面向过程风格
// 调用存储过程
$stmt = mysqli_prepare($conn, "CALL GetUserById(?)");
mysqli_stmt_bind_param($stmt, "i", $userId);
$userId = 1;
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row['id'] . ", Name: " . $row['name'];
}
mysqli_stmt_close($stmt);错误处理
在使用mysqli时,良好的错误处理是非常重要的。
面向对象风格
// 开启错误报告
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
// 执行可能出错的代码
$conn = new mysqli("localhost", "wrong_user", "wrong_password", "test");
} catch (mysqli_sql_exception $e) {
// 处理异常
echo "错误: " . $e->getMessage();
}面向过程风格
// 开启错误报告
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
// 执行可能出错的代码
$conn = mysqli_connect("localhost", "wrong_user", "wrong_password", "test");
} catch (mysqli_sql_exception $e) {
// 处理异常
echo "错误: " . $e->getMessage();
}总结
本文介绍了PHP操作MySQL的方式,重点讲解了mysqli扩展的使用方法和技巧。mysqli提供了丰富的功能,如预处理语句、事务处理和存储过程调用等,可以帮助我们更高效、更安全地与MySQL数据库进行交互。在实际开发中,我们可以根据具体需求选择合适的编程风格和功能来实现数据库操作。