【问题标题】:Transfer mysql table between two databases with PDO使用 PDO 在两个数据库之间传输 mysql 表
【发布时间】:2012-12-20 04:54:31
【问题描述】:

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

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

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

一个答案:

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

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

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

$sql = "SELECT * FROM anotherdbname.anothertablename"

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

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

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

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

【问题讨论】:

  • 你记得在完成授权后刷新 privs 吗?因为该错误全部与赠款有关。
  • 我不确定...:(我如何刷新权限?
  • 我只是使用我的 cPanel 将用户添加到另一个数据库并授予所有权限。
  • cPanel。哦。是的,你应该有flushed。它没有,或者它发生了故障。
  • 哦,等等,您正在使用 one 连接来与两个数据库通信?除非您在 same 服务器上使用 same 凭据,否则无能为力。各有一个连接。两组不同的凭据意味着您需要两个连接。如果您只是发出 USE foo 在运行时切换,那应该可以。也许您应该向我们展示失败的代码而不仅仅是摘要?我仍然认为这是破坏赠款....

标签: php mysql pdo


【解决方案1】:

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

【讨论】:

  • 那么转移满桌的最佳方式是什么?
  • 这是否意味着这个答案:stackoverflow.com/a/11636017/1019588 完全无效?
  • 问题是您提供的答案不是有效的 PHP PDO 答案。它肯定会与 mysqli_query() 函数一起使用,因为您可以在那里使用 mysqli_select_db() 来实际更改连接的数据库。你不能用 PDO 做到这一点。
  • 好的,所以更多的研究表明 db.table 语法似乎可用于原始 mysql 命令,但在通过 PHP 时不可用。对吗?
  • 是的,但也要记住,PDO 实例需要特定的数据库作为初始化参数。这是 PDO 与使用 mysqli* 函数相比的单一限制因素。但即便如此,PDO 有助于划分数据,这确实是一件好事,即使你想将一堆东西从 database_a 放入 database_b。
【解决方案2】:

结果表明,通过单个 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.

【讨论】:

  • 那你是在使用->exec()跨多个数据库执行SQL查询吗?
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 因为“我要做的就是打开一个 PDO 连接”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
相关资源
最近更新 更多