problème de requete sql

problème de requete sql - PHP - Programmation

Marsh Posté le 03-05-2007 à 21:11:41    

Bonsoir.
 
J'ai un petit problème de requete sql
 
$sql = "SELECT id, ville, pays, image, source, site, commentaire FROM webcams WHERE pays='$_GET['pays']'
 ORDER BY id";
 
 
et cette erreur:
 
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/www/23a8702f964c3b2d2b4e5dfc338a526e/web/webcamstt.php on line 126


---------------
Toute l'actualité météo en continu http://www.meteo-world.com
Reply

Marsh Posté le 03-05-2007 à 21:11:41   

Reply

Marsh Posté le 03-05-2007 à 21:40:14    

Encore un problème d'apostrophe.
 
Quand un programme voit une apsotrophe, il va bêtement jusqu'à l'apostophe suivante. Ce qui donne :  
$sql = "SELECT id, ville, pays, image, source, site, commentaire FROM webcams WHERE pays='$_GET['pays']'  
 ORDER BY id";  
 
Pour éviter ça, écrire :
 

$sql = "SELECT id, ville, pays, image, source, site, commentaire FROM webcams WHERE pays='".$_GET['pays']."' ORDER BY id";

Reply

Marsh Posté le 04-05-2007 à 10:56:51    

oui, et pour éviter l'injection SQL qui est dangereuse, il faudrait au préalable typer ta variable ...
 
$sql = sprintf("SELECT id, ville, pays, image, source, site, commentaire FROM webcams WHERE pays='%s' ORDER BY id;",$_GET['pays']);
 
puis la clause du ORDER BY est-elle sous-entendue si non précisée ? ASC / DESC ?

Reply

Marsh Posté le 05-05-2007 à 11:34:32    

J'aimerais bien un petite explication s'il te plait sur ton typage de variable :ange:


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 05-05-2007 à 13:11:13    

En fait, $_GET récupère une variable venant de l'URL ... Or comme toute URL, ça peut se modifier sans trop de souci.
 
La fonction sprintf (http://fr.php.net/manual/fr/function.sprintf.php) permet de typer une variable avec des marqueurs :
- %d : un entier ("decimal" )
- %s : une chaine de caractères ("string" )
- %f : un nombre à virgule ("float" )
... (RTFM :D)
 
Rien ne te prouve que ce qui est dans $_GET['pays']ne soit réellement une chaine de caractères de type "string" ...
 
Par exemple, écrire

Code :
  1. $lambda = sprintf("Salut, %s, tu as %d an(s)",$prenom,$age);


 
affichera $prenom en tant que string (%s) et $age en tant que decimal (%d)
je mets $prenom, $age dans le même ordre qu'apparaissent les "marqueurs" dans la chaine que je veux retourner.

Reply

Marsh Posté le 05-05-2007 à 16:56:17    

Sauf si j'ai rien compris, ce typage n'aide en rien contre les injection Sql.
 
puisqu'une injection sql, c'est remplacer le le pays (dans le $_get) par un bout de requete sql qui est sera lui aussi une chaine string.
 
non ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed