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支持更灵活的预处理语句绑定方式(如命名参数)。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复