mysqli_select_db($connection, "db_name")
函数,或通过PDO在连接字符串中直接指定数据库名,确保先建立有效数据库连接再执行操作。在PHP中连接并选择数据库是Web开发的基础操作,正确实现能确保数据交互的安全高效,以下是两种主流方法的详细代码示例和最佳实践:
MySQLi扩展(推荐面向对象方式)
MySQLi支持面向对象和面向过程两种写法,优先推荐面向对象风格。
面向对象写法
<?php $servername = "localhost"; // 数据库服务器地址 $username = "your_username"; // 数据库用户名 $password = "your_password"; // 数据库密码 $dbname = "target_database"; // 目标数据库名 // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "成功连接到数据库: " . $dbname; // 后续SQL操作(示例) $sql = "SELECT id FROM users"; $result = $conn->query($sql); // 关闭连接(非必须,脚本结束自动关闭) $conn->close(); ?>
关键点:
- 通过
new mysqli()
构造函数直接指定数据库名。 connect_error
属性检测连接状态,避免静默失败。- 始终验证连接后再执行查询,防止未定义行为。
面向过程写法
<?php $servername = "localhost"; $username = "your_username"; $password = "your_password"; $dbname = "target_database"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检测连接 if (!$conn) { die("连接失败: " . mysqli_connect_error()); } echo "数据库选择成功"; mysqli_close($conn); // 关闭连接 ?>
PDO扩展(支持多数据库)
PDO提供统一的接口,适合需要兼容多种数据库(如MySQL、PostgreSQL)的项目。
<?php $servername = "localhost"; $username = "your_username"; $password = "your_password"; $dbname = "target_database"; try { // 创建PDO实例并指定数据库 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置错误模式为异常捕获 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "PDO连接数据库成功"; // 示例查询(使用预处理防SQL注入) $stmt = $conn->prepare("SELECT * FROM products WHERE category = :cat"); $stmt->bindValue(':cat', 'electronics'); $stmt->execute(); } catch(PDOException $e) { die("错误: " . $e->getMessage()); // 生产环境应记录日志而非直接输出 } $conn = null; // 关闭连接 ?>
核心优势:
try/catch
异常处理提升健壮性。- 预处理语句(
prepare()
+bindValue()
)彻底防御SQL注入。 - 灵活的
ATTR_ERRMODE
配置简化调试。
关键安全实践
- 禁用明文密码
- 使用环境变量(如
getenv('DB_PASSWORD')
)存储密码,避免代码硬编码。
- 使用环境变量(如
- 错误处理
- 生产环境关闭错误显示:
ini_set('display_errors', 0);
- 记录日志到文件:
error_log("Database error", 3, "/path/to/errors.log");
- 生产环境关闭错误显示:
- 连接复用
通过单例模式或依赖注入管理连接,避免重复创建开销。
选择建议
场景 | 推荐方式 |
---|---|
纯MySQL项目 | MySQLi面向对象 |
多数据库支持需求 | PDO |
遗留系统维护 | MySQLi面向过程 |
官方文档参考:
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/18429.html