IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête update dans une boucle while [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut Requête update dans une boucle while
    Bonjour,

    J'essaie de mettre à jour un même champ pour tous les articles d'une table.
    J'ai une erreur dont je ne peux malheureusement pas vous dire la nature, parce que j'affiche le script dans un bloc IPB (les forums) et ça bloque purement et simplement toute la page.
    Enfin je pense que c'est une erreur de syntaxe qui va vous sauter aux yeux... Voici la bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $dbh = new PDO('mysql:host=localhost;dbname=dicocom7_dico1','dico', '*****');   
     
    /** on définit la requete sql */
    $compte = $dbh->query('SELECT field_38 FROM cms_custom_database_6');
     
    while ($total = $compte->fetch())
    {
    $total=str_word_count($total);
    $bdh->exec('UPDATE cms_custom_database_6 SET field_53='.$total.'');
     
    ;}
    M'est avis que la requête UPDATE est un peu exotique, entre autres erreur éventuelles... Je n'en ai pour l'heure jamais utilisé dans un script mysqli, POO, tout ce que vous voulez...


    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($row = $compte->fetch())
    {
        $total = str_word_count($row['field_38']);
        $bdh->exec('UPDATE `cms_custom_database_6` SET `field_53` = '.$total);
    }

  3. #3
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Salut rawsrc, merci pour ta réponse.

    J'obtiens cette erreur, avec ton bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function exec() on a non-object in /home1/dico/public_html/applications/cms/sources/Blocks/Block.php(195) : eval()'d code on line 10
    C'est dû à la fin, je crois. Tu as écrit '.$total sans rien d'autre ensuite. Mais si je complète en écrivant '.$total.', alors j'obtiens cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parse error: syntax error, unexpected ''); ' (T_ENCAPSED_AND_WHITESPACE) in /home1/dico/public_html/applications/cms/sources/Blocks/Block.php(195) : eval()'d code on line 10

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour une requête répétée, on utilisera avantageusement une requête préparée.
    Concernant l'erreur "non object", tu as visiblement un problème avec ta connexion, affiche les erreurs ça sera mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    try {
        $dbh = new PDO('mysql:host=localhost;dbname=dicocom7_dico1','dico', '*****');
    } catch (PDOException $e) {
        echo 'Connexion échouée : ' . $e->getMessage();
    }
     
    $compte = $dbh->query('SELECT field_38 FROM cms_custom_database_6');
     
    $sth_update = $dbh->prepare('UPDATE cms_custom_database_6 SET field_53 = ?');
    while ($row = $compte->fetch())
    {
        $total=str_word_count($row['field_38']);
        $bdh->execute(array($total));
    }
    Tu as écrit '.$total sans rien d'autre ensuite.
    D'ou viens cette idée qu'il faut ajouter des .'' partout à la fin des chaines ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Salut Sabotage,

    En fait, ton code m'affiche une erreur fatal, lui aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function execute() on a non-object in /home1/dico/public_html/test-compteur.php on line 14
    La ligne 14, c'est celle-là : $bdh->execute(array($total));

    La connexion que j'utilise dans le premier script, elle fonctionne dans d'autres scripts.
    Sinon, si on pouvait rester sur ce premier script, ça m'arrangerait justement. Parce que ton bout de code - pour lequel je te remercie bien entendu - me parait un peu compliqué.

    Ca doit être une bête erreur de syntaxe, quelque part. Mais celle-ci m'est encore un peu étrangère.

  6. #6
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Ah ! C'est... Pas réussi. Dans le code de Sabotage, j'ai corrigé remplacé :

    $bdh->execute(array($total));
    Par
    $sth_update->execute(array($total));

    Et ça fonctionne... Presque. En fait le champ 53 est effectivement mis à jour. Mais pour tous les tuples affichent la même valeur pour le champ 53...

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ce serait sans doute une bonne idée d'ajouter une condition WHERE dans la requête UPDATE pour limiter l'impact, par exemple sur la clé primaire de la table.
    En supposant que la colonne de la clé primaire est "id", ça donne quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $compte = $dbh->query('SELECT id, field_38 FROM cms_custom_database_6');
     
    $sth_update = $dbh->prepare('UPDATE cms_custom_database_6 SET field_53 = ? WHERE id = ?');
    while ($row = $compte->fetch())
    {
        $total=str_word_count($row['field_38']);
        $sth_update->execute(array($total, $row['id']));
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Bonjour Celira,
    Oui ça fonctionne merci.

    **edition**
    Le premier coup, j'avais omis de récupérer tous les tuples * dans la première requête.


    Merci à vous tous et à développez


    NB : savez-vous si la fonction str_word_count compte aussi les balises html (<p> < href> ...) ?

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    la notion de mot dépend de la configuration de localisation. C'est une chaîne qui contient tous les caractères alphabétiques, et qui peut contenir, mais pas commencer par "'" et "-".
    PHP.net - Manual : str_​word_​count

    Donc a priori, ça considère que les mots sont uniquement composés de lettres (la gestion des caractères accentués n'étant pas très claire)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Oui, j'ai essayé d'appliquer un strip_tags, mais le résultat numérique est identique.

    C'est étrange, parce que là où le scripte compte 20 mots, moi j'en compte 16.

    Pour arriver à 20, il faut que je compte 2 " plus un point final et un l' ...

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est quand même pas compliqué de tester pour voir comment ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    echo str_word_count("l'amour");
    // 1 comme indiqué dans la doc l'apostrophe ne sépare pas les mots, donc on a 1 mot au lieu de 2
     
    echo str_word_count("<p>l'amour</p>");
    // 3 chaque "p" est compté comme un mot.
     
    echo str_word_count("l'éléphant");
    // 3 les caractères accentués dépendent de la localisation ET utf8 ne sont pas pris en charge (ici je suis en UTF8 et en configuration anglaise)
     
    setlocale(LC_ALL, 'fra');
    echo str_word_count(utf8_decode("l'éléphant"));
    // 1
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Hin hin !

    Bien vu cher sabotage. Si je puis dire.

    L'application d'un strip_tag permet effectivement d'avoir le juste compte. J'avais simplement testé avec la mauvaise page...

    Bien, résolu en bonne et due forme, merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2012] Exécution d'une requête UPDATE dans une variable
    Par Fritzoune dans le forum Développement
    Réponses: 3
    Dernier message: 24/10/2014, 14h42
  2. [AC-2007] Sous-requête "Select" dans une requête "update"
    Par MatAllwhite dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/06/2013, 15h00
  3. Stocker une requête update dans une table
    Par bigtruck2010 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 07/07/2011, 13h57
  4. [MySQL] Exécuter une requête UPDATE dans une boucle
    Par vacknov dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/10/2008, 18h46
  5. Réponses: 4
    Dernier message: 17/05/2006, 00h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo