Page 1 sur 1
Update
Posté : 05 févr. 2009, 19:54
par dunbar
Bonjour,
J'ai ma requette suivante
echo '<pre>';
print_r($_POST);
echo '</pre>';
$nb_post = COUNT($_POST);
//echo "nb post =" . $nb_post;
$i = 0;
while ($i < $nb_post) {
$i++;
echo $update_sql = "UPDATE
stock
SET
stocklln ='" . $_POST[$i] . "'
WHERE
id_stock ='" . $i . "'";
echo ";";
echo '<br>';
}
$lln_result = mysql_query($update_sql) or die("Erreur MySQL : Impossible de sauvegarder les modifications");
echo 'Modification sauvegarder <img src="images/ok_number.png" width="16" height="16" />';
qui ne fonctionne pas, il n'y a pas d'erreur mais les données ne se mette pas à jour dans la base
par contre si je prend la requette et l'introduit dans phpadmin elle fonctionne
Je ne comprend vraiment pas pourquoi
D'avance merci
Posté : 05 févr. 2009, 20:14
par stopher
Salut ,
dans ta boucle ,
while ($i < $nb_post) {
$i++;
echo $update_sql = "UPDATE
stock
SET
stocklln ='" . $_POST[$i] . "'
WHERE
id_stock ='" . $i . "'";
echo ";";
echo '<br>';
}
$lln_result = mysql_query($update_sql) or die("Erreur MySQL : Impossible de sauvegarder les modifications");
$update_sql change à chaque boucle while .. puis une fois terminé , c'est donc uniquement la dernière définition de $update_sql qui est "exécuté" par mysql , tu as donc théoriquement uniquement la dernière valeur qui est modifié .
Maintenant , ta requete m'étonne un peu ... en effet , ta variable $i correspond toujours à un id existant ?
Juste en bonus , tu n'est pas obligé de concaténer tes variables php dans ta requete , car tu utilises les doubles quotes " ...

Posté : 05 févr. 2009, 20:17
par dunbar
Juste tu as raison
Quelle serais la solution pour garder le même principe ?
Maintenant , ta requete m'étonne un peu ... en effet , ta variable $i correspond toujours à un id existant ?
Bin oui puisque c'est une maj

j'essaye de faire comme ça car si je rajoute des article dasn ma base je ne devrais pas adapter mon code.
Quand à mes variable je le sais mais c'est plus propre(enfin je trouve)

Posté : 05 févr. 2009, 20:40
par Ripat
'soir,
Les requêtes en boucles peuvent être désastreuses en termes de performance. Depuis MySQL 4.1, il est possible d'utiliser les "prepare statement". En gros, on envoie une seule fois au serveur MySQL la requête à traiter, MySQL va la parser une seule fois, la compiler et attendre les variables filles. Si tu n'as pas envie de t'embêter avec la syntaxe particulière des prepare statements (PREPARE, EXECUTE et DEALLOCATE PREPARE), regarde du côté de la classe d'abstraction PDO de PHP5. Très simple à utiliser. Sinon, la classe MySQLi le fait aussi.
Si tes tables utilisent le moteur innoDB, tu as aussi intérêt à utiliser les transactions (BEGIN, COMMIT) parfaitement et facilement gérées par PDO.
Enfin, et surtout, il est un peu téméraire de faire des update de tables en partant de données utilisateurs récupérées de formulaires sans protéger les valeurs contre les injections SQL. Ici encore, l'utilisation de la méthode PDO::prepare t'apporte une solution très simple à mettre en oeuvre (il n'y a strictement rien à faire!).
Posté : 05 févr. 2009, 20:51
par dunbar
Enfin, et surtout, il est un peu téméraire de faire des update de tables en partant de données utilisateurs récupérées de formulaires sans protéger les valeurs contre les injections SQL. Ici encore, l'utilisation de la méthode PDO::prepare t'apporte une solution très simple à mettre en oeuvre (il n'y a strictement rien à faire!).
Oui absolument mais ici c'étais un test je vais protéger mes variables une fois en ligne, de plus c'est un intranet donc il y a déjà moins de risque , mais tu a absolument raison
Posté : 05 févr. 2009, 21:22
par Ripat
Pour te montrer la simplicité de PDO:
/* Instanciation de l'objet PDO - connexion */
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
/* Construction et preparation de la requête */
$update_sql = "UPDATE stock SET stocklln = :stcklln WHERE id_stock = :id_stock";
$prepared = $pdo->prepare($update_sql);
/* passage dans ta boucle */
while ($i < $nb_post) {
$i++;
$values = array(
':stcklln' => $_POST[$i],
':id_stock'=> $i
);
$prepared->execute($values);
}
Et ici pas besoin de protéger le contenu de $_POST puisque la requête est déjà parsée et compilée *sans* aucune donnée utilisateur. Juste des "pointeurs" vers des valeurs à venir. Il est donc - par conception - virtuellement impossible de faire des injections.
Posté : 05 févr. 2009, 21:32
par dunbar
Merci RIPAT je ne connais pas PDO, mais je pense que je devrais étudié ça de plus pret
Posté : 05 févr. 2009, 21:37
par Ripat
Merci RIPAT je ne connais pas PDO, mais je pense que je devrais étudié ça de plus pret
Apparemment, il n'y aura plus que de cette manière qu'on pourra accéder aux SGBD dans PHP6.

Posté : 05 févr. 2009, 21:44
par dunbar
Merci RIPAT je ne connais pas PDO, mais je pense que je devrais étudié ça de plus pret
Apparemment, il n'y aura plus que de cette manière qu'on pourra accéder aux SGBD dans PHP6.

Et moi qui commence peine a comprend PHP5

Posté : 07 févr. 2009, 11:22
par Ripat
Apparemment, il n'y aura plus que de cette manière qu'on pourra accéder aux SGBD dans PHP6.

Je corrige. Après recherche, il a bien été question de déporter les extensions mysql et mysqli vers PECL. Cette décision a été reprortée. Mais l'intention est, à terme, faire passer toutes connexions vers les DB par la classe PDO
Posté : 07 févr. 2009, 11:42
par dunbar
Merci pour l'info
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]