Update

ViPHP
ViPHP | 2291 Messages

05 févr. 2009, 19:54

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

ViPHP
ViPHP | 1136 Messages

05 févr. 2009, 20:14

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 " ...
:)

ViPHP
ViPHP | 2291 Messages

05 févr. 2009, 20:17

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 :wink:
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) :wink:

ViPHP
ViPHP | 1380 Messages

05 févr. 2009, 20:40

'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!).
ripat

ViPHP
ViPHP | 2291 Messages

05 févr. 2009, 20:51

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

ViPHP
ViPHP | 1380 Messages

05 févr. 2009, 21:22

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.
ripat

ViPHP
ViPHP | 2291 Messages

05 févr. 2009, 21:32

Merci RIPAT je ne connais pas PDO, mais je pense que je devrais étudié ça de plus pret

ViPHP
ViPHP | 1380 Messages

05 févr. 2009, 21:37

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. :wink:
ripat

ViPHP
ViPHP | 2291 Messages

05 févr. 2009, 21:44

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. :wink:
Et moi qui commence peine a comprend PHP5 :wink:

ViPHP
ViPHP | 1380 Messages

07 févr. 2009, 11:22

Apparemment, il n'y aura plus que de cette manière qu'on pourra accéder aux SGBD dans PHP6. :wink:
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
PECL
1. decide on moving DB extensions out of the core later.
http://wiki.php.net/todo/php60
ripat

ViPHP
ViPHP | 2291 Messages

07 févr. 2009, 11:42

Merci pour l'info :!:

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]