PHP基于PDO的自定义函数无法正确返回数组 外部调用报未定义变量错误
报错根因与修正方案
1. 直接触发报错的核心原因
PHP遵循严格的变量作用域隔离规则:
- 函数内部定义的所有变量,默认仅能在函数自身的执行空间中访问,出了函数范围就会被销毁,不会自动同步到全局作用域
- 哪怕函数内部写了
return $result,返回值也需要在函数被调用时,通过赋值操作传递给外部变量。现有代码既没有实际调用find_user_roles函数,也没有接收函数的返回值,全局作用域下根本不存在$result这个变量,自然会抛出未定义变量的错误 - 函数内部的
print_r($result)能正常输出,是因为这个打印动作本身就在函数的局部作用域内执行,和外部作用域没有关联
通俗类比:你在自己房间(函数作用域)里做好了一份蛋糕(局部变量
$result),你可以在房间里自己尝一口(函数内部print_r),也可以把蛋糕递出房门(return $result),但如果递出门的时候外面没人伸手接(没有写$result = find_user_roles(xxx)),蛋糕递出去就会直接被丢弃,门外的人(全局作用域)根本看不到这份蛋糕,自然会报“我没找到这个东西(未定义变量)”。
2. 代码中隐藏的其他隐患
除了作用域的问题,现有代码还有两个容易引发后续故障的问题:
- 调用PDO对象时漏写了
$符号:代码里写的pdo->prepare()会被PHP识别为读取名为pdo的常量,而非实际实例化的PDO对象变量,修正后应为$pdo->prepare() - 直接将
$userid字符串拼接进SQL语句,完全失去了PDO预处理的安全优势,存在SQL注入风险,应改用命名占位符绑定参数的方式实现查询
3. 可正常运行的参考写法
// 假设全局已正确实例化PDO对象$pdo function find_user_roles($userid){ $statement = $pdo->prepare(" SELECT users_roles.roles_id, roles.user_role FROM users_roles JOIN roles ON users_roles.roles_id = roles.id WHERE users_roles.users_id = :userid "); $statement->execute([ ':userid' => $userid ]); // 直接返回查询结果,可根据需要省略函数内部的多余打印 return $statement->fetchAll(); } // 调用函数时,将返回值赋值给全局作用域的$result变量 $result = find_user_roles(123); // 替换为实际需要查询的用户ID print_r($result);
内容的提问来源于stack exchange,提问作者daencore
相关产品推荐
相关产品推荐

