1

私はこれを過去1時間調査してきましたが、奇妙なエクスポート/インポートを伴わない簡単な解決策をまだ考え出していません.

私がやろうとしているのは、クエリで両方を使用できるように、2 つのデータベースとの PDO 接続を開くことだけです。

これについては Stack Overflow で意見の相違があるようです。

1つの答え:

...実行時に両方を使用する場合は、別々の接続用に 2 つの PDO オブジェクトを作成する必要があります。

しかし、他の人は、クエリで 2 つのデータベースを「使用」できることを示唆しているようです。

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

$sql = "SELECT * FROM anotherdbname.anothertablename"

PDO 接続関数で明示的に定義されたデータベース以外の別のデータベースで SELECT コマンドを実行しようとしました。私はこれを得た:

致命的なエラー: 例外 'PDOException' がキャッチされず、メッセージ 'SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1142 SELECT コマンドがテーブル 'table_name' のユーザー 'dbusername'@'localhost' に拒否されました

ユーザーを両方のデータベースに追加し、完全な権限を付与するようにしました。

同じ接続で 2 つのデータベースを使用するクエリは可能ですか? それとも、2 つの異なるオブジェクトをセットアップする必要がありますか?

4

3 に答える 3

2

「2 つのデータベースを持つ PDO 接続」(単数形) は誤称です。定義上、PDO 接続は 1 つのデータ ストアへの 1 つの接続であるためです。2 つの接続が必要な場合は、2 つのインスタンスをインスタンス化する必要があります。

于 2012-12-20T04:57:30.357 に答える
1

単一の PDO 接続で、2 つのデータベース間でクエリを実行できることがわかりました。PDO イニシエーションで1 つのデータベースが定義されていても、別のデータベースにアクセスできます。

解決策は、両方のデータベースに同じ資格情報を持たせることです。

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 に答える