2013-03-03 86 views
1

嘗試在php中循環查詢字符串,但只獲取最後一個值。我應該怎麼做才能獲得所有的價值?PHP - 通過QueryString循環

例如: 查詢字符串=風格=牧場&風格=穀倉&風格=殖民

PHP:

$sqlStyle = "SELECT DISTINCT COUNT(*) as count FROM houses_single "; 
$i = 1; 
foreach ($_GET as $key => $value) { 
    if ($i == 1){ 
     $sqlStyle .= "where "; 
    }else{ 
     $sqlStyle .= " and "; 
    } 
    $sqlStyle .= $key . " like '%" . $value ."%'"; 
    $i++; 
} 
echo $sqlStyle; 

結果: SELECT DISTINCT COUNT(*)作爲計數FROM houses_single如果房子像'%colonial%'

+1

風格需要是您的HTML表單中的一個數組以傳遞多個值與鍵風格 – 2013-03-03 00:41:45

+0

房子可以是牧場和穀倉和殖民地? – James 2013-03-03 01:02:58

回答

1

在這種情況下,查詢參數「style」是一個數組,必須用方括號標識 - 如果不是,最後一個key = value對將會o寫其他人。

?style[]=ranch&style[]=barn&style[]=colonial 

$_GET['style']是一個數組,那麼你可以遍歷使用foreach

foreach ($_GET['style'] as $value) { 
    // ... 
} 

如果「風格」是不是你要添加的唯一參數,你可以在foreach使用is_array()檢查循環:

foreach ($_GET as $key => $value) { 
     if ($i == 1){ 
      $sqlStyle .= "where "; 
     }else{ 
      $sqlStyle .= " and "; 
     } 

     if(is_array($value)) { 
      $sec = array(); 
      foreach($value as $second_level) { 
       $sec[] = $key . " LIKE '%" . $second_level."%'"; 
      } 
      $sqlStyle .= implode(' AND ', $sec); 
     } 
     else { 
      $sqlStyle .= $key . " LIKE '%" . $value ."%'"; 
     } 

     $i++; 
    } 
    echo $sqlStyle; 

替代而不的foreach:

<?php 

$statement = "SELECT DISTINCT COUNT(*) as count FROM `houses_single`"; 

if(is_array($_GET)) { 
    $statement .= ' WHERE'; 

    // create copy to keep the $_GET array 
    $add_where = $_GET; 

    array_walk(function($elem,$key){ 
     is_array($elem) { 
     return implode(' AND ', array_map(function($sec) using ($key) { 
      return "$key LIKE '%$sec%'"; 
     }, $elem); 
     } 
     else { 
      return "$key LIKE '%$elem%'"; 
     } 
    },$add_where); 

    $statement .= implode(' AND ', $add_where); 
} 

(代碼是未經測試)

Sidenode關於安全:我希望你不會使用該代碼段您在生產環境,而參數的任何轉義提供。

+0

我該如何循環查詢字符串呢?我知道你爲什麼不在生產中這麼做,但我該怎麼做? – tree 2013-03-03 00:45:02

+0

更新了答案,希望這適合您的需求。爲了安全起見,請看['mysqli_real_escape_string'](http://www.php.net/manual/de/mysqli.real-escape-string.php) – HenningCash 2013-03-03 01:09:52