[RESOLU] UPDATE ET WHILE

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] UPDATE ET WHILE

Re: [RESOLU] UPDATE ET WHILE

par yann18 » 21 janv. 2013, 23:35

:D

Re: UPDATE ET WHILE

par hend56 » 21 janv. 2013, 11:14

Bravo
ca marche comme cela !
Merci

Re: UPDATE ET WHILE

par yann18 » 21 janv. 2013, 02:22

je comprends maintenant pourquoi la mise à jour ne fonctionnait pas.

contrairement à fetchAll() , la méthode fetch() lit ligne par ligne, par conséquent pendant le traitement du résultat(affichage) on ne peux pas faire d'autres requêtes(dans notre cas update) sur la même connexion PDO(variable $reponse).Pour faire simple la variable $reponse(objet de connexion pdo) est déjà utilisée par la requête SELECT donc on ne peux plus l'utiliser pour faire une requête update. Il convient alors pour update de créer un nouvel objet de connexion($reponse2=$bdd->prepare($sql) et $reponse2->execute(array($i,$row->id));
$reponse = $bdd->prepare('SELECT id FROM occupation WHERE MONTH(date_debut) = ? AND YEAR(date_debut) = ?');
                    $reponse ->execute(array($mois_parcouru, $annee_parcourue));
                    $classement = 1;
                    while ($donnees = $reponse ->fetch(PDO::FETCH_OBJ))
                    {
                    $reponse2 = $bdd->prepare('UPDATE occupation SET classement = ? where id = ? ');//nouvel objet de connexion reponse2
                 
                     $reponse 2->execute(array($classement,$donnees->id));
                        $classement=$classement+1;
                   
                    }

Re: UPDATE ET WHILE

par hend56 » 20 janv. 2013, 21:49

cela ne change rien
la valeur est 2 pour un seul enregistrement
la boucle n'a pas fonctionné pour les autres enregistrements

Re: UPDATE ET WHILE

par yann18 » 20 janv. 2013, 21:26

dans ma base les enregistrements ont tous la valeur 1 dans le champ "classement"
ça veut dire que l’incrémentation de la variable classement n'est jamais prise en compte.à mon avis il faut incrémenter la variable $classement avant l'exécution de la requête(avant la méthode execute(array());
$reponse = $bdd->prepare('SELECT id FROM occupation WHERE MONTH(date_debut) = ? AND YEAR(date_debut) = ?');
                    $reponse ->execute(array($mois_parcouru, $annee_parcourue));
                    $classement = 1;
                    while ($donnees = $reponse ->fetch(PDO::FETCH_OBJ))
                    {
                    $reponse = $bdd->prepare('UPDATE occupation SET classement = ? where id = ? ');
                    $classement=$classement+1;
                     $reponse ->execute(array($classement,$donnees->id));
                    
                    }

Re: UPDATE ET WHILE

par hend56 » 20 janv. 2013, 20:47

Désolé j'aurai pu le voir
mais la boucle s'arrête au bout de 1 enregistrement
dans ma base les enregistrements ont tous la valeur 1 dans le champ "classement"
c'est identique à ce que je faisais avant !?

Re: UPDATE ET WHILE

par yann18 » 20 janv. 2013, 20:33

Notice: Undefined variable: donness in C:\...on line 111

Notice: Trying to get property of non-object in C:\...on line 111
la variable $donness n'existe pas(enfin il suffisant juste de lire le code pour s'en rendre compte que c'est $donnees).la variable $donnees(définie dans la condition booléenne du while) est un tableau d'objets.donc pour récuperer une colonne de la table: $donnees->nomColonne.
$reponse ->execute(array($classement,$donnees->id));

Re: UPDATE ET WHILE

par hend56 » 20 janv. 2013, 18:57

ok merci, ca passe mais
maintenant avec cette écriture voici ce qu'il me dit :
Notice: Undefined variable: donness in C:\...on line 111

Notice: Trying to get property of non-object in C:\...on line 111

line 111 =
$reponse ->execute(array($classement,$donness->id));
$reponse = $bdd->prepare('SELECT id FROM occupation WHERE MONTH(date_debut) = ? AND YEAR(date_debut) = ?');
                    $reponse ->execute(array($mois_parcouru, $annee_parcourue));
                    $classement = 1;
                    while ($donnees = $reponse ->fetch(PDO::FETCH_OBJ))
                    {
                    $reponse = $bdd->prepare('UPDATE occupation SET classement = ? where id = ? ');
                    $reponse ->execute(array($classement,$donness->id));
                    $classement=$classement+1;
                    }

Re: UPDATE ET WHILE

par yann18 » 20 janv. 2013, 18:48

php indique que la constante FETCH_OBJECT n'existe pas.A place de FETCH_OBJECT il faut mettre PDO::FETCH_OBJ .


J'ai ecrit ceci mais cela bloque sur
Fatal error: Undefined class constant 'FETCH_OBJECT' in C:\ ....

Re: UPDATE ET WHILE

par hend56 » 20 janv. 2013, 18:00

J'ai ecrit ceci mais cela bloque sur
Fatal error: Undefined class constant 'FETCH_OBJECT' in C:\ ....

try
                    {
                       // ---------- On se connecte à MySQL
                       //$bdd = new PDO('mysql:host=localhost;dbname=web42-roberts', 'web42-roberts', '19011956', $pdo_options);
                       $bdd = new PDO('mysql:host=localhost;dbname=web42-roberts', 'root', '');
                    }
                    catch(Exception $e)
                    {
                    // ---------- En cas d'erreur, on affiche un message et on arrête tout
                    die('Erreur : '.$e->getMessage());
                    }
                    $reponse = $bdd->prepare('SELECT id FROM occupation WHERE MONTH(date_debut) = ? AND YEAR(date_debut) = ?');
                    $reponse ->execute(array($mois_parcouru, $annee_parcourue));
                    $classement = 1;
                    while ($donnees = $reponse ->fetch(PDO::FETCH_OBJECT))
                    {
                    $reponse = $bdd->prepare('UPDATE occupation SET classement = ? where id = ? ');
                    $reponse ->execute(array($classement,$donness->id));
                    $classement=$classement+1;
                    }

Re: UPDATE ET WHILE

par moogli » 20 janv. 2013, 17:47

<?php
$reponse = $bdd->prepare('SELECT id FROM occupation WHERE MONTH(date_debut) = ? AND YEAR(date_debut) = ?');
$reponse ->execute(array($mois_parcouru, $annee_parcourue)) 
$classement = 1;
while ($donnees = $reponse ->fetch(PDO::FETCH_OBJECT))
{ 
$reponse = $bdd->prepare('UPDATE occupation SET classement = ? where id = ? ') 
$reponse ->execute(array($classement,$donness->id)) 
$classement=$classement+1;
}
par exemple

Re: UPDATE ET WHILE

par hend56 » 20 janv. 2013, 17:33

Merci pour ta réponse
En fait oui je récupère dans ma base "occupation" les enregistrements qui correspondent au "$mois_parcouru" et à l' "$annee_parcourue" (voir execute) par exemple janvier et 2012 (ceux ci sont indiqués dans mon programme plus haut mais non-visibles dans mon exemple)
dans ce premier temps
du coup je n'ai pas toute la base mais bien une partie (j'ai pu le constater par un test echo)
dans ce cas j'obtiens 5 enregistrements

ensuite pour une raison particulière je vais les classer suivants certains critères (que je n'indique pas ici pour pas encombrer)
le 1er enregistrement dans le champ "classement" je mettrai la valeur de "$classement" soit par exemple le numéro 1
le 2e le numéro 2
le 5e le numéro 5
etc

J'ai testé le while avec un echo, il tourne bien avec les 5 enregistrements qui s'affichent
mais lorsque j'ajoute les deux lignes de code "prepare" et execute de l'UPDATE la boucle ne fonctionne plus, un seul enregistrement s'affiche dans mon test echo (le 1er)
pourtant pour effectuer un classement je dois bien prendre les 5 enregistrements en une seule fois
Je conçois bien que mon écriture ne convient pas mais je ne trouve pas de solution !!!

Re: UPDATE ET WHILE

par moogli » 20 janv. 2013, 16:57

salut,


tu n'as pas besoin de récupérer l'année et le mois tu les connais déja, par contre une clef primaire se serait mieux :) (un id ?)

cela te permet d'avoir une clause where contenant cet clef primaire afin de limiter l'update, car la, pour chaque ligne de résultat de la requête, tu fait un update de TOUTE la table :mrgreen:

ta requête n'est pas syntaxiquement correct mais je suppose que c'est du fait qu'elle n'est pas "complète" ?


@+

UPDATE ET WHILE

par hend56 » 20 janv. 2013, 16:48

Salut
Le code ci dessous ne fonctionne pas, la boucle s'arrête après un seul enregistrement
Je veux faire un classement et donc modifier le champ "classement" de chaque enregistrement
(pour éviter de compliquer le code, je n'indique pas les conditions pour ce classement, j'aimerai que déjà cela fonctionne avec cela)
Merci pour votre aide
$reponse = $bdd->prepare('SELECT MONTH(date_debut) AS mois_debut, YEAR(date_debut) AS annee_debut, FROM occupation WHERE MONTH(date_debut) = ? AND YEAR(date_debut) = ?');
$reponse ->execute(array($mois_parcouru, $annee_parcourue))
$classement = 1;
while ($donnees = $reponse ->fetch())
{
$reponse = $bdd->prepare('UPDATE occupation SET classement = ? ')
$reponse ->execute(array($classement))
$classement=$classement+1;
}