web-dev-qa-db-ja.com

MySQLクエリLIKEが機能しない

私はこのコードを使っています。

$blog_list = $wpdb->get_results( "SELECT " . $extra . "blog_id, last_updated FROM " . $wpdb->blogs. " WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted ='0' AND UPPER(blog_name) LIKE 'A%'" . $order . " " . $limit . "", ARRAY_A );

しかし、そのLIKEステートメントAND UPPER(blog_name) LIKE 'A%'"は機能しません。誰もが私に解決策を与えることができますか?

ありがとう

更新:

実際に私はこのコードを使っています

$where = ''; 
if ($filter) { 
$where = "AND UPPER(blog_name) LIKE '".strtoupper($filter)."%' "; 
}

だから私は後でAND UPPER(blog_name) LIKE 'A%'"$whereに置き換えるつもりです

注:私のネットワークには500を超えるブログがあります。

すべてのブログ名をアンカーリンク付きでページに表示したい。しかし、私はすべてのブログの名前をロードしたくはありません。だから私はアルファベット順ナビゲーションを達成しようとしています。ユーザーがリンク「A」をクリックすると、ブログ名が「A」で始まるページが表示されます。同様にB、Cなど.

もし興味があるなら、これは フルコード です。

1
Giri

クエリを準備しましょう。

global $wpdb;
$wpdb->get_results( 
    $wpdb->prepare( 
        "SELECT %s blog_id, last_updated FROM %s WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted ='0' AND UPPER(blog_name) LIKE '%s' %s %s ", ARRAY_A 
    ),
    $extra,
    $wpdb->blogs,
    $wpdb->esc_like( 'A%' ),
    $order,
    $limit
);

prepareなしでデータを送信することは決してありません!また:like_escape()のように、データを正しく準備するのに役立つ関数がいくつかあります。

まだA%のようなものを検索したいのですが…

3
kaiser

@kaiserが言ったことに加えて:

このテーブルにはblog_nameフィールドがありません...あなたのクエリには他のSQLが含まれているように見えますが、それなしでは何が間違っているのかわかりません。

where is blog_name

更新ブログ名が存在する唯一の場所は、個々のブログオプションテーブルにあります。だからあなたはこれをしなければならないだろう後あなたが今いることをするために:

public = 1 && achieved = 0 && mature = 0 && spam = 0 && deleted = 0であるあなたのブログIDをすべて読んでください。それはあなたのケースでは約500レコードを返すだろうという1つのクエリです。次に、各レコードについて、各ブログオプションテーブル{prefix}_{ID}_optionsを読み、option_name = 'blogname'を含む行を見つけて、そのレコードが選択した文字で始まっているかどうかを確認する必要があります。

たぶん上記のことは1つの大規模なMySQLクエリで可能ですが、私はそれをまとめるのが嫌いです。

私はこれ以上助けられない。私自身の新しいテーブルを作成し、それを検索する必要のある情報で最新に保つことを検討した後に、あなたが何をしているのかを私が探していたのであれば。私は新しいサイトが追加/更新/削除されたときにそれが私が作成したこのテーブルを更新することを確実にするために利用可能なフックを使用するでしょう。

1
Brady