致命错误:在字符串

时间:2017-08-19 13:33:30

标签: php sql

我有一个数据库,其中包含一个名为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注入的攻击。我怎么能解决这个问题?

2 个答案:

答案 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);