PHP7.2环境执行MySQL多表查询语句报语法错误,求排查解决
问题根因与解决方法
核心原因:
$eventid变量未正确传值、为空
你收到的报错提示语法错误出现在右括号)附近,正是因为当$eventid为空时,你的拼接SQL中ON (review_id = ev_eventid AND ev_eventid = $eventid )这段会变成ON (review_id = ev_eventid AND ev_eventid = ),等于号后没有有效值,SQL解析器遇到右括号就会判定语法错误。
另外注意你贴出的代码中WHERE条件是review_approved = '1',但报错信息里显示的是review_approved = '0',说明你实际执行的SQL和你贴的片段不是同一版本,优先排查对应review_approved = '0'逻辑里的$eventid传值逻辑,执行SQL前加一行var_dump($eventid);就能快速验证变量是否为空。附带安全优化建议
你当前直接把变量拼接进SQL的写法存在严重SQL注入风险,建议替换为mysqli预处理语句写法,既可以避免传值异常导致的语法报错,也能防御注入攻击:
// 使用?作为变量占位符 $query = "SELECT * FROM reviews INNER JOIN members ON (review_userid = mem_userid) INNER JOIN events ON (review_id = ev_eventid AND ev_eventid = ? ) WHERE review_approved = '1' ORDER BY review_createdate DESC"; $stmt = mysqli_prepare($globalMysqlConn, $query); // 绑定参数,i表示$eventid为整数类型,字符串类型则填s mysqli_stmt_bind_param($stmt, "i", $eventid); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); while ($mysql_array = mysqli_fetch_object($result)) { // 原有业务逻辑 }
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

