Page 1 sur 1

Les tableaux superglobaux et récupération des variables

Posté : 24 sept. 2010, 06:59
par Invité
Bonjour. Je débute en PHP et je demande donc l'indulgence.

Après des heures de travail, je ne parvenais pas à récupérer les variables d'un simple
formulaire sur une 2è page à travers GET ou POST.

J'ai ensuite appris que cela était dû au register_globals configuré à off.
Au lieu de $variable, il faut écrire $_POST['variable']. C'est ainsi que je j'ai pu faire un pas
dans mon apprentissage.

Aujourd'hui, je suis à la phase PHP/MySQL, où je dois mettre à jour la base MySQL
avec un formulaire PHP. Rien de compliqué, la source est fourni sur le CD du (vieux) livre d'apprentissage. Mais voilà, j'ai des erreurs de type "<b>Undefined variable</b>"
Le formulaire donne //<form method="post" action=" stock.php3" name="form1">//
et stock.php3 donne //$requete="INSERT INTO
livres(isbn,titre,auteur,collec,paru,image)VALUES('$isbn','$titre','$auteur','$collec','$paru','$ima
ge')";// suivi d'une condition avec //echo "Titre:".$titre."<br /> de:".$auteur."<br />
collection:".$collec."<br /> paru le:".$paru."<br />image:".$image."<br /> code: ".$isbn;//

Alors j'ai décidé de mettre ma nouvelle compétence en jeu en changent les variables, exemple :
//$requete="INSERT INTO
livres2(isbn,titre,auteur,collec,paru,image)
VALUES('$_POST['isbn']','$_POST['titre']','$_POST['auteur']','$_POST['collec']','$_POST['paru']','$_POST['image']')";//
et //echo "Titre:" $_POST['titre'] etc

Et ô déception, j'ai un nouveau message : Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING'

Le bon point : echo $_POST['titre']; renvoit bien la donnée du formulaire.
Le mauvais point, je ne sais pas de quelle manière envoyer la variable sur la base MySQL

Note: La base et la table sont bien crées. Je suis attentivement les consignes du (vieux) livre.

Help !

Re: Les tableaux superglobaux et récupération des variables

Posté : 24 sept. 2010, 08:40
par xTG
$requete="INSERT INTO
livres2(isbn,titre,auteur,collec,paru,image)
VALUES('{$_POST['isbn']}','{$_POST['titre']}','{$_POST['auteur']}','{$_POST['collec']}','{$_POST['paru']}','{$_POST['image']}')";
echo "titre :" . $_POST['titre'];
Essayes avec ces syntaxes là.

Et maintenant tu devrais te pencher sur l'utilisation de mysql_real_escape_string() afin de protéger tes variables et non les envoyer en brut dans tes requêtes. C'est une faille de sécurité courante chez les débutants. :)

Quant aux undefined variables cela provient du fait qu'il faut toujours vérifier si la variable existe. On ne lance pas un script sans être sûr que les variables qu'il utilise existe.
if( isSet($ma_var) && is_int($ma_var) )
{
  // mon script qui utilise $ma_var et dont la valeur doit être un entier
}

Re: Les tableaux superglobaux et récupération des variables

Posté : 25 sept. 2010, 07:36
par Invité
Bonjour. Merci pour la solution et conseils de sécurité. C'est parti pour la reherche.
Sensible sur ce sujet, je m'exerce en local, et occasionnellement chez FREE avec un accès protégé par htaccess:
Le temps de comprendre les vulnérabilités, et mieux protéger mon code.
D'ailleurs, j'ai remarqué que pour se connecter dans la base mysql, il faut indiquer ses identifiants :
$id_connex = mysql_connect ("localhost", "root","")or die("CONNEXION IMPOSSIBLE"); mysql_select_db("mabase2",$id_connex);
J'aurai aimé appeler implicitement cette commande présent dans une autre page, et dont le dossier serait protégé par un htaccess (deny from all)
Il me reste à savoir si le code existe, et si l'on peut se référer à une page contenue dans un dossier protégé?

A plus tard. Tarek

Re: Les tableaux superglobaux et récupération des variables

Posté : 25 sept. 2010, 12:30
par mctarek
2 semaines après avoir lu
echo "hello world!";
j'ai suivi le conseil de sécurité en utilisant la fonction mysql_real_escape_string().
Cela donne le code fonctionnel suivant :
$requete=sprintf("INSERT INTO livres2 (isbn, titre, auteur, collec, paru, image) VALUES ('%s','%s','%s','%s','%s','%s')",
mysql_real_escape_string($_POST['isbn']),
mysql_real_escape_string($_POST['titre']),
mysql_real_escape_string($_POST['auteur']),
mysql_real_escape_string($_POST['collec']),
mysql_real_escape_string($_POST['paru']),
mysql_real_escape_string($_POST['image']));
<br>
Merci à vous tous :D
Tarek

Re: Les tableaux superglobaux et récupération des variables

Posté : 25 sept. 2010, 16:51
par AB
Au passage si tu fais des tests chez par exemple free, il n'est pas impossible que la directive get_magic_quotes_gpc soit encore activée (non recommandé mais parfois activé pour compatibilité avec d'anciens scripts), ce qui ajoute des antislash "\" devant les guillemets simples et doubles dans les variables $_GET, $_POST, et $_COOKIE.

Dans ce cas tu va te retrouver avec des \ devant les ' et " dans ta base de donnée.

Pour répondre à ce problème tu peux utiliser une fonction qui vérifiera la configuration de get_magic_quotes_gpc et agira en conséquence (donc le code sera valable quelque soit la configuration du serveur).
Par exemple :
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);

return $chaine;
} 

$requete=sprintf("INSERT INTO livres2 (isbn, titre, auteur, collec, paru, image) VALUES ('%s','%s','%s','%s','%s','%s')",
mysql_real_escape_string(Verif_magicquotes($_POST['isbn'])),
mysql_real_escape_string(Verif_magicquotes($_POST['titre'])),
mysql_real_escape_string(Verif_magicquotes($_POST['auteur'])),
mysql_real_escape_string(Verif_magicquotes($_POST['collec'])),
mysql_real_escape_string(Verif_magicquotes($_POST['paru'])),
mysql_real_escape_string(Verif_magicquotes($_POST['image'])));
Par ailleurs, étant donné que tu débute autant prendre de bonnes habitudes et choisir d'utiliser mysqli plutôt que mysql car cette interface n'est plus développée. Cf http://www.php.net/manual/fr/mysqli.overview.php
C'est presque la même syntaxe donc tu pourras continuer à utiliser les exemples donnés avec mysql.

A part ça bien entendu il est recommandé de faire par exemple un include ou un require sur ton fichier de connexion et php pourra y accéder même si le répertoire est protégé par un .htaccess.

Re: Les tableaux superglobaux et récupération des variables

Posté : 25 sept. 2010, 16:54
par stealth35
y'a malheureusement pas mysqli chez free :cry: mais y'a PDO :D mais que pour sqlite #-o