使用预准备语句的Mysql更新查询给出了错误

时间:2018-01-06 00:56:47

标签: php mysql mysqli prepared-statement

我在下面的代码中收到以下错误。

  

警告:mysqli_stmt :: bind_param():变量数量与第39行C:\ wamp \ www \ purev \ admin \ edit.php中预准备语句中的参数数量不匹配

if(isset($_POST['submit'])){
    $post_title = $_POST['posttitle'];
    $content = $_POST['content'];
    $author_name = $_POST['authorname'];
    $category = $_POST['category'];
    $post_date = $_POST['postdate'];

    if(isset($_FILES['image']['name']) && ($_FILES['image']['name'] !="")){
        $size=$_FILES['image']['size'];
        $temp=$_FILES['image']['tmp_name'];
        $type=$_FILES['image']['type'];
        $image_name=$_FILES['image']['name'];
        unlink("../images/"."$image_name");

        move_uploaded_file($temp,"../images/$image_name");
    }

//-------------------UPDATE POST------------------------

    $sql = 
        "UPDATE blog_posts 
            SET post_title='$post_title', 
            content='$content', 
            author_name='$author_name', 
            category='$category', 
            post_date='$post_date',
            image='$image_name'
            WHERE post_id='$id'";

    $stmt = $con->prepare($sql);

    $stmt->bind_param("sssssii", $post_title, $content, $author_name, $category, $image_name, $post_date, $id);
    $stmt->execute();

不使用预准备语句查询有效。你有任何想法如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

评论中说过,你错过了占位符。

所以,改变:

$sql = 
    "UPDATE blog_posts 
        SET post_title='$post_title', 
        content='$content', 
        author_name='$author_name', 
        category='$category', 
        post_date='$post_date',
        image='$image_name'
        WHERE post_id='$id'";

为:

$sql = 
    "UPDATE blog_posts 
        SET post_title=?, 
        content=?, 
        author_name=?, 
        category=?, 
        post_date=?, 
        image=? 
        WHERE post_id=?";

就这么简单。

本手册包含正确的语法:

不要忘记以正确的顺序传递参数。它们应该以与查询中使用的顺序相同的顺序传递(您将图像与发布日期交换),因此它应该是:

$stmt->bind_param("ssssisi", $post_title, $content, $author_name, $category, $post_date, $image_name, $id);