PHP中‘Only variables should be passed by reference’报错含义及相关问题咨询
解析PHP中的两个报错及修复方案
咱先逐个拆解你遇到的这两个错误,搞明白问题根源再给你解决办法:
1. Notice: Only variables should be passed by reference(第18行)
这个报错的意思是:某些PHP函数要求参数必须是「变量」,不能直接传表达式(比如函数返回值、字面量这类临时值)。
PHP里有些函数的参数是「按引用传递」的(比如end()、reset()、array_pop()这类操作数组内部指针的函数),它们需要直接操作变量的内存地址,而你直接传了一个临时的计算结果(比如end(explode('/', $url))这种写法),临时值没有固定的内存引用,所以PHP会抛出这个提示。
修复方法:
把表达式的结果先存入一个变量,再把变量传给函数。比如:
// 错误写法(触发Notice) $lastSegment = end(explode('/', $url)); // 正确写法 $segments = explode('/', $url); $lastSegment = end($segments);
2. Warning: PDOStatement::execute(): SQLSTATE[HY093](第19行)
这个PDO报错的核心是:SQL语句里的占位符数量,和你实际绑定的参数数量不匹配。
举几个常见场景:
- SQL里写了2个占位符(比如
:username和:email),但execute()里只传了1个参数; - 占位符拼写错误,比如SQL里是
:user,你绑定的时候写成:username,相当于没匹配到这个占位符; - 不小心多写了一个绑定参数,或者SQL里多写了一个占位符。
修复方法:
- 先把SQL语句和绑定的参数列出来,逐个数一遍占位符和参数的数量;
- 检查每个占位符的名称(命名占位符)或位置(问号占位符)是否完全对应;
- 比如SQL是:
那INSERT INTO users (username, email) VALUES (:username, :email)execute()必须传包含两个键的数组:$stmt->execute([':username' => $username, ':email' => $email]);
两个错误的关联提醒
第18行的Notice可能导致变量没有正确赋值(比如本该拿到的数组元素没取到,变成了null),进而在第19行绑定参数时,无意中少传了参数,触发HY093错误。所以建议先修复第18行的问题,再排查PDO参数绑定。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

