2010-04-03 110 views
0

我試圖搜索多個字段(zc_city,zc_zip和zc_state),匹配用戶輸入的單個值。這三列應該包含在結果中。這是我現在有:SELECT DISTINCT多字段搜索?

$q = strtolower($_GET["q"]); 
if (!$q) return; 

$sql = "SELECT DISTINCT zc_city AS zcity FROM search_zipcodes WHERE zc_city LIKE '$q%'"; 

$rsd = mysql_query($sql); 
while($rs = mysql_fetch_array($rsd)) { 
    $zcity = $rs['zcity']; 
    echo "$zcity\n"; 
} 

表的結構爲:

CREATE TABLE search_zipcodes (
    zc_zip VARCHAR(5), 
    zc_lat FLOAT, 
    zc_lon FLOAT, 
    zc_city VARCHAR(80), 
    zc_state CHAR(2) 
); 
+2

請注意,上面的代碼(它是當前的形式)可以SQL注入... – ChristopheD 2010-04-03 00:12:01

+0

謝謝,我會添加$ q = mysql_real_escape_string(strtolower($ _ GET [「q」])); – Patrick 2010-04-03 00:25:27

+0

「search_zipcodes」的結構是什麼?什麼是獨特的鑰匙? – Thomas 2010-04-03 00:41:33

回答

0

要返回有至少一列匹配的行,可使用OR

SELECT zc_city AS city, zc_state AS state, zc_zip AS zip 
    FROM search_zipcodes 
    WHERE zc_city LIKE :city OR zc_zip=:zip 

作爲一個準備好的查詢,這看起來像:

// connect to the DB. Should be in its own function to isolate credentials. 
$db = new PDO(...); 

// get the cities. Should be in a function/method to access DB (the data access layer). 
$findPlace = $db->prepare("SELECT zc_city AS city, zc_state AS state, zc_zip AS zip 
     FROM search_zipcodes 
     WHERE zc_city LIKE :city OR zc_zip=:zip"); 
$places = $findPlace->execute(array(':city' => $_REQUEST['q'] . '%', 
            ':zip' => $_REQUEST['q'])); 

// display places. Should be in a method of a view class. 
?> 
    <ul> 
    <?php foreach ($places as $place) { 
     echo "<li>$place[city], $place[state] $place[zip]</li>\n"; 
    } ?> 
    </ul> 

注有三不同的任務與評論劃定。每個應該屬於一個單獨的類,前兩個在第三個(數據訪問層)與第三個(架構層,如Model-View或Model-View-Controller)之間。

+0

我的web帳戶沒有安裝pdo – Patrick 2010-04-03 12:46:27

+0

@Patrick:纏住您的主機來安裝它們落後於時代,如果沒有那麼做,可以考慮讓一個真正的主機爲客戶提供服務。如果你真的想保持你的位置,mysqli驅動程序支持準備好的語句,但它不如PDO那麼好用。 – outis 2010-04-03 23:03:24

0

聽起來好像你只是要求一個OR:

$sql = "SELECT zc_city, zc_state, zc_zip FROM search_zipcodes WHERE zc_city LIKE '$q%' OR zc_state LIKE '$q%' OR zc_zip LIKE '$q%' "; 

我仍然不知道你已經說明了這張桌子上的主要關鍵。如果是Zip或Zip + City,則不需要使用DISTINCT。如果你可以有多個條目爲同一城市,州和郵編,那麼你可以使用一個GROUP BY像這樣:

$sql = "SELECT zc_city, zc_state, zc_zip FROM search_zipcodes WHERE zc_city LIKE '$q%' OR zc_state LIKE '$q%' OR zc_zip LIKE '$q%' GROUP BY zc_city, zc_state, zc_zip "; 

編輯您可以查找更多信息有關從查詢得到的結果,但你可以嘗試類似:

while ($rs = mysql_fetch_assoc($rsd)){ 
    $array[] = $row; 
} 

或者

這充塞的結果與陣列是列值的數組的每個條目的數組,並丟棄最後一個,這將永遠是空的。

while (($resultArray[] = mysql_fetch_assoc($rsd)) || array_pop($resultArray)); 
+0

如何獲取數組看起來...並且這種方法對於性能來說真的很快? – Patrick 2010-04-03 12:52:53