Я довольно новичок в использовании 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; } }
Для PDO вы НЕ должны USE dbname
напрямую.
Я думаю, что происходит то, что у вас есть несколько экземпляров PHP-скрипта, и когда каждый из них выполняет имя USE dbname
но PDO не знает об этом, и это вызывает беспорядок.
Вместо этого вы должны указать имя dbname в вашей строке соединения PDO, например 'mysql:host=localhost;dbname=testdb'
. Это означает, что вы не можете переключаться между базами данных после создания класса модели. Вы должны знать свое имя базы данных заранее и использовать его в конструкторе модели.
Подробнее читайте в документации PDO .