在Web开发中,PHP与数据库的结合是实现动态数据交互的核心,PHP通过内置的扩展(如MySQLi、PDO)支持多种数据库,开发者可以根据需求选择合适的方式连接和操作数据库,本文将详细介绍PHP如何添加数据库连接、执行查询、处理结果以及常见问题的解决方法,帮助开发者掌握这一基础且重要的技能。
选择数据库扩展
PHP提供了多种操作数据库的扩展,其中最常用的是MySQLi和PDO,MySQLi(MySQL Improved)是专门为MySQL设计的扩展,支持面向过程和面向对象两种编程风格;而PDO(PHP>建立数据库连接
在PHP中,连接数据库的第一步是获取数据库的连接信息,包括主机名、用户名、密码和数据库名,以MySQLi为例,可以通过以下代码建立连接:
$host = 'localhost';$username = 'root';$password = '';$database = 'test_db';$conn = new mysqli($host, $username, $password, $database);if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);}echo "连接成功";
使用PDO时,连接方式略有不同,需要指定数据源名称(DSN):
$dsn = "mysql:host=localhost;dbname=test_db";$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,];try {$pdo = new PDO($dsn, 'root', '', $options);echo "连接成功";} catch (PDOException $e) {die("连接失败: " . $e->getMessage());}
执行SQL查询
连接成功后,可以通过SQL语句对数据库进行增删改查操作,以MySQLi为例,执行查询的步骤如下:
查询用户表中的所有数据:
$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"] . "
";}} else {echo "0 结果";}
PDO执行查询的方式类似,但使用方法直接执行SQL语句,并通过获取结果:
$stmt = $pdo->query("SELECT id, name, email FROM users");while ($row = $stmt->fetch()) {echo "ID: " . $row["id"] . " Name: " . $row["name"] . "
";}
插入、更新和删除数据
除了查询,PHP还可以执行插入、更新和删除操作,以MySQLi为例,插入数据的代码如下:
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");$stmt->bind_param("ss", $name, $email);$name = "John Doe";$email = "john@example.com";$stmt->execute();echo "新记录插入成功";$stmt->close();
PDO的插入操作类似,但使用命名占位符更直观:
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");$stmt->execute(['name' => 'John Doe','email' => 'john@example.com']);echo "新记录插入成功";
处理事务
事务是确保数据库操作原子性的重要机制,在转账操作中,需要同时更新两个账户的余额,如果其中一个操作失败,整个事务应回滚,在PHP中,可以通过
beginTransaction()
、和
rollback()
方法实现事务控制:
$conn->begin_transaction();try {$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使用方法,PDO则设置为:
// MySQLi$conn->close();// PDO$pdo = null;
常见问题与优化
在实际开发中,可能会遇到连接超时、查询性能低下等问题,优化建议包括:使用连接池减少连接开销、避免在循环中执行查询、合理使用索引等,始终对用户输入进行过滤和验证,防止SQL注入攻击。
Q1: PHP如何防止SQL注入?
A1: 使用预处理语句(如MySQLi的和
bind_param()
,或PDO的预处理)是最有效的方法,预处理语句将SQL语句和数据分开处理,避免恶意代码被解释为SQL命令,还可以使用
htmlspecialchars()
过滤输出内容。
Q2: 为什么PDO比MySQLi更受欢迎? A2: PDO的优势在于其跨数据库兼容性,支持多种数据库(如MySQL、PostgreSQL、SQLite等),而MySQLi仅支持MySQL,PDO支持命名占位符(如),代码可读性更高,且默认启用异常模式,错误处理更灵活。














发表评论