2013-05-31 7 views
5

なぜこのPHP警告メッセージが表示されているのかわかりません。プリペアドステートメントには4つのパラメータがあり、bind_param()には4つの変数があります。助けてくれてありがとう!PHPの警告:mysqli_stmt :: bind_param():変数の数がプリペアドステートメントのパラメータの数と一致しません

if($stmt = $mysqli -> prepare("SELECT url, month, year, cover_image FROM back_issues ORDER BY year DESC, month DESC")) { 
    $stmt -> bind_param("ssis", $url, $month, $year, $cover_image); 

    $stmt -> execute(); 

    $stmt -> bind_result($url, $month, $year, $cover_image); 

    $stmt -> fetch(); 

    while ($stmt->fetch()) { 
    echo "<li class='item'><a href='$url'><img src='$cover_image' alt='$cover_image' width='' height='' /></a><br /><span class='monthIssue'>$month $year</span></li>"; 
    } 

    $stmt -> close(); 
    $mysqli -> close(); 

} 
+0

あなたは(bind_param 'でクエリへの4つの変数を結合しています) '、ただしプレースホルダはありません – andrewsi

答えて

8
if($stmt = $mysqli -> prepare("SELECT url, month, year, cover_image FROM back_issues ORDER BY year DESC, month DESC")) { 
    $stmt -> bind_param("ssis", $url, $month, $year, $cover_image); 
    [...] 
} 

これらの行は、どんな意味がありません!あなたはパラメータを使用したい場合、あなたはかなりのように、where状態または同様にそれらを使用する必要があります:あなたはどのプレースホルダを持っていない場合はパラメータをバインドするために

$mysqli->prepare("SELECT * FROM back_issues WHERE url =? AND month =? AND year =? and cover_image = ?"); 
$stmt->bind_param("ssis", $url, $month, $year, $cover_image); 

bind_param()メソッドはエラーあなたが生成されます再実行している。さらに、IF文は何をすべきか? そのクエリが結果を生成するかどうかを確認するには、最初にクエリを実行してから、検証する必要があります。

3

この場合、パラメータをバインドする必要はありません。プレースホルダは、INSERT文またはWHERE句の値に使用されます。 (プレースホルダは、そのようなあなたの文でカラム名などの識別子のために許可されていないことに注意してください。)プレースホルダを持つ有効な、単純化された文は次のようになります。

"SELECT url, cover_image FROM back_issues WHERE month = ? and year = ?" 
関連する問題