2026-06-01 18:05:58
在PHP中连接MySQL数据库,可通过mysqli或PDO实现,两者各有优势,选择取决于项目需求。以下是具体实现方法及注意事项:
一、使用mysqli连接MySQLmysqli是专门为MySQL设计的扩展,提供面向对象和面向过程两种API风格。
1. 面向对象风格<?php$servername = "localhost";$username = "username";$password = "password";$database = "database_name";// 创建连接$conn = new mysqli($servername, $username, $password, $database);// 检测连接if ($conn->connect_error) { die("连接失败: " . $conn->connect_error);}echo "连接成功";// 执行查询$sql = "SELECT id, firstname, lastname FROM Users";$result = $conn->query($sql);if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; }} else { echo "0 结果";}$conn->close();?>2. 面向过程风格<?php$servername = "localhost";$username = "username";$password = "password";$database = "database_name";// 创建连接$conn = mysqli_connect($servername, $username, $password, $database);// 检测连接if (!$conn) { die("连接失败: " . mysqli_connect_error());}echo "连接成功";// 执行查询$sql = "SELECT id, firstname, lastname 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["firstname"]. " " . $row["lastname"]. "<br>"; }} else { echo "0 结果";}mysqli_close($conn);?>二、使用PDO连接MySQLPDO提供统一的接口访问多种数据库,适合需要数据库迁移的场景。
<?php$servername = "localhost";$username = "username";$password = "password";$database = "database_name";try { $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "连接成功"; $sql = "SELECT id, firstname, lastname FROM Users"; $stmt = $conn->prepare($sql); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach($stmt->fetchAll() as $row) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; }} catch(PDOException $e) { echo "连接失败: " . $e->getMessage();}$conn = null;?>三、mysqli与PDO的选择建议选择mysqli:
项目仅使用MySQL数据库。
需要更高的性能(mysqli针对MySQL优化)。
偏好面向对象或面向过程的API风格。
选择PDO:
项目可能切换到其他数据库(如PostgreSQL、SQLite)。
需要统一的数据库访问接口。
希望代码更具可移植性。
检查数据库凭据是否正确。
确认localhost或IP地址是否正确。
确保数据库已创建。
检查数据库用户是否有访问权限。
排查步骤:
使用预处理语句:
mysqli(面向对象):$stmt = $conn->prepare("SELECT id FROM Users WHERE firstname = ?");$stmt->bind_param("s", $firstname);$firstname = $_POST['firstname'];$stmt->execute();
PDO:$stmt = $conn->prepare("SELECT id FROM Users WHERE firstname = :firstname");$stmt->bindParam(':firstname', $firstname);$firstname = $_POST['firstname'];$stmt->execute();
转义用户输入(不推荐,仅作为备选):
mysqli:$firstname = mysqli_real_escape_string($conn, $_POST['firstname']);
PDO:$firstname = $conn->quote($_POST['firstname']);
最小权限原则:
数据库用户仅授予必要权限,避免使用root。
mysqli:在php.ini中设置mysqli.allow_persistent = On。
PDO:在DSN中添加persistent=true。
在循环外建立连接,循环内执行查询。
为频繁查询的列创建索引。
使用EXPLAIN分析查询性能。
通过以上方法,可高效、安全地实现PHP与MySQL的连接,并根据项目需求选择合适的扩展。