2

検索機能に使用するこの foreach ループがあります。

$keywords=$_GET['keyword']; 
$exploded=explode(' ',trim($keywords));
$mysql_command="SELECT * FROM items WHERE completed='1' AND ";

foreach ($exploded as $key => $value){
    if ($key>0)
        $mysql_command.=' OR ';

    $mysql_command.="title LIKE ? OR description LIKE ?";
        }

この準備済みステートメントを使用したい:

$stmt=$cxn->prepare($mysql_command);
$stmt->execute(array("%$value%","%$value%"));

問題は、キーワードがいくつあるか分からないことです。では、未知の数のキーワードを使用して準備済みステートメントを作成するにはどうすればよいでしょうか?

よろしくお願いします。よろしく

4

2 に答える 2

3

このようなリクエストの後に配列を作成しない理由:

$params=Array();
foreach($exploded as $key => $value){
  $params[]="%$value%";
}
$stmt->execute($params);
于 2012-05-19T12:19:42.887 に答える
0

executemysqli では、またはbind_param配列を直接呼び出すことはできません。call_user_func_array次のように、それを使用する必要があります。

call_user_func_array(array($stmt, "bind_param"), array("s", "%test%"));

次に、配列を構築するために、これを使用できます。

class BindParam{
    private $v = array("");

    public function add( $type, &$value ){
        $this->v[0] .= $type;
        $this->v[] = &$value;
    }

    public function get(){
        return $this->v;
    }
} 

これは、このhttp://php.net/manual/en/mysqli-stmt.bind-param.php#109256の微調整バージョンです。次に、次のように使用します。

$searchTerms = explode(' ', $filter);
$searchTermBits = array();
foreach ($searchTerms as $term) {
    $term = trim($term);
    if (!empty($term)) {
        $searchTermBits[] = "title LIKE ?";
        $a = '%'.$term.'%';
        $bindParam->add('s', $a); // can't pass by value
    }
}
$filter_sql = "WHERE " . implode(' AND ', $searchTermBits);

/*...*/

call_user_func_array(array($stmt, "bind_param"), $bindParam->get());
于 2014-02-05T00:30:44.313 に答える