MySQL 8.0迁移后mysqli_stmt_execute()执行异常求助
MySQL 8.0迁移后PHP 7.4中mysqli_stmt_execute()异常问题
问题背景
主机服务商Siteground将MySQL从5.7版本迁移至8.0版本后,PHP 7.4环境下的部分代码无法正常运行,核心问题出在mysqli_stmt_execute()调用——该函数现在会抛出异常。
原代码(MySQL 5.7下运行正常)
if (!mysqli_stmt_execute($stmt)) { error_log("mysql error: " . mysqli_error($mysqli)); error_log("prep_bind_exec_2(): mysqli_stmt_execute returned false"); return false; }
升级后抛出的异常
Incorrect arguments to mysqld_stmt_execute in Stack trace: mysqli_stmt_execute(Object(mysqli_stmt)) prep_bind_exec_2(Object(mysqli), ' SELECT DISTIN...', 'ssssssdd', '2', '1', '2', '3', '4', '4', 0, 1000000000)
尝试的修改及结果
查阅PHP文档得知,mysqli_stmt_execute()的第二个可选$params参数仅在PHP 8.1及以上版本支持,但我尝试修改代码如下:
if (!mysqli_stmt_execute($stmt, ['2','1','2','3','4','4','0','1000000000'])) { error_log("mysql error: " . mysqli_error($mysqli)); error_log("prep_bind_exec_2(): mysqli_stmt_execute returned false"); return false; }
修改后,mysqli_stmt_execute()返回false,但mysqli_error()返回空字符串。
对应的SQL语句
SELECT DISTINCT CONTACT.contact_id, CONTACT.address_region, CONTACT.cost_to_request FROM CONTACT LEFT JOIN STAKEHOLDER ON CONTACT.contact_id = STAKEHOLDER.contact_id LEFT JOIN PRODUCT_RANGE ON CONTACT.contact_id = PRODUCT_RANGE.contact_id LEFT JOIN CAPABILITY ON CONTACT.contact_id = CAPABILITY.contact_id LEFT JOIN PRODUCT_FEATURE ON CONTACT.contact_id = PRODUCT_FEATURE.contact_id WHERE CONTACT.active = '1' AND STAKEHOLDER.role_id IN (?) AND CAPABILITY.technology_id IN (?,?,?,?) AND PRODUCT_RANGE.product_type_id IN (?) LIMIT ?,?
绑定参数
params=["2","1","2","3","4","4",0,1000000000]
请问我哪里操作有误?
内容的提问来源于stack exchange,提问作者quixote
相关产品推荐
相关产品推荐

