现在,我有点沮丧,我希望有人可以帮助我并指出我正确的方向。
我有一个“旧”项目,它使用mysql语句连接数据库等。
在这个项目中,我有以下内容:
包含
的索引文件*
* load configuration and connect to database
*/
$projectConfiguration = new projectConfiguration();
$dbconnect = $projectConfiguration->connect($projectConfiguration->databaseHost, $projectConfiguration->databaseName, $projectConfiguration->databaseUser, $projectConfiguration->databasePass);
// load controller
$ReqMod = FatFramework\Functions::getRequestParameter("mod");
if (!$ReqMod) {
$ReqMod = FatFramework\Functions::getRequestParameter("controller");
}
$module = ($ReqMod) ? $ReqMod : 'default';
在这种风格中,我调用类中的视图和动作,如SaveAction()
使用mysql总是使得在控制器调用的模型中使用此数据库连接非常简单,如
public function loadCustomersList($sAdditionalWhere = false)
{
$sQuery = "SELECT * FROM customers WHERE 1 ";
if ($sAdditionalWhere) {
$sQuery .= "AND " . $sAdditionalWhere . " ";
}
$sQuery .= "ORDER BY company";
$sql = mysql_query($sQuery);
while (($customer = mysql_fetch_object($sql)) != false) {
$aCustomers[] = $customer;
}
return $aCustomers;
}
我想完全折射这个项目并使用PDO。我在最近4个小时内尝试找到解决方案,但我无法弄清楚如何使其发挥作用。
我认为我不需要额外的dbconnect类,因为PDO本身就是一个类,我是对的吗?
在新的索引文件中,我尝试了以下内容:
$db = new database();
try{
$dbc = new PDO($db->get_DbConSettings());
$dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e)
{
echo 'Verbindung fehlgeschlagen: '.$e->getMessage();
}
但是这个$ dbc在控制器或型号中不可用。有没有办法让它在那里可用?如果没有,最好的解决方案是什么? 我是否必须在每个模型中建立数据库连接?
我对此的另一个问题是: $ DB-> get_DbConSettings() 在 $ dbc = new PDO
回馈
'mysql:host=127.0.0.1; dbname=c1virtbkk', 'root', '123'
($dbc = new PDO('mysql:host=127.0.0.1; dbname=c1virtbkk', 'root', '123');)
我无法连接到数据库。我得到以下内容:
Verbindung fehlgeschlagen: could not find driver
如果我不使用$ db-> get_DbConSettings并手动输入所需信息,我不会收到任何错误并且可以进行查询。任何提示?
非常感谢帮助。
提前致谢!
马克
答案 0 :(得分:0)
绝对不要在每个模型中创建新的PDO连接。创建MySQL数据库连接相当快,但仍然有一些开销。您希望在整个请求中重用连接。如果不出意外,它允许您跨多个模型共享交易。
某些框架将共享资源对象存储在"注册表中。 class是一个单例键值存储。它不仅仅是一个全局哈希数组,但是使它成为一个类使得注册表本身更容易使用PHPUnit进行测试。有关注册表的示例,请参阅https://framework.zend.com/manual/1.12/en/zend.registry.using.html。
你是对的,PDO是一个类,即使它是作为C扩展而不是PHP类实现的。但它是一个类,new PDO(...)
返回该类的对象。
创建自己的db类的一个原因是帮助您进行单元测试,因为您可以为db类创建一个模拟对象,这样您就可以测试其他类(甚至模型类)而无需实时数据库连接。您的db类可以扩展或包含PDO对象。
您的错误问题"无法找到驱动程序"可能是因为没有安装mysql的PDO驱动程序。 PDO是一个PHP扩展,然后每个品牌的SQL数据库都有一个单独的扩展。您可以通过以下方式确认:
$ php -i
...lots of output...
PDO
PDO support => enabled
PDO drivers => mysql, odbc, sqlite
pdo_mysql
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $
...more output for other extensions...
请注意,PDO告诉我我安装了哪些驱动程序:mysql,odbc和sqlite。
所以你需要安装pdo_mysql。我不确定您使用的操作系统,但我经常使用的是CentOS Linux或Ubuntu Linux。 pdo_mysql可以通过yum或apt作为单独的包提供。
重新评论:
好的,这是一个注册表的例子:
class registry {
protected static $items = array();
public static get($key) {
return isset(self::$items[$key])?
self::$items[$key] : null;
}
public static set($key, $object) {
self::$items[$key] = $object;
}
}
在您的控制器初始代码中,您将创建一个数据库对象并将其存储在注册表中:
$projectConfiguration = new projectConfiguration();
$dbconnect = $projectConfiguration->connect(
$projectConfiguration->databaseHost,
$projectConfiguration->databaseName,
$projectConfiguration->databaseUser,
$projectConfiguration->databasePass);
registry::set('db', $dbconnect);
然后在您的模型类方法(或您需要数据库的任何地方)中,从注册表中获取db对象并使用它:
public function loadCustomersList($sAdditionalWhere = false)
{
$sQuery = "SELECT * FROM customers WHERE 1 ";
if ($sAdditionalWhere) {
$sQuery .= "AND " . $sAdditionalWhere . " ";
}
$sQuery .= "ORDER BY company";
$db = registry::get('db');
$stmt = $db->query($sQuery);
$aCustomers = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $aCustomers;
}