我正在尝试使用 PDO 调用存储过程,但在尝试获取结果时出现以下错误。
警告:数据包乱序。预计收到 1 个 16。数据包大小=163
我的存储过程正在使用我在从临时表中选择之前关闭的两个游标。我怀疑这可能是问题所在,因为我可以直接在 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))
我也不确定问题是否在于将null作为参数之一传递。有时第一个参数传递null,有时是第二个。但无论如何,它总是直接在 MySQL 服务器上工作。
我尝试了 bindParam 和 bindValue,结果相同。我也可以发布我的 SP,但这可能有点矫枉过正。
有没有办法从 PDO 扩展打开额外的日志记录?
有什么想法或建议吗?如果您需要更多信息,请告诉我。
注意:我使用的是 PHP v5.5.4 和 MySQL v5.6.14。