过去一小时我一直在研究这个问题,但是想出一个简单的解决方案,不涉及一些奇怪的出口/进口。
我要做的就是打开一个带有两个数据库的PDO连接,这样我就可以在查询中使用它们。
似乎Stack Overflow中有关于此的不一致。
一个答案:
...您需要为单独创建两个PDO对象 连接,如果您想在运行时使用它们。
但是其他人似乎建议你可以在查询中“使用”两个数据库:
$sql = "SELECT * FROM dbname.tablename";
$sql = "SELECT * FROM anotherdbname.anothertablename"
除了在我的PDO连接函数中明确定义的数据库之外,我尝试在另一个数据库上执行SELECT命令。我明白了:
致命错误:带有消息的未捕获异常'PDOException' 'SQLSTATE [42000]:语法错误或访问冲突:1142 SELECT 命令被拒绝用户'dbusername'@'localhost'表 '表名'
我确保将用户添加到两个数据库并授予完全权限。
是否可以在同一连接中使用两个数据库的查询?或者你必须设置两个不同的对象?
答案 0 :(得分:2)
“具有两个数据库的PDO连接”(单数形式)是用词不当,因为根据定义,PDO连接是到单个数据存储的单个连接。如果需要两个连接,则需要实例化两个实例。
答案 1 :(得分:1)
使用单个PDO连接,可以在两个数据库 之间执行查询。即使在我的PDO启动中定义了一个数据库,我仍然可以访问另一个数据库。
解决方案是使两个数据库具有相同的凭据。
function db_connect(){
$host = 'localhost';
$port = 3306; // This is the default port for MySQL
$database = 'db1';
$username = 'user';
$password = 'pass';
$dsn = "mysql:host=$host;port=$port;dbname=$database";
$db = new PDO($dsn, $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
}
$db=db_connect();
$statement = $db->prepare("SELECT * FROM db2.table LIMIT 1");
$statement->execute();
$x=$statement->fetchObject();
var_dump($x); //A full row from the table was the output.
答案 2 :(得分:0)
我确保将用户添加到两个数据库并授予完全权限。
错误消息非常明确。读这篇文章,我不太确定。
无论如何,要回答标题问题: 为什么不从控制台运行这个简单的查询?
INSERT INTO db2.table SELECT * FROM db1.table;
它不仅会传输您的数据,还会证明您的用户是否拥有足够的权利 如果不是 - 你必须确保这一点。