PDO を使用してストアド プロシージャを呼び出そうとしていますが、結果を取得しようとすると次のエラーが発生します。
警告: パケットの順序が正しくありません。期待される 1 受信 16. パケット サイズ = 163
ストアド プロシージャは、一時テーブルから選択する前に閉じる 2 つのカーソルを使用しています。MySQLでSPを直接呼び出して結果を確認できるため、これが問題であると思われます。また、php_pdo_mysql.dll に移行する前に php_mysql 拡張機能を使用した場合、この SP で問題が発生したことはありません。PDO を使用して、PHP で INPUT パラメータを含む他の単純なストアド プロシージャを呼び出すこともでき、エラーなしで結果を取得できます。
エラーを返すコードは次のとおりです。
$db = new PDO('mysql:host='.__DB_HOST__.';dbname='.__DB_NAME__.';charset=utf8', __DB_USER__, __DB_PASS__);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
/* DOES NOT WORK */
$queryResult = $db->prepare("CALL GetResults(:siteId,null)");
$siteId = 19;
$queryResult->bindValue(':siteId', $siteId, PDO::PARAM_INT);
$queryResult->execute();
$result = $queryResult->fetchAll(PDO::FETCH_ASSOC); // returns packets out of order warning
print_r($result);
このコードは Try/Catch ブロックにあり、例外はスローされていません。実際、PHP はこれをブラウザで警告として表示しています。
私のストアド プロシージャの署名は次のようになります。
CREATE DEFINER=`root`@`localhost`
PROCEDURE `GetResults`(IN siteIdParam INT(11), IN siteSearchText VARCHAR(45))
また、パラメーターの 1 つとしてnullを渡すことに問題があるかどうかもわかりません。最初のパラメーターがnullを渡す場合もあれば、2 番目のパラメーターを渡す場合もあります。ただし、常に MySQL サーバー上で直接動作します。
bindParam と bindValue を試しましたが、同じ結果でした。SPを投稿することもできますが、やり過ぎかもしれません。
PDO 拡張機能から追加のログを有効にする方法はありますか?
アイデアや提案はありますか?さらに詳しい情報が必要な場合は、お知らせください。
注: PHP v5.5.4 と MySQL v5.6.14 を使用しています。