MySQL PHP 语法(附带实例)
MySQL 与 PHP 结合使用非常常见,尤其是在开发基于数据库的 web 应用时。PHP 提供了多种方式与 MySQL 交互,主要包括 mysqli 和 PDO。下面我将介绍如何使用这些方式与 MySQL 进行交互,并附带实例。
1. 使用 MySQLi 扩展
MySQLi(MySQL Improved)扩展是 PHP 中用于与 MySQL 数据库进行交互的接口,它支持面向对象和过程化两种风格。
连接数据库
<?php
// 面向过程方式
$connection = mysqli_connect("localhost", "username", "password", "database_name");
if (!$connection) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
// 面向对象方式
$mysqli = new mysqli("localhost", "username", "password", "database_name");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
echo "Connected successfully";
?>
执行查询
- 查询数据:
<?php
$query = "SELECT id, name FROM users";
$result = mysqli_query($connection, $query);
// 面向过程方式
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}
} else {
echo "Error: " . mysqli_error($connection);
}
// 面向对象方式
if ($result = $mysqli->query($query)) {
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}
} else {
echo "Error: " . $mysqli->error;
}
?>
- 插入数据:
<?php
$name = "John Doe";
$query = "INSERT INTO users (name) VALUES ('$name')";
if (mysqli_query($connection, $query)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_error($connection);
}
?>
准备语句
准备语句用于防止 SQL 注入,它将 SQL 查询与数据分开处理。
<?php
$stmt = $mysqli->prepare("INSERT INTO users (name) VALUES (?)");
$stmt->bind_param("s", $name); // "s" stands for string
$name = "Jane Doe";
$stmt->execute();
echo "New record created successfully";
$stmt->close();
?>
关闭连接
<?php
mysqli_close($connection); // 过程化方式
$mysqli->close(); // 面向对象方式
?>
2. 使用 PDO(PHP Data Objects)扩展
PDO 是另一种与 MySQL(以及其他数据库)交互的方式,支持更多的数据库类型,并且提供了更为统一的接口。
连接数据库
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "username", "password");
// 设置 PDO 错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>
执行查询
- 查询数据:
<?php
$stmt = $pdo->query("SELECT id, name FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}
?>
- 插入数据:
<?php
$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (:name)");
$stmt->bindParam(':name', $name);
$name = "John Smith";
$stmt->execute();
echo "New record created successfully";
?>
事务处理
PDO 支持事务,可以用来确保多条 SQL 语句在同一个事务中执行。
<?php
try {
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (name) VALUES ('User 1')");
$pdo->exec("INSERT INTO users (name) VALUES ('User 2')");
$pdo->commit();
echo "Transaction successful";
} catch (Exception $e) {
$pdo->rollBack();
echo "Failed: " . $e->getMessage();
}
?>
关闭连接
PDO 会在脚本结束时自动关闭数据库连接,无需显式关闭。
3. 常见错误处理与调试
- MySQLi 错误处理:
- 过程化方式:
php if (!$result) { echo "Error: " . mysqli_error($connection); } - 面向对象方式:
if (!$result) { echo "Error: " . $mysqli->error; } - PDO 错误处理:可以通过设置
PDO::ATTR_ERRMODE属性来启用异常模式,捕获并处理错误。
try {
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
4. 总结与选择
- MySQLi 适用于只需要与 MySQL 数据库交互的应用程序,支持过程化和面向对象两种风格。
- PDO 是更灵活且可扩展的选项,它支持多种数据库(MySQL、PostgreSQL、SQLite 等),并提供更一致的接口。
选择使用哪种扩展取决于项目的需求、数据库类型以及开发者的个人偏好。