我必须在数据库类中创建getConnection函数。该函数应使用 PDO 对象连接到数据库并返回它。我有这样的东西:
class Database {
public function getConnection() {
$result = new PDO('mysql:host=localhost;dbname=demo', 'root', '');
return $result;
}
}
正确吗?如何知道是否已连接到数据库?
如果连接尝试失败,PDO将引发异常,因此您可以像这样规范化:
class Database {
private $_conn = null;
public function getConnection() {
if (!is_null($this->_conn)) {
return $this->_conn
}
$this->_conn = false;
try {
$this->_conn = new PDO('mysql:host=localhost;dbname=demo', 'root', '');
} catch(PDOException $e) { }
return $this->_conn;
}
}
$db = new Database();
$conn = $db->getConnection();
if (!$conn) {
die("Error connecting to the database");
}
$conn->whatever();
如何知道是否已连接到数据库?
如果出现连接错误,PDO将引发异常。
正确吗?
不,这不是一个好主意,因为该方法被称为getConnection
而实际上它创建了一个连接。public
属性要求在应用程序代码中调用它,从而产生来自同一脚本的多个连接。
此外,您应该始终在异常模式下设置 PDO。您还应该在DSN中设置字符集。
取决于此函数的建议用途,代码可能是
protected function connect()
{
$pdo = new PDO('mysql:host=localhost;dbname=demo;charset=utf8', 'root', '');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
return $pdo;
}
如果它打算在构造函数中仅使用一次。
而对于getConnection()
函数,您必须使用静态变量 ho 保存 PDO 的单个实例。
最近,我花时间在文章"您的第一个数据库包装器的儿童疾病"中编译了数据库包装器的所有常见错误。您可能会发现此阅读非常有用。