PHP连接MySQL推荐使用mysqli或PDO,其中PDO因数据库抽象层、预处理语句防SQL注入、异常处理等优势更适用于新项目;通过正确配置DSN、用户名、密码及错误处理可实现安全连接,并利用预处理和最小权限原则提升安全性。

PHP连接MySQL数据库的核心,在于利用PHP内置的数据库扩展,比如历史悠久的mysql(已废弃)、主流的mysqli(MySQL Improved Extension),以及更具通用性的PDO(PHP Data Objects)。它们提供了一套API,让你的PHP代码能像与人对话一样,和MySQL服务器进行通信,发送指令(SQL查询)、接收数据,完成增删改查这些基本操作。理解它们的工作原理和最佳实践,是构建任何动态网站的基础。
连接MySQL数据库,我们主要推荐使用mysqli或PDO。坦白说,如果你的项目只针对MySQL,mysqli用起来也挺顺手;但如果未来可能需要切换到其他数据库类型,或者追求更统一、更现代的编程范式,PDO无疑是更好的选择。
使用mysqli扩展连接数据库(面向对象风格)
这种方式更符合现代PHP的编程习惯,代码也相对清晰。
立即学习“PHP免费学习笔记(深入)”;
<?php
$servername = "localhost"; // 数据库服务器地址,通常是localhost
$username = "your_username"; // 数据库用户名
$password = "your_password"; // 数据库密码
$dbname = "your_database"; // 要连接的数据库名称
$port = 3306; // MySQL默认端口,如果不是默认端口需要指定
// 创建新的mysqli连接实例
$conn = new mysqli($servername, $username, $password, $dbname, $port);
// 检查连接是否成功
if ($conn->connect_error) {
// 哎呀,连接失败了!这里通常会记录错误,而不是直接显示给用户
die("连接失败: " . $conn->connect_error);
}
// 设置字符集,这很重要,避免中文乱码问题
$conn->set_charset("utf8mb4");
echo "数据库连接成功!<br>";
// 接下来就可以执行SQL查询了
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);
if ($result) {
if ($result->num_rows > 0) {
// 输出每行数据
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
}
} else {
echo "0 结果";
}
// 释放结果集
$result->free();
} else {
echo "查询执行失败: " . $conn->error;
}
// 完成所有操作后,关闭连接,释放资源
$conn->close();
?>使用PDO扩展连接数据库
PDO提供了一个统一的接口来访问各种数据库,它的优势在于其抽象层和更强大的预处理语句支持。
<?php
$dsn = "mysql:host=localhost;dbname=your_database;charset=utf8mb4;port=3306";
$username = "your_username";
$password = "your_password";
try {
// 创建PDO实例
$pdo = new PDO($dsn, $username, $password);
// 设置PDO的错误模式为异常,这样可以更好地捕获和处理错误
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 设置默认的fetch模式,例如关联数组
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo "数据库连接成功 (PDO)!<br>";
// 执行一个简单的查询
$stmt = $pdo->query("SELECT id, name, email FROM users");
$users = $stmt->fetchAll(); // 获取所有结果
if ($users) {
foreach ($users as $row) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
}
} else {
echo "0 结果";
}
} catch (PDOException $e) {
// 捕获连接或查询过程中可能发生的PDO异常
die("连接失败或查询错误: " . $e->getMessage());
}
// PDO连接在脚本结束时会自动关闭,也可以显式地设置为null
$pdo = null;
?>连接数据库时,遇到错误简直是家常便饭,别慌,这很正常。我个人在开发中,也经常因为一些小细节卡住。常见的错误大概有这么几种:
"Access denied for user 'xxx'@'localhost' (using password: YES/NO)":这个错误最常见,它直接告诉你用户名或密码不对,或者这个用户没有权限从当前主机连接。
$username和$password,是不是和MySQL数据库里设置的一模一样。localhost(或者你PHP应用所在的主机IP)连接。GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'localhost' IDENTIFIED BY 'your_password'; 类似这样的命令可以授权。"Unknown database 'your_database'":很明显,你PHP代码里指定的数据库名在MySQL服务器上不存在。
$dbname变量是否拼写正确。SHOW DATABASES;命令确认数据库确实存在。"Can't connect to MySQL server on 'localhost' (10061)" 或 "Connection refused":这通常意味着PHP无法和MySQL服务器建立网络连接。
sudo systemctl status mysql或sudo service mysql status,Windows上在服务管理器里看。$servername是正确的IP或域名,$port(如果指定了)也是MySQL监听的端口。127.0.0.1,如果你的PHP应用不在同一台机器上,或者通过其他网络接口访问,就需要配置MySQL监听0.0.0.0或特定的IP。检查MySQL配置文件(my.cnf或my.ini)中的bind-address。"Call to undefined function mysqli_connect()" 或 "could not find driver" (PDO):这意味着PHP缺少必要的数据库扩展。
php.ini文件。找到extension=mysqli或extension=pdo_mysql这一行,确保它们没有被注释掉(前面没有分号;)。php.ini后,记得重启你的Web服务器(Apache/Nginx)和PHP-FPM服务。phpinfo()函数,搜索mysqli或PDO,看它们是否已启用。排查这些问题,我的经验是,错误信息本身就是最好的线索。仔细阅读它,它往往直接指出了问题所在。然后,从最基本的服务状态、配置开始检查,一步步缩小范围。
PDO和mysqli都是PHP连接MySQL的有效方式,但我个人更倾向于在大多数新项目中推荐使用PDO。它确实有一些非常显著的优势:
PDO的优势:
PDO::ERRMODE_EXCEPTION。这意味着当数据库操作出错时,PDO会抛出PDOException异常,你可以用标准的try-catch块来捕获和处理这些错误,让代码结构更清晰、更健壮。:name, :email),这在处理复杂查询或有大量参数时,比位置参数(?)更具可读性。何时选择PDO而非mysqli?
坦白讲,对于大多数新的PHP项目,我都会推荐使用PDO。除非你的项目已经大量依赖mysqli,或者只是一个非常简单的、明确不会扩展到其他数据库的脚本,否则PDO带来的长期收益远大于初期学习成本。
数据库安全,尤其是防止SQL注入,是任何Web开发人员都必须掌握的技能。我见过太多因为SQL注入导致数据泄露的案例,所以这方面绝对不能掉以轻心。
使用预处理语句(Prepared Statements):
?或命名参数如:name)代替实际的数据值。数据库服务器会预先编译这个查询模板。然后,你再将实际的数据值作为参数发送给服务器。数据库会将这些值安全地绑定到查询中,而不会将它们解释为SQL代码的一部分。$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // "ss"表示两个参数都是字符串类型
$stmt->execute();
$stmt->close();$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->execute();
// 或者更简洁地:
// $stmt->execute([':name' => $name, ':email' => $email]);最小权限原则(Principle of Least Privilege):
GRANT ALL PRIVILEGES或者ROOT权限。输入验证和过滤(Input Validation and Filtering):
is_numeric()或filter_var($input, FILTER_VALIDATE_INT)来验证。htmlspecialchars()),防止XSS攻击,这虽然不是直接防SQL注入,但也是Web安全的重要一环。错误信息控制:
使用强密码:
保持软件更新:
避免动态拼接SQL语句:
做到这些,你的PHP数据库连接安全性就能大大提升。记住,安全是一个持续的过程,没有一劳永逸的解决方案,需要时刻保持警惕。
以上就是PHP数据库怎么连接_PHP连接MySQL数据库方法与实例的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号