【问题标题】:Multiple Databases using PDO使用 PDO 的多个数据库
【发布时间】:2013-02-18 09:19:56
【问题描述】:

我对使用 PDO 很陌生,我想设置它,以便我可以在需要时拥有多个数据库。因此,我创建了一个函数,允许您传递数据库名称以用作和何时使用。

它在一定程度上确实有效,因为它选择了您传入的数据库,但即使数据库被省略或不正确,它仍然允许您从似乎是随机选择的数据库中选择表和行MySQL 用户。

我想这不是一个主要问题,但我希望它不会选择任何数据,除非通过我的函数传递了一个数据库。

我的代码在下面,如果您对我如何更好地处理这个问题提出想法,我将不胜感激。谢谢。

index.php

require 'app/cream.php';

try {

    $db = new Cream_Model();
    $db = $db->selectDb( 'cream' );

    $data = $db->query('SELECT * FROM users');
    foreach( $data as $row ) {
        print_r( $row );
    }

} catch( PDOException $e ) {

    echo 'An error has occurrred: ' . $e->getMessage() . '<br />';

}

Model.php

class Model {

    public $connection;

    public function connect() {

        try {

            $connection = new PDO( DB_DSN . ':' . DB_HOST, DB_USERNAME, DB_PASSWORD, array( PDO::ATTR_PERSISTENT => true ) );
            $connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $connection->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );

        } catch( PDOException $e ) {

            echo 'An error has occurred: ' . $e->getMessage() . '<br />';
            die();

        }

        return $connection;

    }

}

Cream_Model.php

class Cream_Model extends Model {

    public $conn;

    public function selectDb( $db ) {

        try {

            $conn = $this->connect();
            $conn->exec( "USE $db" );

        } catch( PDOException $e ) {

            echo 'An error has occurred: ' . $e->getMessage() . '<br />';

        }

        return $conn;

    }

}

【问题讨论】:

标签: php mysql pdo multiple-databases


【解决方案1】:

对于 PDO,您不应直接执行 USE dbname

我认为你有多个 PHP 脚本实例,当每个实例都执行 USE dbname 而 PDO 没有意识到它发生时,这会导致整个混乱。

相反,您应该在 PDO 连接字符串中指定 dbname,例如 'mysql:host=localhost;dbname=testdb'。这意味着您在创建 Model 类后无法真正在数据库之间切换。您应该预先知道您的数据库名称并在模型构造函数中使用它。

PDO documentation阅读更多内容。

【讨论】:

  • 为什么不应该使用 exec("USE dbname")?这是有原因的吗?
  • 因为 PDO 被设计为与供应商无关的数据库连接层。其他供应商(Oracle、Postgres 等)没有USE dbname 或其等效项。通过直接执行 USE,PDO 会失去跟踪哪个数据库实际上是当前的——不要那样做。相反,您在连接字符串中指定 dbname
  • 好的,这是有道理的,但必须有一种方法可以正确使用多个数据库。本质上,我想要一个连接类,然后是一种将数据库传递给连接的方法。
  • 是的,没关系,但我正在尝试使用连接类来自动化或至少减少需要连接的代码。我已经让它工作了。我只是从连接字符串中删除了 array( PDO::ATTR_PERSISTENT => true )。
  • 请注意,通过删除持久连接,您抵消了它们提供的任何性能优势。现在,在每次页面加载时,您都会建立与服务器的新连接。实际上,它与为每个新页面加载打开新的数据库连接相同。如果您使用多个连接和持久标志,它应该比现在更快地工作。
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2014-11-18
相关资源
最近更新 更多