0

次のコードがあります。

function av_connections_search($string){
    global $wpdb;
    // remove url parameter from string
    $string = trim($string,'s=');
    $search = explode('%20',$string);
    // query the wp_connections database table according to search entry
    $sql = "
        SELECT *
        FROM {$wpdb->prefix}connections
        WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
      ";
    // prepare() to prevent sql injection
    $query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $search));
    // get query results
    //var_dump($query);
    $results = $wpdb->get_results($query);
    // return if no results
    if(empty($results)){
        return false;
    }
    // flush $wpdb cache
    $wpdb->flush();
    // return data to search.php
    return $results;
}

関数に$string渡されると、 ?s=search+these+terms のようになります

私の質問ですが、複数の WHERE ステートメントを使用するにはどうすればよいですか? 私は簡単に試しました:

WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")

しかし、それは完全に失敗します。私がする時:

WHERE contact_first_name OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")

返すだけcontact_last_nameです。私は何が欠けていますか?

編集:わかりましたので、問題はこれにあると確信しています:

$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $search));

しかし、睡眠不足のため、配列を両方の WHERE 句とマージしない理由を理解できません。

EDIT 2これは機能しませんか?単一の WHERE 句を使用するとうまく機能しますが、OR と別の句を使用すると何も返されません。これはクエリであるため意味がありません。

SELECT * FROM wp_connections WHEREcontact_first_name IN (%s, %s) ORcontact_last_nameIN (%s, %s) " [1]=> string(4) "Mina" [2]=> string(5) "Morse"

EDIT 3 prepare() が問題だとは思いません。これを考慮してください(機能しません):

global $wpdb;
$string = trim($string,'s=');
$search = explode('%20',$string);
$how_many = count($search);
$placeholders = array_fill(0, $how_many, '%s');

$format = implode(', ', $placeholders);

$query = "SELECT * FROM wp_connections WHERE contact_first_name IN($format) OR contact_last_name IN($format)";

$results = $wpdb->query($query, $search);
return $results;

準備を完全に削除しても、同じ結果になります。私は何が欠けていますか?条件を削除してOR1 つの値だけをチェックすると、問題なく動作しますが、OR はクエリを強制終了します。

EDIT 4これが解決策であることがわかりました:

$results = $wpdb->query($query, $search, $search);

2 番目の $search 変数がありませんでした... *まだ頭をかきむしっている

4

1 に答える 1