mysql - 使 PDO 数据库连接在 Controller 和模型中可用

标签 mysql pdo connection

现在,我有点沮丧,我希望有人能帮助我并指出正确的方向。

我有一个“旧”项目,它使用 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';

在这种风格中,我在类中调用 View 和操作,例如 SaveAction()

使用 mysql 总是使得在 Controller 调用的模型中使用此数据库连接变得非常简单,例如

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 将无法在 Controller 或模型中使用。有办法让它在那里可用吗?如果不是,最好的解决方案是什么? 我必须在每个模型中建立数据库连接吗?

我遇到的另一个问题是: $db->get_DbConSettings() 在 $dbc = 新的 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 并手动输入所需的信息,我不会收到任何错误并且可以进行查询。有什么提示吗?

非常感谢您的帮助。

提前致谢!

标记

最佳答案

绝对不要在每个模型中创建新的 PDO 连接。创建 MySQL 数据库连接相当快,但是这样做仍然有一些开销。您希望在整个请求中重用一个连接。如果不出意外,它允许您跨多个模型共享事务。

一些框架将共享资源对象存储在“注册表”类中,该类是单例键值存储。它只不过是一个全局散列数组,但将其作为一个类可以使注册表本身更容易用 PHPUnit 进行测试。参见 https://framework.zend.com/manual/1.12/en/zend.registry.using.html以注册表为例。

你说得对,PDO 是一个类,尽管它是作为 C 扩展而不是 PHP 类实现的。但它是一个类,new PDO(...) 返回该类的一个对象。

创建您自己的数据库类的一个原因是帮助您进行单元测试,因为您可以为您的数据库类创建一个模拟对象,这样您就可以在不需要实时数据库的情况下测试您的其他类(甚至模型类)联系。您的数据库类可以扩展或包含 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;
  }
}

在您的 Controller 初始代码中,您将创建一个数据库对象并将其存储在注册表中:

$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;
}

关于mysql - 使 PDO 数据库连接在 Controller 和模型中可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366892/

相关文章:

mysql - 在与 MYSQL 相同的查询 NODE JS 中选择并插入

mysql - Spring JDBC 应用程序中的 SELECT FOR UPDATE 问题

php - 如何从 Android 应用程序连接 MySQL 数据库?

PHP 表单数据未复制到数据库

PHP PDO 停止工作

php - bindParam()、bindValue()和execute(array())有什么区别和优势

security - SMTP 服务器在 STARTTLS 完成之前断开

mysql - 连接多个 mysql 表

java - JDBC连接异常 : Unable to acquire JDBC Connection when using JPA

android - android模拟器中的互联网连接