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

+0

спасибо, я добавлю $ q = mysql_real_escape_string (strtolower ($ _ GET ["q"])); – Patrick

+0

Какова структура «search_zipcodes»? Каковы уникальные ключи? – Thomas

ответ

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

У меня нет учетной записи пользователя pdo – Patrick

+0

@Patrick: приставать к вашему хосту для установки Это не так, потому что это не так. В противном случае подумайте о том, чтобы получить настоящего хоста, который обслуживает своих клиентов.Если вы действительно хотите остаться там, где вы находитесь, драйвер mysqli поддерживает подготовленные операторы, но не так хорошо использовать его как PDO. – outis

0

Это звучит так, как будто вы просто просите ОШ:

$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 "; 

EDIT Вы можете посмотреть более подробную информацию о получении результатов из запроса, но может попробовать что-то вроде:

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

Или

Это набивает результаты в массив с каждой записи массива, являющимся массивом значений столбцов и падает последний, который всегда будет пустым.

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

Как бы выглядел массив fetch ... и будет ли этот метод очень быстрым для производительности? – Patrick