Aide pour requete UPDATE depuis un formulaire checkbox

craac
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 14:12

Bonjour, cela fait 5heures que je cherche partout la solution a mon probleme, sans progression hélas.

Ma requete : je selectionne les activités où facture = 0 (non facturé)

Code : Tout sélectionner

$query_req = "SELECT * FROM listing WHERE listing.facture = 0"; $req = mysql_query($query_req, $sql) or die(mysql_error()); $row_req = mysql_fetch_assoc($req);
Je crée mon formulaire à base de checkbox (boucle php):

Code : Tout sélectionner

<?php $sommeTotaux = 0; do { ?> <form method="post" action="facture2.php"> <input type='checkbox' name='updatefacture[]' value="<?php echo $row_req['activite_id'] ?> "> <?php $sommeTotaux += $total;} while ($row_req = mysql_fetch_assoc($req)); ?> <input name="submit" type="submit" value="Facturer les activités séléctionnées"> </form>
ensuite, je passe sur la page facture2.php

Code : Tout sélectionner

$update_facture = $_POST['updatefacture']; foreach($update_facture as $fact) { $req2 = "UPDATE listing SET facture = '1' WHERE 'activite_id' = '$fact' " ; mysql_query ($req2); }
La valeur de facture dans la table Mysql reste inchangée et je ne trouve pas ce qui cloche !

Merci de votre aide , Craac.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 sept. 2007, 14:22

Ta balise <form> ne devrait pas être dans la boucle do/while .. tu créer un formulaire pour chaque case (et ton bouton submit n'envoi que le dernier) au lieu d'en avoir un global contenant toutes les cases à soumettre :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 14:24

merci , je vais voir ce que ca me donne aprés correction !

craac
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 14:26

correction effectué, mais toujours pas le resultat escompté (toujours pas de modif dans la table sql)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 sept. 2007, 14:30

print_r($_POST['updatefacture']); //-> pour vérifier que les données ont bien été envoyées et que tu as bien les ids des factures à mettre à jour

or die(mysql_error()); //-> pour vérifier que l'exécution de la requête n'a pas généré d'erreur sql

Remarque : tu as un espace en trop dans le champ value="..", les valeurs de tes ids sont donc altérés ce qui expliquerais qu'aucune correspondance ne soit trouvée pour l'update :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 14:32

avec print j'obtient :

Array ( [0] => 20 [1] => 24 [2] => 22 [3] => 23 ), ce qui est juste. et je n'ai pas d'erreur signalée avec or die(mysql_error());

craac
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 14:38

pour les espace , si tu parles de

Code : Tout sélectionner

value="<?php echo $row_req['activite_id'] ?> ">


je l'ai corrigé ainsi :

Code : Tout sélectionner

value="<?php echo $row_req['activite_id']; ?>">

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 sept. 2007, 14:57

hum... bizare... Arf ! ca y est, vu ! :)

C'est parce que tu as mis des apostrophes autour du nom du champ, et que MySQL le considère alors comme une chaine.. du coup la comparaison est fausse et aucune ligne n'set mise à jour :
$req2 = "UPDATE listing SET facture = '1' WHERE 'activite_id' = '$fact' " ;
A noter que si ton champ est numérique (tinyint, int, etc.) il ne faut pas mettre d'apostrophe non plus autour des valeurs (et sortir les variables des chaines ne fait pas de mal ;)) :
$req2 = "UPDATE listing SET facture = 1 WHERE activite_id = " . $fact;
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 15:09

Ca marche !

sortir les variables des chaines ne fait pas de mal : peut tu développer ton idée, je ne comprends pas ce que tu veux me dire.

En tout cas merci beaucoup !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 sept. 2007, 15:22

En fait, au lieu de faire
$req2 = "UPDATE listing SET facture = 1 WHERE activite_id = $fact";
Ecrire
$req2 = "UPDATE listing SET facture = 1 WHERE activite_id = " . $fact;
Rend le code plus lisible avec la coloration syntaxique, et cela évite les risques d'erreur (problèmes que l'on rencontre fréquemment) de variable interprétées lorsqu'elles sont placées entre guillemets mais pas entre apostrophes :
$chaine1 = 'chaine 1'; 
echo "Ma chaine est : $chaine1"; // affiche : Ma chaine est : chaine 1 
echo 'Ma chaine est : $chaine1'; // affiche : Ma chaine est : $chaine1 (la variable n'est pas interprétée) 
echo 'Ma chaine est : ' . $chaine1; // affiche : Ma chaine est : chaine 1 

J'en profite pour marquer le sujet comme résolu, mais n'hésite pas à t'inscrire et à t'authentifier pour pouvoir le faire toi même sur les prochains (et accessoirement pouvoir éditer tes messages :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

craac
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 15:31

encore merci !

Petit nouveau ! | 4 Messages

13 sept. 2007, 17:10

hop je me suis enregistré !