2

次のようなテーブルで検索を試みています: http://www.phpjabbers.com/free-scripts/mysql-search-table/search.php

検索フォーム $_GET に応じて文字列を連結できることがわかったので、パラメーターを取得した後にすべてをクエリできます。

$query = "SELECT * FROM table WHERE status = 1"
if($_GET['param1']{
  $query = $query." AND param1 = ?";
}
$stmt = $mysqli->prepare($query);

追加する必要がなければ、それは完璧です:

$stmt->bind_param('i',$_GET['art']);

この投稿の指示に従っていました: https://stackoverflow.com/a/11152781/679333、しかしワイルドカード部分は機能しませんでした。その for ループの代わりに、変数を配列にプッシュするときに変数を参照しました。

array_push($user_terms, &$_GET['var']);

動作しますが、「非推奨: 呼び出し時の参照渡しは非推奨です」という警告が表示されます。

Call-time pass-by-reference has now been killed from PHP を読んだので、警告を無視したくありません。

4

1 に答える 1

3

少しずさんですが、仕事を成し遂げます。

function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}

$params = array();

$query = "SELECT * FROM table WHERE status = 1";

// Iterate over your paramters from $_GET
foreach ($_GET as $k => $v) 
{ 
  if(!empty($v)
  {
    $query .= " AND $k = ?";
    $params[$k] = helper::sanitize($v);
  }
}
// After you get through all your params...

$stmt = $mysqli->prepare($query);

// Bind em.
call_user_func_array(array($stmt, 'bind_param'), refValues($params));

これまでに mysqli にバインドしたことはありませんが、それで問題は解決するはずです。それがどのように機能するか教えてください。

于 2012-09-18T22:51:37.047 に答える