1

在过去的一个小时里,我一直在研究这个问题,但还没有想出一个不涉及一些奇怪的导出/导入的简单解决方案。

我要做的就是打开与两个数据库的 PDO 连接,以便我可以在查询中使用它们。

Stack Overflow 中似乎对此存在分歧。

一个答案:

...如果您想在运行时同时使用这两个 PDO 对象,则需要为单独的连接创建两个 PDO 对象。

但其他人似乎建议您可以在查询中“使用”两个数据库:

$sql = "SELECT * FROM dbname.tablename";

$sql = "SELECT * FROM anotherdbname.anothertablename"

除了在我的 PDO 连接函数中明确定义的数据库之外,我尝试在另一个数据库上执行 SELECT 命令。我懂了:

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1142 SELECT 命令拒绝用户 'dbusername'@'localhost' 用于表 'table_name'

我确保将用户添加到两个数据库并授予完全权限。

是否可以在同一连接中使用两个数据库的查询?还是您必须设置两个不同的对象?

4

3 回答 3

2

“与两个数据库的 PDO 连接”(单数形式)是用词不当,因为根据定义,PDO 连接是到单个数据存储的单个连接。如果需要两个连接,则需要实例化两个实例。

于 2012-12-20T04:57:30.357 回答
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.
于 2012-12-20T06:02:25.843 回答
0

我确保将用户添加到两个数据库并授予完全权限。

错误信息非常明确。读到这里,我不会那么肯定。

无论如何,要回答标题问题:为什么不从控制台运行这个简单的查询呢?

INSERT INTO db2.table SELECT * FROM db1.table;

它不仅会传输您的数据,还会证明您的用户是否拥有足够的权限。
如果不是 - 你必须真正确保这一点。

于 2012-12-20T06:00:05.783 回答