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

Mysql 使PDO数据库连接在控制器和模型中可用,mysql,pdo,connection,Mysql,Pdo,Connection,现在,我有点沮丧,我希望有人能帮助我,为我指明正确的方向 我有一个“旧”项目,它使用mysql语句连接到数据库等 在这个项目中,我有以下几点: $db = new database(); try{ $dbc = new PDO($db->get_DbConSettings()); $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e) { ec

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

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

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

$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();
}
Verbindung fehlgeschlagen: could not find driver
包含

*
* 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();
}
Verbindung fehlgeschlagen: could not find driver
但是有了这个$dbc,控制器或模型将无法使用。有什么办法可以在那里使用吗?如果不是,最好的解决方案是什么? 我必须在每个模型中建立数据库连接吗

我对此的另一个问题是: $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');)
我无法连接到数据库。我得到以下信息:

$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();
}
Verbindung fehlgeschlagen: could not find driver
如果我不使用$db->get_DbConSettings并手动输入所需的信息,我不会得到任何错误,并且可以执行查询。有什么提示吗

非常感谢你的帮助

提前谢谢


标记

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

一些框架将共享资源对象存储在“registry”类中,该类是一个单例键值存储。它实际上并不仅仅是一个全局哈希数组,但将其作为一个类使注册表本身更容易用PHPUnit进行测试。有关注册表的示例,请参见

PDO是一个类,这是对的,尽管它是作为C扩展而不是PHP类实现的。但它是一个类,
newpdo(…)
返回该类的对象

创建自己的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);
在控制器初始代码中,您将创建一个数据库对象并将其存储在注册表中:

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

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

一些框架将共享资源对象存储在“registry”类中,该类是一个单例键值存储。它实际上并不仅仅是一个全局哈希数组,但将其作为一个类使注册表本身更容易用PHPUnit进行测试。有关注册表的示例,请参见

PDO是一个类,这是对的,尽管它是作为C扩展而不是PHP类实现的。但它是一个类,
newpdo(…)
返回该类的对象

创建自己的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);
在控制器初始代码中,您将创建一个数据库对象并将其存储在注册表中:

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

非常感谢您提供的详细信息。我很难理解前两段,但我会弄明白的,再次感谢你!我会尽快试试这个。关于驱动程序问题:我检查了phpinfo()并且启用了PDO MySQL。让我困惑的是,只有在$dbc=new PDO中使用$db->get_DbConSettings()时,才会出现这个错误。如果我将必要的信息直接写入新的PDO(…),我不会得到错误。那么我猜您的get_DbConSettings()函数没有使用正确的参数创建PDO对象。查看文档以获得PDO构造函数的正确参数。非常感谢您提供的详细信息。我很难理解前两段,但我会想明白的