PHP函数输出预准备SQL语句及调用foreach报错问题排查
解决PHP更新MySQL函数的参数错误及查看SQL语句问题
错误原因
你调用save_profile('john', 'hello')时,第二个参数传了字符串'hello',但函数内的foreach ($args as $key => $value)要求$args必须是数组或对象,因此触发类型警告。这个$args参数的作用是接收要更新的字段名与对应值的键值对集合。
正确调用方式
$args需要传递关联数组,数组的键对应players表中的字段名,值为要更新的内容。例如要更新用户john的邮箱和年龄:
save_profile('john', ['email' => 'john@example.com', 'age' => 25]);
查看生成的SQL语句
原函数中echo $stmt;直接输出PDO语句对象无法看到完整SQL,可修改函数添加打印逻辑:
function save_profile($player, $args) { global $pdo; $params = ["player"=>$player]; $setStr = ""; foreach ($args as $key => $value) { $setStr .= $key . "=" . $pdo->quote($value) . ","; } $setStr = rtrim($setStr, ","); // 先拼接SQL字符串并打印 $sql = "UPDATE players SET $setStr WHERE username = :player"; echo $sql . "<br>"; $stmt = $pdo->prepare($sql); $stmt -> execute($params); }
调用后即可直接看到拼接好的SQL语句。另外,更推荐用参数绑定替代手动转义,安全性更高:
function save_profile($player, $args) { global $pdo; $params = ["player" => $player]; $setClauses = []; foreach ($args as $key => $value) { $setClauses[] = "$key = :$key"; $params[$key] = $value; } $setStr = implode(", ", $setClauses); $sql = "UPDATE players SET $setStr WHERE username = :player"; echo $sql . "<br>"; $stmt = $pdo->prepare($sql); $stmt->execute($params); }
内容的提问来源于stack exchange,提问作者Stac Flo
相关产品推荐
相关产品推荐

