2010-05-19 6 views
1

Donc, Je peux exécuter les instructions suivantes de mysql lui-même avec succès.requête mysql instruction séparée en php

SET @fname = 'point1'; 
SELECT * FROM country WHERE [email protected];` 

Mais lorsque je tente de passer la requête par php comme celui-ci et l'exécuter, je reçois une erreur sur la deuxième ligne

$query = "SET @fname = 'point1';"; 

$query .= "SELECT * FROM country WHERE [email protected];"; 

Répondre

1

Je ne suis pas certain pourquoi il échoue, mais plutôt que d'écrire Avec les variables MySQL, pourquoi ne pas utiliser les variables PHP?

En d'autres termes,

$fname = 'point1'; 
$query = "select * from country where name = '$fname'"; 

Et l'avertissement contre l'injection SQL normale applique, bien sûr.

+0

Pourrait également utiliser une instruction préparée qui tuerait complètement l'injection SQL –

+0

Oui, je suis d'accord. J'essayais de garder les choses simples. – MJB

2

Vous ne pouvez pas exécuter plusieurs instructions via les bibliothèques mysql de PHP sans utiliser de fonction spéciale. Mais votre variable SQL doit persister via votre connexion. Ainsi, au lieu de concaténer les chaînes et de les exécuter une seule fois, exécutez chaque instruction séparément.

+0

Je ne savais pas qu'ils persisteraient. Dans Oracle, ils meurent (AFAIK) – MJB

+0

Code de signification de fonction spécial qui analyse et sépare vos instructions et exécute les requêtes séparément pour vous. – webbiedave

+0

Il y a la fonction mysqli_multi_query, mais je ne la recommande pas. –

0

Jetez également un oeil à this et this commentaires à mysql_query() doc page.

1

Les pilotes mysql de PHP n'autorisent pas l'exécution de plusieurs requêtes à partir d'un seul appel de fonction de requête par mesure de sécurité. C'est une atténuation partielle contre les pires attaques par injection SQL, rendant l'attaque classique XKCD Bobby Tables inefficace. Cela ne veut pas dire que cela rend les attaques par injection impossibles - cela rend impossible la version multi-requêtes des attaques.