2009-10-22 5 views
-1

Je travaille sur une fonction de recherche, il fonctionnait très bien il y a quatre jours, maintenant il est de retour cette erreurPhp Syntaxe Aide

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'ET état =' AZ '' à la ligne 1

quelle est la syntaxe appropriée pour cette ligne?

if($search_state !== "") { 

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

la partie entière est:

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

} 

Répondre

7

Vous ne pouvez pas mettre AND conjonctions pour votre article WHERE après une ORDER BY. Votre clause ORDER BY doit venir après l'intégralité de la clause WHERE.

+1

Il a raison :-) Vous pouvez également avoir des espaces parasites (comme le "'") dans $ query. = "AND state ='". $ search_state. "'"; – DilbertDave

+0

Ouais. Celui-là est encore meilleur car il ne provoquera pas une erreur de syntaxe dans la requête, il le fera simplement fonctionner silencieusement. – chaos

+0

génial, merci beaucoup! –

0

La partie WHERE vient avant les AND dans votre code, ce qui est faux. C'est ce que vous voulez

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

En outre, pour être complet, vous pouvez faire un peu le code plus facile à lire:

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

parce que votre chaîne est le double cité

0

Vous devez mettre les déclarations AND après le where, et avant le sort_by. Déplacez le sort_by à la fin du php (ajoutez à la chaîne de requête), et cela devrait fonctionner.

0

Essayez ceci:

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

Comme cela a été dit par d'autres, votre déclaration order by doit venir en dernier. En outre, vous avez des espaces entourant le nom de la ville dans la partie city = de la requête. Bien que cette syntaxe SQL soit valide, elle ne renvoie que les résultats où le nom de la ville est entouré d'espaces. Je suppose que ce n'est pas ce que tu voulais.

En outre, vous souhaiterez peut-être ajouter d'autres champs à votre order by. À l'heure actuelle, il sera classé par État, mais les enregistrements reviendront au hasard par état. Peut-être quelque chose comme

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

Enfin, juste votre information, si vous n'êtes pas désinfectante soigneusement vos entrées de recherche, cette approche est susceptible d'injection SQL.

0

Je pense que cela pourrait fonctionner:

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

Modifier: La version originale utilisée vide, il aurait dû être vide. C'est corrigé maintenant.

Édition 2: Cela suppose également que vous avez déjà nettoyé les variables en utilisant mysql_real_escape_string ou similaire.

Notez que ORDER BY doit être après les clauses WHERE.

implode prend un tableau et le transforme en une chaîne avec la chaîne spécifiée entre les éléments.Donc, étant donné:

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

vous pouvez faire

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

qui mettrait "A et B et C" dans $myString.

+0

C'est vraiment un conseil utile. Je vous remercie. J'ai utilisé ce script sur la page. –

0

En outre, vous semblez avoir des espaces entre les guillemets simples et doubles qui rendront la requête comme ceci: AND état = 'AZ' qui n'est probablement pas ce que vous voulez. Vous pouvez également éviter les citations et concaténations supplémentaires en PHP en utilisant cette syntaxe:

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

Bien sûr, je dois mentionner que vous devez vos entrées désinfectez pour protéger contre l'injection SQL.