2010-04-03 119 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