1

複数の選択を有効にして、HTML 選択入力を使用しています。選択したオプションを調べて、SQL を処理しようとしています...ただし、選択ステートメントが正しい場合は、SQL から警告が表示されます。 JOIN が制限を超えているため、"SET SQL_BIG_SELECTS = 1" を使用する必要がありますか?

これが私のクエリです:

"
        SELECT wposts.*, wpostmeta.* 
        FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->postmeta wpostmeta2, $wpdb->postmeta wpostmeta3 
        WHERE wposts.ID = wpostmeta.post_id 
            AND wposts.ID = wpostmeta2.post_id 
            AND wposts.ID = wpostmeta3.post_id 
            AND wpostmeta.meta_key = 'listing_subtype' 
                AND wpostmeta.meta_value = '$search_home_type' 
            AND wpostmeta2.meta_key = 'map_area' 
                AND ";

                $count = 0;
                foreach ($params['search_map_area'] as $map_area) :
                    if ( $count != 0 ) :
                        $querystr .= "OR ";
                    endif;
                    $querystr .= "wpostmeta2.meta_value = '$map_area' ";
                    $count++;
                endforeach;

    $querystr .= "AND wpostmeta3.meta_key = 'price_current' 
                AND wpostmeta3.meta_value BETWEEN $search_price_min AND $search_price_max 
            AND wposts.post_status = 'publish' 
            AND wposts.post_type = 'vreb_property' 
        ORDER BY wposts.post_date DESC 
        LIMIT 0, 20
        ";

これを照会するより良い方法はありますか? OR wpostmeta2.meta_value = '$map_area'私のスクリプトがタイムアウトする原因と思われるのは倍数です...

4

1 に答える 1

0
    FROM $wpdb->posts wposts, 
        INNER JOIN $wpdb->postmeta wpostmeta ON wposts.ID = wpostmeta.post_id
        INNER JOIN $wpdb->postmeta wpostmeta2 ON wposts.ID = wpostmeta2.post_id
        INNER JOIN $wpdb->postmeta wpostmeta3 ON wposts.ID = wpostmeta3.post_id 
    WHERE ...

JOIN ... ON を使用することは、WHERE クラスにすべての ID 関係を含めるよりもおそらく好まれます。


実際にはパラメーター化されたクエリを使用する必要があるため、使用している文字列を適切にエスケープしていないように見えるため、SQL インジェクションにさらされることはありません。http://www.php.net/manual/en/mysqli.real-escape-string.php

しかし、プライベート/内部アプリとセキュリティに取り組んでいる場合...

            $temp = "'" . implode("','", $params['search_map_area']) . "'";
            if($temp != "''")
                $querystr .= "wpostmeta2.meta_value IN ($temp)";
            else
                $querystr .= " 1=1 ";

複数の「OR col = 'val'」の代わりに IN キーワードを使用することも推奨されます。

于 2013-02-13T19:53:22.893 に答える