2016-04-28 19 views
0

@ chris85の助けを借りて動的mysqliクエリを作成しています。私はこれを作成することができます。Mysqli:mysqli_stmt :: bind_param():変数の数がプリペアドステートメントのパラメータの数と一致しません

<?php 
require_once 'include/db.php';  
$firstname = 'Alpha'; 
$lastname = 'Romeo'; 

$query = "SELECT * FROM users"; 

$cond = array(); 
$params = array(); 

if (!empty($firstname)) { 
    $cond[] = "fname = ?"; 
    $params[] = $firstname; 
} 

if (!empty($lastname)) { 
    $cond[] = "lname = ?"; 
    $params[] = $lastname; 
} 

if (count($cond)) { 
    $query .= ' WHERE ' . implode(' AND ', $cond); 
} 
echo $query; 
$stmt = $mysqli->prepare($query); 
if(!empty($params)) { 
    foreach($params as $param) { 
     $stmt->bind_param("s", $param); 
     echo $param; 
    } 
} 
$stmt->execute(); 

?> 

私はこれを実行します。

SELECT * FROM users WHERE fname = ? AND lname = ? 
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /home/u983213557/public_html/test.php on line 32 
AlphaRomeo 

なぜ失敗しているのかわかりません。この問題を解決するように私に助言してください。

+0

を使用するようにバインドされていますbind_param() 'を一度に1つのparamでループします。あなたは、**すべての**パラメタと同時に '$ stmt-> bind_param()'を実行する必要があります。 – Sean

+0

いいえ、それはできません;そうすれば、 ' - > bind_param'をループするだけで1つのバインド型になります。したがって、' foreach'を使用したときに 's'をスタックしませんでした。その問題に関する回避策はすでにたくさんあります。http://php.net/manual/en/mysqli-stmt.bind-param.php、そこにマニュアル入力を確認してください。 – Ghost

+0

@Sean rodrigoご意見ありがとうございます。それはあなたが私にそれを修正する方法を助言することができますそれは非常に役に立つだろう。私は動的なクエリを作成しています。なぜなら、単純にバインドパラメータをハードコードできないからです。 – Ironic

答えて

2

mysqliがPDOでなく、ループでバインドできないため、失敗しています。従ってyou have to use tricks to bind an array in mysqli。幸いにも、あなたのPHPのバージョンが5.6または7の場合、あなたはこのコードを使用することができますされていない場合

$stmt = $db->prepare($query); 
$types = str_repeat('s', count($param)); 
$statement->bind_param($types, ...$param); 
$statement->execute(); 

を、あなたはあなたが `$ stmt->を行うことはできませんcall_user_func()ベースのソリューション

+0

あなたが少し説明すればそれは素晴らしいでしょう。私はPHP 5.5 + – Ironic

+0

を使用していますあなたはリンクに続く5.5 - フレンドリーなコードを見つけるでしょう。 –

+0

私はそのリンクを確認しましたが、理解するのは少し難しいです。 – Ironic

関連する問題