Php sözdizimi Yardım

5 Cevap php

Ben dört gün önce sorunsuz çalışıyordu, bir arama fonksiyonu üzerinde çalışıyorum, şimdi bu hatayı dönen ediyor

Eğer SQL sözdizimi bir hata var; line 1 yakınlarındaki 'AND devlet =' AZ'' kullanmak için doğru sözdizimi için MySQL sunucu sürümü karşılık kılavuzunu kontrol

Bu hat için doğru sözdizimi nedir?

if($search_state !== "") {

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

tüm kısmıdır:

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

}

5 Cevap

Bir ORDER BY sonra WHERE fıkra için AND Bağlaç koyamazsınız. Sizin ORDER BY fıkra WHERE fıkra bütünlüğü sonra gelmek zorundadır.

Bu deneyin:

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

Başkaları tarafından söylendiği gibi, sizin order by deyimi son gelmek zorunda. Ayrıca, sorgu city = bölümünde çevresindeki kente adını boşluk vardı. Bu geçerli bir SQL sözdizimi iken, sadece şehir adını boşluklarla çevrili sonuçları döndürmek için gidiyor. Ben ne istediğini değil tahmin ediyorum.

Ayrıca, sizin order by için biraz daha fazla alan eklemek isteyebilirsiniz. Şu anda, o devlet tarafından sipariş edecek, ama kayıtları devlet tarafından rastgele geri gelecektir. Belki bir şey gibi

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

Eğer dikkatli bir şekilde arama girişleri sterilize değilseniz Son olarak, sadece Bilginize, bu yaklaşım, SQL Injection açıktır.

Ne istediğiniz değil muhtemelen VE devlet = 'AZ': Ayrıca, bu gibi sorgu yapacak tek ve çift tırnak arasında boşluk var gibi görünüyor. Ayrıca, bu sözdizimi kullanarak PHP ek tırnak ve concatenations önleyebilirsiniz:

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

Tabii ki SQL enjeksiyon karşı korumak için girişleri sterilize gerektiğini belirtmek gerekir.

NEREDE bölümü yanlış olduğu, kodunuzda VE yıllardan önce gelir. Bu ne istiyorsun

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

Ayrıca, bütünlüğü uğruna, okumak kod biraz daha kolay yapabilir:

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

Dizenizin çift tırnaklı çünkü

Ben bu işe düşünüyorum:

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

Edit: Boş kullanılan orijinal versiyonu, o olmalıydı boş!. Şimdi sabit oluyor.

Düzenleme 2: Bu da zaten mysql_real_escape_string veya benzer kullanarak değişkenleri dezenfekte ettik varsayar.

ORDER BY NEREDE maddelerine sonra olması gerektiğini unutmayın.

implode bir dizi alır ve öğeleri arasındaki belirtilen dize ile bir dizeye dönüştürür. Yani, verilen:

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

Yapabileceğiniz

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

$myString içine "A ve B ve C" koymak hangi.