2016-07-06 10 views
4

私は3つのパラメータを使用して検索できる自分のウェブサイトの検索機能を構築しています。ユーザーは、3を入力してテーブルをフィルタリングするか、まったくフィルタリングしないかを選択して、テーブル全体を受信することができます。私は、ユーザーが入力したものに応じて動的にクエリを構築する方法を考え出しましたが、適切な数の引数と正しい順序でbind_params()を呼び出すのに問題があります。params配列の動的バインディングMySQLi

コード:

$sql = "SELECT position, rank, fullname, phonenumber, email, division 
FROM `table` WHERE 1=1 "; 


if(!empty($_POST['fname'])){ 
    $firstname = $_POST['fname']; 
    $sql .= " AND `fullname` LIKE '%?%'"; 
} 


if($_POST['div'] !== "All"){ 
    $division = $_POST['div']; 
    $sql .= " AND `division` LIKE '%?%'"; 
} 


if(!empty($_POST['pos'])){ 
    $position = $_POST['pos']; 
    $sql .= " AND `position` LIKE '%?%'"; 
} 


$stmnt = $db->prepare($sql); 
$stmnt -> bind_param('sss', $firstname, $division, $position); 
$stmnt -> bind_result($position, $rank, $fullname, $phonenumber, $email,$division); 
$stmnt -> execute(); 

私はいつもこのエラーが出る:Number of variables doesn't match number of parameters in prepared statement私はそれを取得していますなぜ私は理解しますが、私は複数のものを試してみましたが、何も働いていません。あらゆるヒントや文書へのリンクが役立ちます。おかげ

+2

これは、名前付きプレースホルダを持っているので、PDOで行う方が簡単であることに注意してください。単に 'arr ay() '構造体を' execute() 'に置き換えます。 – tadman

+0

@tadmanあなたが気にしないなら、例に私を指摘できますか? – ybce

+0

注:結果を実行してバインドします。 http://php.net/manual/en/mysqli-stmt.bind-result.phpこれはおそらく、ここでの大きな障害です。条件のすべてが満たされ、すべてのPOST配列に値が含まれていることを確認してください。そのうちの1つが失敗した場合、クエリも失敗します。 –

答えて

2

あなたは配列としてあなたのデータやパラメータを渡すことができます。

$data = array(); 
$format = array(); 

if(!empty($_POST['fname'])){ 
    $firstname = $_POST['fname']; 
    $sql .= " AND `fullname` LIKE '%?%'"; 
    $format[] = 's'; 
    $data[] = $firstname; 
} 

そして、参照機能により、パスを参照することによって、それらを渡し、call_user_func_array

if(!empty($format) && !empty($data)): 

      $format = implode('', $format); 
      $format = str_replace('%', '', $format); 

      array_unshift($data, $format); 
      call_user_func_array(array($stmnt , 'bind_param'), (referenceValues($data)); 

     endif; 

と結合:

public function referenceValues($array) 
    { 
     $refs = array(); 

     foreach ($array as $key => $value): 

      $refs[$key] = &$array[$key]; 

     endforeach; 

     return $refs; 
    } 
+0

あなたの答えをありがとう、私はPDOに切り替えましたが、将来の訪問者のためにあなたの答えを受け入れるでしょう。 – ybce