0

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

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

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

我的代码在下面,我会很感激你对我如何更好地解决这个问题的想法。谢谢。

索引.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 />';

}

模型.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;

    }

}
4

1 回答 1

3

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

我认为您有多个 PHP 脚本实例,并且当每个实例都在USE dbnamePDO 不知道它发生的情况下执行时,会发生什么,这会导致整个混乱。

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

在PDO 文档中阅读更多内容。

于 2013-02-18T09:30:33.750 回答