【问题标题】:Cant get an equivalent mysqli prepared statement to execute sucessfully?无法成功执行等效的 mysqli 准备语句?
【发布时间】:2017-12-02 06:04:08
【问题描述】:

这些代码行似乎可以正常工作:

   if(isset($_POST['result'])) {
    if($_POST['result'] == 'true'){
        $delete_post_query = mysqli_query($con, "UPDATE posts SET deleted='yes' WHERE id='$post_id'");
        if($stmt = mysqli_prepare($con,$delete_post_query)){
        }
    }
   }

但是下面准备好的等价物似乎没有执行:

   if(isset($_POST['result'])) {
    if($_POST['result'] == 'true'){
        $delete_post_query = mysqli_query($con, "UPDATE posts SET deleted='yes' WHERE id=?");
        if($stmt = mysqli_prepare($con,$delete_post_query)){
            mysqli_stmt_bind_param($stmt, "s",$post_id);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_close($stmt);
        }
    }
}

我对此感到很困惑,并且相当肯定我遗漏了一些明显的东西。有什么建议/解决方案吗?

更新/编辑:

  • 我在复制/粘贴代码时犯了一个愚蠢的错误,所以我按照建议进行了更新。

  • 还分别尝试了整数和双精度的绑定参数。

  • 我认为这个问题与绑定参数有关,因为当我用硬编码变量 $post_id 替换占位符(即“?”)时,它工作得很好。

【问题讨论】:

  • 见this post 一些很好的例子。
  • 我很抱歉,我不小心从我的代码中复制粘贴了一些愚蠢的东西。我已经更新了准备好的语句查询,其中充满了愚蠢的东西。我相信现在是正确的。同样的问题:)

标签: php mysqli prepared-statement mariadb sql-injection


【解决方案1】:

您没有传递任何输入参数的引用。

$delete_post_query = mysqli_query($con, "UPDATE posts SET deleted='yes' WHERE id='$post_id'"); 

这个查询说要删除,你也给了$post_id但在下面

mysqli_stmt_bind_param($stmt, "ss",$friend_array,$user_to_remove);

你有绑定参数,服务器找不到它的引用。你的查询应该是这样的

$delete_post_query = mysqli_query($con, "UPDATE posts SET deleted='yes' WHERE id=?"); 

和绑定参数应该是这样的。由于您只有一个引用?,您只能绑定一个参数。同样id 是int 然后使用i 如果string 然后使用s

mysqli_stmt_bind_param($stmt, "i",$user_to_remove);

//新方式

$stmt = $con->prepare("UPDATE posts SET DELETED='yes' WHERE id=?");
$stmt->bind_param("i",$user_to_remove);
$stmt->execute();

【讨论】:

  • 嘿,谢谢。我犯了一个愚蠢的错误,复制粘贴我的代码。请参阅上面的编辑代码。关于您使用 'i' 表示 int 的建议,我尝试过,但不幸的是无济于事。
  • 顺便说一句,我认为问题可能与绑定参数有关。 (当我删除在 bind_params 中使用的实际变量的占位符时,它似乎有效)。
【解决方案2】:

由于您使用的是 MySQLi,因此您可以对代码采取不同的方法,并使用类似

if(isset($_POST['result'])) {
    if($_POST['result'] == 'true'){
        $id = $_POST['post_id']; // make sure to define id
        $delete_post_query = "UPDATE posts SET deleted='yes' WHERE id=? LIMIT 1"
        if ($stmt = $mysqli->prepare($delete_post_query))
        {
            $stmt->bind_param("i",$id);
            $stmt->execute();
            $stmt->close();
        }
    }
}

【讨论】:

  • 谢谢。 Id 有一个唯一的约束,所以可能不需要限制(我也不是百分百确定 LIMIT 是否与 UPDATE 的语法兼容)。关于上述方法,它似乎是面向对象的方法。我试过给它一个公平的机会,但它没有用。 (此外,API 似乎并没有暗示程序风格和 OO 风格之间的区别)
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2012-03-17
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多