次のコードがあります。
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 WHERE
contact_first_name IN (%s, %s) OR
contact_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;
準備を完全に削除しても、同じ結果になります。私は何が欠けていますか?条件を削除してOR
1 つの値だけをチェックすると、問題なく動作しますが、OR はクエリを強制終了します。
EDIT 4これが解決策であることがわかりました:
$results = $wpdb->query($query, $search, $search);
2 番目の $search 変数がありませんでした... *まだ頭をかきむしっている