You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:23:42