【问题标题】:How to change from simple mysqli query to prepared statement?如何从简单的 mysqli 查询更改为准备好的语句?
【发布时间】:2019-11-21 13:32:16
【问题描述】:

我做了 3 次查询(SELECT、INSERT、UPDATE)它可以工作,但在当前状态下看起来很丑而且不安全。

有什么方法可以让这些 SELECT、INSERT、UPDATE 查询比使用prepared statement 更具可读性和安全性?

    $email = $_SESSION['email'];
    $query = "SELECT username FROM users WHERE email='$email'";
    $result = mysqli_query($connect, $query);
    $row = mysqli_fetch_assoc($result);
    $username = $row['username'];

    if(!empty($_POST["comment"])){
    $id = $_GET['id'];
    $sql = "INSERT INTO user_comments (parent_id, comment, username, custom_id) VALUES ('".$_POST["commentID"]."', '".$_POST["comment"]."', '$username', '$id')";
    mysqli_query($connect, $sql) or die("ERROR: ". mysqli_error($connect));

    /// I need this update query to make every inserted comment's ID +1 or can I do this more simple?
    $sql1 = "UPDATE user_comments SET id = id +1 WHERE custom_id = '$id'";
    mysqli_query($connect, $sql1) or die("ERROR: ". mysqli_error($connect));

【问题讨论】:

  • 您查看过prepared statementsbind_param 的文档吗?
  • 是的,我做到了。我可以使用准备好的语句执行简单的 SELECT 或 UPDATE 或 INSERT 查询,但我不知道如何以简单的方式执行这些多个查询。还是我必须像现在一样单独执行每个查询?
  • 不,你必须分别做每一个。

标签: php mysqli prepared-statement


【解决方案1】:

试试这个。您可以使用$ex->insert_id 获取last entered ID。当大量插入数据库时​​,这可能会派上用场。我通常使用PDO,因为我发现代码看起来更干净,但我想这都是偏好。请记住 ->bind_param 行,"isii" 指的是您输入的数据类型。所以,在这种情况下,它是Integer, String, Integer, Integer(我可能弄错了)。

$email    = $_SESSION['email'];
$query    = "SELECT username FROM users WHERE email='$email'";
$result   = mysqli_query($connect, $query);
$row      = mysqli_fetch_assoc($result);
$username = $row['username'];

if(!empty($_POST["comment"])){
$id        = $_GET['id'];
$commentID = $_POST["commentID"];
$comment   = $_POST["comment"];

$sql = "INSERT INTO user_comments (parent_id, comment, username, custom_id) VALUES (?, ?, ?, ?)";
$ex  = $connect->prepare($sql);
$ex->bind_param("isii", $commentID, $comment, $username, $id);

if($ex->execute()){
    // query success
    // I need this update query to make every inserted comment's ID +1 or can I do this more simple?

    $lastInsertID = $ex->insert_id;

    $sql1 = "UPDATE user_comments SET id = id + 1 WHERE custom_id = ?";
    $ex1  = $connect->prepare($sql1);
    $ex1->bind_param("i",$lastInsertID);
    if($ex1->execute()){
        // query success
    }else{
        // query failed
        error_log($connect->error);
    }
}else{
    //query failed
    error_log($connect->error);
}

【讨论】:

  • 是的,你把 isii 部分弄错了,但我改成 issi 一切正常,非常感谢!那么现在这些查询可以避免 sql 注入了吗?
  • @NaderG 然后归结为您的数据库驱动程序以及它如何逃脱(可能)有害的用户输入。目前,这些机制都可以很好地发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多