我有一个数据库,其中包含一个名为users的表和一个名为name的字段。我有以下HTML代码:
<form action="change.php?link=edit" method="post">
<input type="text" name="name" id="name" class="lg" value="">
<input type="submit" name="sub" value="Save changes">
</form>
这个PHP代码,用用户在输入中写入的内容更新名称字段:
if(isset($_POST['sub'])) {
if (!empty($_POST['name'])) {
$name= $_POST['name'];
$id=$_SESSION['id'];
$sql = "UPDATE users SET name=:name WHERE id=$id";
$sql->bindParam(":name", $name);
$consulta = $db->prepare($sql);
$result = $consulta->execute();
}
}
}
该代码给出了错误&#34;致命错误:在字符串&#34;上调用成员函数bindParam(),但是,如果我将PHP代码更改为:
$sql = "UPDATE users SET name='$name' WHERE id=$id";
并评论该行:
//$sql->bindParam(":name", $name);
我没有错误。但是我知道这是一个糟糕的编程习惯,因为该代码容易受到sql注入的攻击。我怎么能解决这个问题?
答案 0 :(得分:1)
这是一个有趣的错误消息。您应该可以通过删除单引号来修复它:
$sql = "UPDATE users SET name = :name WHERE id = :id";
PHP / SQL已经知道参数的类型。单引号是不必要的。
注意:您也应该:id
一个参数。
答案 1 :(得分:1)
改变:
$sql = "UPDATE users SET name=:name WHERE id=$id";
$sql->bindParam(":name", $name);
$consulta = $db->prepare($sql);
到
$sql = "UPDATE users SET name=:name WHERE id=:id";
$consulta = $db->prepare($sql);
$consulta->bindParam(":name", $name, PDO::PARAM_STR);
$consulta->bindParam(":id", $id, PDO::PARAM_INT);