Справка по синтаксису Php - PullRequest
0 голосов
/ 22 октября 2009

Я работаю над функцией поиска, четыре дня назад она работала нормально, теперь возвращает эту ошибку

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'AND state =' AZ '' в строке 1

каков правильный синтаксис для этой строки?

if($search_state !== "") {

$query .="AND state =  '" . $search_state .  " ' " ;

вся порция:

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ORDER BY state ASC ";

if($search_co !== "") {

$query .= "AND name LIKE '%" . $search_co ."%' ";

}


if($search_first !== "") {

$query .= "AND contact LIKE '%" .$search_first."%' ";

}

if($search_last !== "") {

$query .= "AND contact LIKE '%" .$search_last."%' ";

}

if($search_city !== "") {

$query .="AND city = ' " . $search_city . " ' ";

}

if($search_state !== "") {

$query .="AND state =  '" . $search_state .  " ' " ;

}

Ответы [ 6 ]

7 голосов
/ 22 октября 2009

Вы не можете поставить AND союзы для вашего WHERE предложения после ORDER BY. Ваше предложение ORDER BY должно следовать после полного предложения WHERE.

0 голосов
/ 22 октября 2009

Кроме того, у вас, похоже, есть пробелы между одинарными и двойными кавычками, которые сделают запрос следующим образом: AND state = 'AZ', что, вероятно, не то, что вам нужно. Вы также можете избежать дополнительных кавычек и конкатенаций в PHP, используя этот синтаксис:

$query .= " AND state = '$search_state' ";

Конечно, я должен упомянуть, что вы должны дезинфицировать свои входные данные для защиты от SQL-инъекций.

0 голосов
/ 22 октября 2009

Я думаю, это может сработать:

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new ";

$conditions = array();

if(!empty($search_co)) {
    $conditions[] = "name LIKE '%" . $search_co ."%' ";
}

if(!empty($search_first)) {
    $conditions[] = "contact LIKE '%" .$search_first."%' ";
}

if(!empty($search_last)) {
    $conditions[] = "contact LIKE '%" .$search_last."%' ";
}

if(!empty($search_city)) {
    $conditions[] = "city = '" . $search_city . "' ";
}

if(!empty($search_state)) {
    $conditions[] = "state =  '" . $search_state .  "' " ;
}

if (count($conditions) > 0) {
    $query .= " WHERE " . implode(' AND ', $conditions);
}

$query .= " ORDER BY state ASC";

Редактировать: оригинальная версия была пустой, она должна была быть пустой. Это сейчас исправлено.

Редактировать 2: это также предполагает, что вы уже очистили переменные, используя mysql_real_escape_string или аналогичный.

Обратите внимание, что ORDER BY должен быть после предложений WHERE.

implode берет массив и превращает его в строку с указанной строкой между элементами. Итак, учитывая:

$myArray = array('A', 'B', 'C');

вы можете сделать

$myString = implode(' and ', $myArray);

, который поместил бы "A и B и C" в $myString.

0 голосов
/ 22 октября 2009

Попробуйте это:

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ";  

if($search_co !== "") {
    $query .= "AND name LIKE '%".$search_co."%' ";
}

if($search_first !== "") {
    $query .= "AND contact LIKE '%".$search_first."%' ";
}

if($search_last !== "") {
    $query .= "AND contact LIKE '%".$search_last."%' ";
}

if($search_city !== "") {
    $query .= "AND city = '".$search_city."' ";
}

if($search_state !== "") {
    $query .= "AND state = '". $search_state."' " ;
}

$query.= "ORDER BY state ASC"  

Как говорили другие, ваше order by заявление должно быть последним. Кроме того, у вас есть пробелы вокруг названия города в части запроса city =. Хотя это допустимый синтаксис SQL, он будет возвращать результаты только в том случае, если название города заключено в пробелы. Я предполагаю, что это не то, что вы хотели.

Кроме того, вы можете добавить еще несколько полей к вашему order by. Прямо сейчас, это будет заказывать по штатам, но записи будут возвращаться случайным образом по штатам. Может быть, что-то вроде

$query.= "ORDER BY state, city, name, id" 

Наконец, просто к вашему сведению, если вы не проводите тщательную очистку входных данных для поиска, этот подход подвержен SQL-инъекции.

0 голосов
/ 22 октября 2009

Вам нужно поместить операторы AND после где и перед sort_by. Переместите sort_by в конец php (добавьте в строку запроса), и он должен работать.

0 голосов
/ 22 октября 2009

Часть WHERE идет перед AND в вашем коде, что неверно. Это то, что вы хотите

$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ";

if($search_co !== "") {

$query .= "AND name LIKE '%" . $search_co ."%' ";

}
...
$query .= " ORDER BY state ASC ";

Кроме того, для полноты вы можете сделать код немного легче для чтения:

$query .= "AND name LIKE '%$search_co%' ";

потому что ваша строка в двойных кавычках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...