一尘不染

PDO连接字符串:最好的方法是什么?

sql

我想使用php /
pdo制作一个后端应用程序。我发现了很多不同的方法来进行PDO连接字符串。我想知道,使用pdo做连接字符串的最佳方法是什么。这是做连接字符串的最佳方法还是我应该使用其他一些代码。欢迎任何建议或调整!

这是我目前所拥有的:

<?php

$host = "localhost";
$db = "phpcrud";
$username = "root";
$password = "";

$conn = new PDO("mysql:host=$host;dbname=$db;charset=UTF8", $username, $password, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
]);

?>

阅读 172

收藏
2021-03-10

共1个答案

一尘不染

这个问题并不像看起来那么容易。我写了一个规范的示例,
如何使用PDO连接到MySQL

因此,让我们看一下可以改进的地方:

  • 可以将charset设置为 utf8mb4 (现在它是MySQL的推荐标准,因为它支持完整的UTF-8字符集,而utf8只是一个有限的子集)
  • *最好关闭 *仿真模式 (为了方便起见,有人会说更好的安全性)
  • 连接错误 是更好地被捕获并重新抛出,以隐藏堆栈跟踪数据库的凭据-为更好的安全性
  • PDO类名称最好以全局 名称空间 作为前缀,因此代码将能够在名称空间环境中工作。

因此,您在这里:

$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
     $pdo = new \PDO($dsn, $username, $password, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

请注意,如果将此代码放在函数或类的方法中,请勿将数据库凭据作为原始参数发送,而应将它们作为数组发送或在函数内部检索它们。否则,它们将再次出现在堆栈跟踪中。

2021-03-10