首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使PDO数据库连接在控制器和模型中可用

使PDO数据库连接在控制器和模型中可用
EN

Stack Overflow用户
提问于 2016-12-28 17:25:12
回答 1查看 342关注 0票数 1

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

我有一个“旧”项目,它使用mysql语句连接数据库,等等。

在这个项目中,我有以下几点:

包含以下内容的索引文件

代码语言:javascript
复制
*
* 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总是使在控制器调用的模型中使用此数据库连接变得非常简单,如下

代码语言:javascript
复制
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个小时里,我一直试图找到一个解决方案,但我想不出如何让它发挥作用。

因为PDO本身就是一个类,所以我不需要额外的dbconnect类,对吗?

在新的索引文件中,我尝试了以下操作:

代码语言:javascript
复制
$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中

送回

代码语言:javascript
复制
'mysql:host=127.0.0.1; dbname=c1virtbkk', 'root', '123'

($dbc = new PDO('mysql:host=127.0.0.1; dbname=c1virtbkk', 'root', '123');)

我无法连接到数据库。我得到以下信息:

代码语言:javascript
复制
Verbindung fehlgeschlagen: could not find driver

如果我不使用$db-> get _DbConSettings并手动放入所需的信息,则不会收到任何错误,并且可以执行查询。有什么暗示吗?

我们真的很感激你的帮助。

提前感谢!

标记

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-28 17:38:51

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

一些框架将共享资源对象存储在一个“注册表”类中,这个类是一个单例键值存储。它实际上只是一个全局哈希数组,但是使它成为一个类使注册中心本身更容易使用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数据库都有一个单独的扩展。您可以通过以下方式确认这一点:

代码语言:javascript
复制
$ 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。pdo_mysql可以通过yum或apt作为一个单独的包使用。

关于你的评论:

好的,这里有一个注册表的例子:

代码语言:javascript
复制
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;
  }
}

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

代码语言:javascript
复制
$projectConfiguration = new projectConfiguration();
$dbconnect = $projectConfiguration->connect(
  $projectConfiguration->databaseHost, 
  $projectConfiguration->databaseName,
  $projectConfiguration->databaseUser,
  $projectConfiguration->databasePass);

registry::set('db', $dbconnect);

然后在模型类方法(或任何需要数据库的地方),从注册表中获取db对象并使用它:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41366892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档