まず、私はこの問題を読んでグーグル検索し、検索用語 php pdo または mysql データベース名エスケープのさまざまな組み合わせを使用しました。悲しいことに、この同じ問題を扱っている人を見つけたことがありません。
次の名前のスキーマを持つ mysql データベースがあります。www.company.com
バックティック文字を使用して簡単にエスケープできるため、通常、これは問題になりません。
ただし、mysqli または PDO を使用してそのスキーマのストアド プロシージャを呼び出すと、常に以下が返されます。
PROCEDURE www.company.com.usp_stored_procedure_name does not exist
明らかに、これは ` 文字を前後に配置する簡単なwww.company.com
方法ですが、mysqli または PDO を使用してこれを行う方法を見つけることができません。また、ドキュメントでこの問題への参照を見つけることができませんでした。
また、この手順は、mysql コマンド ライン クライアントまたは MySQL Workbench から問題なく実行されることも指摘しておく必要があります。これらの場合は、バック ティックまたはuse
ステートメントを含めることができるからです。さらに、これがデータベース ユーザーのアクセス許可に関連していないことは既に確認済みです。
ただし、mysqli または PDO を介してストアド プロシージャを使用しようとするたびに、上記のエラーが発生します。
このプロシージャは ETL 操作を担当し、複数の結果セットを返すため、php から呼び出される個々のステートメントに変換するのは非常に面倒です。誰かが以前にこの問題に対処したことを切に願っています。
以下は試した方法の一部です。
mysqli_connect を呼び出すときに、エスケープされたデータベース名を使用しようとしました...
$mysqli=mysqli_connect($host, $this->db->username, $this->db->password, '-www.company.com-');
...エラーを受け取りました。
データベース名を指定してストアド プロシージャを呼び出してみました...
$mysqli->multi_query("CALL usp_stored_procedure_name(50, '2013-05-01')");
...上記のエラーが発生しました。
データベース名を指定してストアド プロシージャを呼び出してみました...
$mysqli->multi_query("CALL -www.company.com-.usp_stored_procedure_name(50, '2013-05-01')");
...上記のエラーが発生しました。