PHP 5.3调用MySQL存储函数返回空对象问题求助
我在PHP 5.3.29版本的应用中调用MySQL存储函数时遇到了棘手的问题——这个存储函数专门用来计算两个指定日期之间的工作日总数,但从PHP调用后返回的是一个所有属性都为Null的对象,把$result打印到Web控制台也能看到全空的属性状态。
先给你看看我调用存储函数的PHP代码:
$db = dbLink(); $result = $db->query("SELECT WORKDAYS('2018-04-01','2018-04-08')"); if (!$result) { die('Could not query:' . mysql_error()); } echo '<script>'; echo 'console.log('. json_encode( $result ) .')'; echo '</script>'
针对这个问题,我整理了几个排查和解决的方向,你可以一步步来试:
先验证存储函数本身的有效性
别先着急查PHP代码,先打开MySQL客户端(比如命令行、Navicat这类工具),直接执行SELECT WORKDAYS('2018-04-01','2018-04-08');,看看能不能得到正确的工作日数值。如果这里就出问题,那说明存储函数的逻辑有bug,比如日期格式处理、节假日判断、循环计算这些环节可能出错了,得先把函数本身调通。修正数据库扩展的错误处理和调用方式
你的代码里混用了面向对象的$db->query()和过程式的mysql_error(),这很可能导致错误信息无法正确捕获。如果dbLink()返回的是mysqli连接对象,那应该用$db->error来获取错误信息,因为mysql扩展在PHP 5.3已经被标记为废弃,和mysqli混用会出问题。说不定你的查询其实已经报错了,但你没看到正确的错误提示。正确提取结果集里的数值
这是最可能的问题:$db->query()执行SELECT语句后返回的是结果集对象,不是直接的计算结果。你得从这个对象里取出实际的数值,而不是直接把对象转JSON。修改代码如下:$db = dbLink(); // 给结果起个别名方便获取 $result = $db->query("SELECT WORKDAYS('2018-04-01','2018-04-08') AS workday_count"); if (!$result) { // 用mysqli的错误获取方式 die('Could not query:' . $db->error); } // 从结果集取出一行数据 $row = $result->fetch_assoc(); // 获取实际的工作日数量 $workdayCount = $row['workday_count']; echo '<script>'; // 现在打印的是实际数值了 echo 'console.log('. json_encode( $workdayCount ) .')'; echo '</script>'你之前直接转JSON的是结果集对象,它本身不存储计算值,所以才会显示全空属性,必须先提取出数据才行。
检查PHP和MySQL版本兼容性
PHP 5.3.29比较老旧,如果你的MySQL版本是8.0及以上,可能会存在兼容性问题——比如mysqli扩展不支持新的caching_sha2_password认证方式。这种情况下可能需要调整MySQL的认证插件,或者确认你的PHP扩展是否适配当前MySQL版本。
内容的提问来源于stack exchange,提问作者Vasu

