PHP调用SQL数据库的代码编写是Web开发中的常见任务,通常涉及连接数据库、执行查询、处理结果以及关闭连接等步骤,以下是详细的实现方法和代码示例,涵盖MySQL和MySQLi两种扩展的使用方式。
使用MySQL扩展(已废弃,不推荐)
MySQL扩展是PHP早期提供的数据库操作接口,但由于存在安全性和功能缺陷,自PHP 7.0起已被移除,仅适用于旧项目维护:

<?php
// 1. 连接数据库
$conn = mysql_connect("localhost", "username", "password");
if (!$conn) {
die("连接失败: " . mysql_error());
}
mysql_select_db("database_name", $conn);
// 2. 执行查询
$sql = "SELECT * FROM users";
$result = mysql_query($sql, $conn);
// 3. 处理结果
while ($row = mysql_fetch_assoc($result)) {
echo "ID: " . $row['id'] . " Name: " . $row['name'] . "<br>";
}
// 4. 关闭连接
mysql_close($conn);
?> 使用MySQLi扩展(推荐)
MySQLi(MySQL Improved)是MySQL的增强版,支持面向过程和面向对象两种方式,功能更完善。
面向过程方式
<?php
// 1. 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "database_name");
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 2. 执行查询
$sql = "SELECT id, name FROM users WHERE status = 'active'";
$result = mysqli_query($conn, $sql);
// 3. 处理结果
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}
} else {
echo "0 结果";
}
// 4. 关闭连接
mysqli_close($conn);
?> 面向对象方式
<?php
// 1. 创建连接
$conn = new mysqli("localhost", "username", "password", "database_name");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 2. 执行查询
$sql = "SELECT id, name FROM users";
$result = $conn->query($sql);
// 3. 处理结果
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}
} else {
echo "0 结果";
}
// 4. 关闭连接
$conn->close();
?> 预处理语句(防止SQL注入)
预处理语句是防止SQL注入攻击的关键方法,MySQLi和PDO均支持:

<?php
$conn = new mysqli("localhost", "username", "password", "database_name");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 1. 准备SQL语句
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // "ss"表示两个字符串参数
// 2. 绑定参数并执行
$name = "John Doe";
$email = "john@example.com";
$stmt->execute();
echo "记录插入成功";
$stmt->close();
$conn->close();
?> PDO(PHP Data Objects)扩展
PDO是更通用的数据库抽象层,支持多种数据库(如MySQL、PostgreSQL、SQLite等):
<?php
try {
// 1. 创建PDO连接
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 2. 执行查询
$stmt = $pdo->query("SELECT id, name FROM users");
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 3. 处理结果
foreach ($results as $row) {
echo "ID: " . $row['id'] . " - Name: " . $row['name'] . "<br>";
}
} catch (PDOException $e) {
die("数据库错误: " . $e->getMessage());
}
// 4. 关闭连接(PDO会自动处理)
?> 常见操作对比
| 操作类型 | MySQLi(面向对象) | PDO |
|---|---|---|
| 连接数据库 | $conn = new mysqli(...) | $pdo = new PDO(...) |
| 执行查询 | $conn->query(...) | $pdo->query(...) |
| 获取结果 | $result->fetch_assoc() | $stmt->fetch(PDO::FETCH_ASSOC) |
| 预处理语句 | $stmt->bind_param(...) | $stmt->bindParam(...) |
| 错误处理 | $conn->connect_error | $e->getMessage() |
最佳实践
- 始终使用预处理语句:避免直接拼接SQL字符串,防止SQL注入。
- 关闭连接:虽然PHP脚本结束后会自动释放资源,但显式关闭是良好习惯。
- 错误处理:使用
try-catch或检查返回值,确保代码健壮性。 - 使用PDO:如果项目可能切换数据库类型,PDO是更好的选择。
相关问答FAQs
Q1: PHP中如何防止SQL注入攻击?
A1: 防止SQL注入的最佳方法是使用预处理语句(Prepared Statements),通过分离SQL逻辑和数据,确保用户输入不会被解释为SQL代码,在MySQLi中使用$stmt->bind_param()绑定参数,或在PDO中使用$stmt->bindParam(),对用户输入进行过滤和验证也是必要的辅助措施。

Q2: MySQLi和PDO有什么区别?应该如何选择?
A2: MySQLi是MySQL专用扩展,支持MySQL特有的功能(如多语句执行),而PDO是通用数据库抽象层,支持多种数据库(如MySQL、PostgreSQL、SQLite等),如果项目仅使用MySQL且需要高性能,MySQLi是不错的选择;如果未来可能迁移数据库或需要统一接口,PDO更合适,PDO支持更灵活的预处理语句绑定方式(如命名参数)。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复