2017-09-08 3 views
0

MySQLクエリの出力に基づいてデータの配列を作成しようとしています。MySQLは、変数に関連付けられたすべての値を提供する場合はそれを選択するか、提供されていない場合は空を含めてすべてを選択します。

私は、ユーザがドロップダウンボックスから都市を指定できるようにしたいと思います。この場合、関連する都市のみが返されるエントリが必要です。ユーザーが都市を選択していない場合

は批判的に(すなわち、空白のままに)私は彼らがむしろデータのなしよりすべてのデータを見てみたいです。

マイコード

// Parameters for order 
    $ordercity = (! empty($_GET['city'])) ? $_GET['city'] : '%'; // Set a wildcard if not provided 
    $exclstatus = 'wc-refunded'; // Set any excluded statuses 

    // Get the order details 
    $orderdata = $wpdb->get_results(" 
     SELECT 
     posts.post_status, 
     posts.id as post_id, 
     meta1.meta_value AS city, 
     meta2.meta_value AS company, 
     meta3.meta_value AS email 
     FROM 
     wp2_posts posts, 
     wp2_postmeta meta1, 
     wp2_postmeta meta2, 
     wp2_postmeta meta3 
     WHERE posts.ID = meta1.post_id  
      AND posts.post_status NOT LIKE '$exclstatus' 
      AND meta1.meta_key LIKE '_billing_city' 
      AND meta1.meta_value LIKE '$ordercity' 
      AND meta1.post_id = posts.id 
      AND meta2.meta_key LIKE '_billing_company' 
      AND meta2.post_id = posts.id 
      AND meta3.meta_key LIKE '_billing_email' 
      AND meta3.post_id = posts.id 
    ", ARRAY_A); 

私の現在のアプローチの限界は

私の現在のアプローチは、市が設定されていない場合は「%」ワイルドカードでの$ ordercityを移入することです。

これは、_billing_cityの値を持つ(つまり空ではない)レコードのみが選択されるため、これは限られています。

私の研究

条件文を使用して提案し、このStack Overflow postは面白かったが、それは不必要と思われるとあれば、非常に長い息切れすることができ、2つの非常に類似したクエリ(AND meta1.meta_value LIKE '$ordercity'と1なしのものを)持っている私を必要とします私は複数の変数を持っています。

は、私はまた、SQL WildcardsにW3学校のアドバイスをチェックアウトしてきましたが、私はそれが何か何も「

答えて

0

私はRahulの提案に触発されたこれに対する答えを思いつきました。

基本的に、パラメータが設定されていない場合は、PHPを使用して ''に設定します。 SQLで、そのパラメータが「 '続行する」に設定されている場合は、そのパラメータを使用します。

// Parameters for order - if it isn't set, set it to '' 
$ordercompany = (! empty($_GET['company'])) ? $_GET['company'] : ''; 
$exclstatus = 'wc-refunded'; // Set any excluded statuses 


// Get the order details 
$orderdata = $wpdb->get_results(" 
    SELECT 
    posts.post_status, 
    posts.id as post_id, 
    meta1.meta_value AS company, 
    meta2.meta_value AS city, 
    meta3.meta_value AS email 
    FROM 
    wp2_posts posts, 
    wp2_postmeta meta1, 
    wp2_postmeta meta2, 
    wp2_postmeta meta3 
    WHERE posts.ID = meta1.post_id  
     AND posts.post_status NOT LIKE '$exclstatus' 
     AND meta1.meta_key LIKE '_billing_company' 
     // This is the important bit! 
     AND ('$ordercompany = '' OR meta1.meta_value LIKE '$ordercompany') 
     AND meta1.post_id = posts.id 
     AND meta2.meta_key LIKE '_billing_city' 
     AND meta2.post_id = posts.id 
     AND meta3.meta_key LIKE '_billing_email' 
     AND meta3.post_id = posts.id 
", ARRAY_A); 
0

がある場合

を言って OR条件を追加しないのはなぜフィールドを選択しますワイルドカード上の任意のガイダンスを参照してくださいに失敗しています
AND (meta1.meta_value LIKE '$ordercity' OR meta1.meta_value IS NULL) 
+1

ただし、ユーザーが特定の値を選択してもNULL値は選択されませんシティ? – Manav

+0

@Manav、それはOPが望んでいると信じています – Rahul

+0

@rahul。都市が選ばれた場合は空の値を表示したくなかったが、都市が選択されていない場合はそれらを表示したかった。私はあなたの提案に基づいて解決策を含めるように私の質問を更新しました。ありがとう。 – LauraTheExplorer

1

ダーティトリック。 クエリは文字列です。

if ($city != "") $wheee = "AND city = 'whatever' "; 

[...] 
WHERE posts.ID = meta1.post_id ".$wheee." 
    AND posts.post_status NOT LIKE '$exclstatus' 
    AND meta1.meta_key LIKE '_billing_city' 
[...] 
+0

あなたのソリューションは、SQL脆弱性の可能性を持つコードを提案します。 –

+0

私はあなたの意見を見ますが、それは(汚い)方法論の答えであり、条件はちょうど$ wheeeがどこから来るかを示すためのものです。あなたのコメントは正当な警告として立っています。 – deg

関連する問題