变量数与预准备语句中的参数数量不匹配

时间:2014-02-09 23:21:41

标签: php mysqli prepared-statement

public function insert_new_listing($listing_assoc_array) {
    global $public_connection;
    $date = (string) date("Y-m-d");
    $hit_count = 0;
    if ($stmt = new mysqli_stmt($public_connection, 'INSERT INTO laptops (brand_name, title, description, price, discount, last_change_date, hit_count) VALUES (?,?,?,?,?,?,?)')) {
        /* bind parameters for markers */
        $stmt->bind_param(
                "sssdisi", 
                $listing_assoc_array['brand_name'], 
                $listing_assoc_array['title'], 
                $listing_assoc_array['description'], 
                $listing_assoc_array['price'], 
                $listing_assoc_array['discount'], 
                $date,
                $hit_count
        );

        /* execute query */
        $stmt->execute();

我收到错误:变量数与预准备语句中的参数数量不匹配。

我在prepare语句和bind_param中有正确的数字(7)所以我不知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:3)

正如我在上面的评论中所提到的,new mysqli_stmt()不太可能返回 falsey 值。您应该使用mysqli::prepare方法,例如......

public function insert_new_listing(mysqli $conn, array $listing) {
    $stmt = $conn->prepare('INSERT INTO laptops (brand_name, title, description, price, discount, last_change_date, hit_count) VALUES (?,?,?,?,?,NOW(),0)');
    if (!$stmt) {
        throw new Exception($conn->error, $conn->errno);
    }
    /* bind parameters for markers */
    $stmt->bind_param('sssdi', 
        $listing['brand_name'], 
        $listing['title'], 
        $listing['description'], 
        $listing['price'], 
        $listing['discount']);

    /* execute query */
    if (!$stmt->execute()) {
        throw new Exception($stmt->error, $stmt->errno);
    }

您可能会注意到我使用了文字0NOW()而不是绑定$hit_count$date。看不出任何绑定已知静态值的理由。

我还将mysqli实例作为方法依赖项传递,而不是依赖于全局变量。