我是使用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;
}
}
答案 0 :(得分:2)
对于PDO,您不应直接执行USE dbname
。
我认为你有多个PHP脚本实例正在发生什么,当每个实例都执行USE dbname
而没有PDO意识到它发生时,这会导致整个混乱。
相反,您应该在PDO连接字符串中指定dbname,如'mysql:host=localhost;dbname=testdb'
。这意味着在创建Model类之后,您无法在数据库之间切换。您应该事先知道您的数据库名称,并在Model构造函数中使用它。
在PDO documentation中阅读更多内容。