2009-05-22 10 views
0

J'essaie actuellement d'extraire des données de MYSQL en utilisant PHP et je continue à obtenir l'erreur suivante:Problème avec instruction SQL en utilisant PHP

« Impossible de récupérer les enregistrements: Vous avez une erreur dans votre syntaxe SQL; vérifier le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '% PC4198% OU oem comme% Fluke%' à la ligne 1 "

Mon instruction SQL est la suivante:

$sql = "SELECT * FROM account WHERE `NSC ID` LIKE %".$nscid."% OR oem LIKE %".$oem."%"; 

Toute aide est grandement appréciée éd.

Répondre

10

Vos chaînes doivent être citées:

$sql = "SELECT * FROM account WHERE NSC ID LIKE '%".$nscid."%' OR oem LIKE '%".$oem."%'"; 

Cela dit, vous devriez vraiment envisager d'utiliser AOP ou d'un ORM.

Edit:

Le point principal de l'utilisation PDO est, comme le projet de loi dit, pour éviter l'injection SQL (causée par concaténer des chaînes éventuellement sales dans SQL).

La même requête, dans le style AOP, serait:

$query = $connection->prepare('SELECT * FROM account WHERE NSCID LIKE :nscid OR oem LIKE :orm'); 
$query->bindValue(':nscid', '%'.$nscid.'%', PDO::PARAM_STR); 
$query->bindValue(':oem', '%'.$oem.'%', PDO::PARAM_STR); 

Il est un peu plus de code, mais il vous protégera de la plupart (tous?) Les injections SQL, en laissant la bibliothèque faire l'Évasion.

(Les types de paramètres pour bindValue sont facultatifs, mais les bonnes pratiques.)

+0

+1 pour la dernière phrase utile – alex

+1

Il serait utile d'expliquer comment ces interfaces aiderait à ca Josh se. Son erreur était simplement un échec de délimiter un littéral de chaîne entre guillemets. Vous pouvez anticiper des problèmes d'injection SQL en raison de son interpolation de variables PHP dans la chaîne SQL, mais ce n'est pas clair à partir de votre réponse. –

+0

Merci à vous deux! Ça a marché!!! –

1

encore mieux encore, les opérateurs {et} peut vous permettre de le faire

$sql="SELECT * FROM account WHERE NSC ID Like '%{$nscid}%' OR oem LIKE '%{$oem}%'"; 

vous ne avez pas besoin de {} si son un var comme ça, mais si vous utilisez un objet que vous ne les besoin:

$hi_example="yarg i am a {$person->type}"; 
+0

Merci à vous deux! Ça a marché!!! –

Questions connexes