Несколько баз данных с использованием PDO

Я новичок в использовании 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;

    }

}

Ответ 1

Для PDO вы НЕ должны выполнять USE dbname непосредственно.

Я думаю, что случается, что у вас есть несколько экземпляров PHP script, и когда каждый из них выполняет USE dbname, но PDO не знает об этом, и это приводит к беспорядку.

Вместо этого вы должны указать имя dbname в вашей строке подключения PDO, например 'mysql:host=localhost;dbname=testdb'. Это означает, что вы не можете переключаться между базами данных после создания класса модели. Вы должны знать свое имя базы данных заранее и использовать его в конструкторе модели.

Подробнее в документация PDO.