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 :

UPDATE renvoie 0 colonnes traitées [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Hobby
    Inscrit en
    Octobre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Octobre 2013
    Messages : 62
    Points : 35
    Points
    35
    Par défaut UPDATE renvoie 0 colonnes traitées
    Bonjour,

    je viens vers vous, car je deviens chèvre. Cela fait plusieurs jours que j'essaye en vain de trouver un code qui me permette de faire un UPDATE de ma base MySQL.

    Voici le résultat du var_dump :

    C:\wamp64\www\CatalogueTrains\process_modif.php:16:
    array (size=6)
    'pays' => string 'Chine' (length=5)
    'repertoire' => string 'Chinois_5' (length=9)
    'materiel' => string 'Chinois_5.eng' (length=13)
    'simulateur' => string 'ORTS' (length=4)
    'commentaire' => string 'TEST_12' (length=7)
    'modif' => string 'Enregistrer' (length=11)

    Retourne le nombre de champs mis à jour : Mis a jour 0 rows.

    Et voici mon code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
     
       include_once('connect.php');
     
       // On s'assure que les données sont en utf8
       $db->EXEC("SET NAMES utf8");
     
       //On récupère les données
     
       $pays = $_POST['pays'];
       $repertoire = $_POST['repertoire'];
       $materiel = $_POST['materiel'];
       $simulateur = $_POST['simulateur'];
       $commentaire = $_POST['commentaire'];
     
       var_dump($_POST);
     
       //On écrit la requête
     
       $req = "UPDATE movies SET 
             pays = :pays, 
             repertoire = :repertoire, 
             materiel = :materiel,  
             simulateur = :simulateur,  
             commentaire = :commentaire  
       WHERE repertoire = :repertoire";
     
       $stmt = $db->prepare($req);                                  
       $stmt->bindParam(':pays', $_POST['pays'], PDO::PARAM_STR);       
       $stmt->bindParam(':repertoire', $_POST['$repertoire'], PDO::PARAM_STR);    
       $stmt->bindParam(':materiel', $_POST['materiel'], PDO::PARAM_STR);
       $stmt->bindParam(':simulateur', $_POST['simulateur'], PDO::PARAM_STR); 
       $stmt->bindParam(':commentaire', $_POST['commentaire'], PDO::PARAM_STR);
       $stmt->execute(); 
     
       // Retourne le nombre de champs mis à jour
       print("Retourne le nombre de champs mis à jour :\n");
       $count = $stmt->rowCount();
       print("Mis a jour $count rows.\n");
     
    ?>
    Je précise que je suis un grand débutant en php et mysql. Si quelqu'un pouvait me montrer pourquoi mon code ne fait rien, je lui en serais reconnaissant.

    Merci d'avance.

    Cordialement
    Pascal

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonjour,

    Petite coquille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     //$db->EXEC("SET NAMES utf8");
    // a mettre en minuscule
     
     $db->exec("set names utf8");
    Ensuite, la question la plus simple est , avez vous dans votre table un attribut répertoire avec 'Chinois_5' ?

  3. #3
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Bonjour,

    Comme l'a dit mon compatriote @MaitrePylos, assurez-vous que dans votre DB, au moins un record ait comme valeur "Chinois_5" pour la colonne repertoire.
    (en réalité, on peut écrire $db->EXEC(), je l'ignorais mais j'ai testé ^^)

    Sinon, y'a un très gros problème dans le code et vous allez apprendre les joies du copier/coller dans le dev :
    Vous avez écrit $repretoire dans l'index $_POST
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Vous avez écrit :
    $stmt->bindParam(':repertoire', $_POST['$repertoire'], PDO::PARAM_STR); 
    // Au lieu de :
    $stmt->bindParam(':repertoire', $_POST['repertoire'], PDO::PARAM_STR);

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Ha chaud, je l'ai pas vue celle-là joli @darkstar123456

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Hobby
    Inscrit en
    Octobre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Octobre 2013
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    Re et merci pour vos réponses genre "speedy gonzales".

    "assurez-vous que dans votre DB, au moins un record ait comme valeur "Chinois_5" pour la colonne repertoire.
    Oui, il y est et c'est la colonne "materiel" qui doit être modifiée, car elle contient "Chinois_4.eng", ce qui est faux.


    pays repertoire materiel simulateur commentaire
    Chine Chinois_5 Chinois_4.eng ORTS TEST_5 <-- extrait de la BDD

    Malgré les corrections, j'ai toujours 0 records d'updaté. Les noms des colonnes correspondent aux noms dans le formulaire.

    Vous remarquerez qu'il n'y a pas d'index. La seule colonne qui devrait être univoque est "materiel". J'ai malheureusement constaté des doublons, mais la colonne "repertoire" est différente. Ceci dit, je ne vois pas, à ce stade, l'utilité d'une indexation.

    Quand je vous dis que je deviens chèvre !

    Cordialement
    Pascal

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Pour être sur , on peux tenter ceci ?

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <?php
     
    include_once('connect.php');
     
    // On s'assure que les données sont en utf8
    $db->EXEC("SET NAMES utf8");
     
    //On récupère les données
     
    $pays = $_POST['pays'];
    $repertoire = $_POST['repertoire'];
    $materiel = $_POST['materiel'];
    $simulateur = $_POST['simulateur'];
    $commentaire = $_POST['commentaire'];
     
    var_dump($_POST);
     
    //On écrit la requête
     
    $req = "UPDATE movies SET 
             pays = ?, 
             repertoire = ?, 
             materiel = ?,  
             simulateur = ?,  
             commentaire = ?  
       WHERE repertoire = ?";
     
    $stmt = $db->prepare($req);
    $stmt->execute([$pays,$repertoire,$materiel,$simulateur,$commentaire,$repertoire]);
     
    // Retourne le nombre de champs mis à jour
    print("Retourne le nombre de champs mis à jour :\n");
    $count = $stmt->rowCount();
    print("Mis a jour $count rows.\n");

  7. #7
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Perso, j'ai testé le code initial de mon côté en supprimant juste le $ en trop et ça fonctionnait
    Donc peut-être le problème vient de la structure ou des données de la table ?

    Dans mon message, j'avais mis un pavé sur les index et les primary key que j'avais supprimé pensant qu'il s'agissait d'un traitement par lot (vu la phrase à la fin qui compte le nombre d'occurence)
    Peut-être aurais-je dû le laisser xD

    Pourriez-vous nous montrer la structure de la table en faisant un EXPORT ?
    Voici par exemple la structure avec laquelle j'ai fait mes tests :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    --
    -- Structure de la table `movies`
    --
     
    CREATE TABLE `movies` (
      `id` int(11) NOT NULL,
      `pays` varchar(60) DEFAULT NULL,
      `repertoire` varchar(60) DEFAULT NULL,
      `materiel` varchar(60) DEFAULT NULL,
      `simulateur` varchar(60) DEFAULT NULL,
      `commentaire` varchar(60) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    Edit :
    J'ai refait mon exemple de code en y ajoutant un petit formulaire permettant de mettre à jour la valeur de materiel.
    https://tests.pierre-roels.com/pdo.php

    Evidemment, si on ne change pas de valeur, le nombre d'updates retournées est 0

    Et voici le code complet. C'est exactement le code de l'exemple avec la correction du $ en trop
    Par contre, oui j'ai rajouté pas mal de choses pour simuler une requête complète (j'ajoute manuellement la valeur de tous les champs sauf 1, celui du formulaire et je fais en sorte que le résultat des requêtes s'affiche après le formulaire pour être plus lisible)
    Donc je pense que le problème se situe sûrement ailleurs
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <?php
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
     
    $db = new PDO('mysql:host=localhost;dbname=DB_NAME', 'USERNAME', 'PASSWORD');
    // On s'assure que les données sont en utf8
    $db->EXEC("SET NAMES utf8");
    $repertoire = 'Chinois_5';
    $pdo_outputs = "";
    if (!empty($_POST['modif']) && $_POST['modif'] === 'Enregistrer') {
        ob_start();
        echo '<hr />';
        // Affichage des données
        $_POST['pays'] = 'Chine';
        $_POST['repertoire'] = $repertoire;
    //    $_POST['materiel'] = 'Chinois_5.eng';
        $_POST['simulateur'] = 'ORTS';
        $_POST['commentaire'] = 'TEST_12';
        echo PHP_EOL . '<pre>$_POST data: ' . print_r($_POST, true) . '</pre>' . PHP_EOL;
     
        // On écrit la requête
        $req = "UPDATE movies SET 
             pays = :pays, 
             repertoire = :repertoire, 
             materiel = :materiel,  
             simulateur = :simulateur,  
             commentaire = :commentaire  
       WHERE repertoire = :repertoire";
     
        $stmt = $db->prepare($req);
        $stmt->bindParam(':pays', $_POST['pays'], PDO::PARAM_STR);
        $stmt->bindParam(':repertoire', $_POST['repertoire'], PDO::PARAM_STR);
        $stmt->bindParam(':materiel', $_POST['materiel'], PDO::PARAM_STR);
        $stmt->bindParam(':simulateur', $_POST['simulateur'], PDO::PARAM_STR);
        $stmt->bindParam(':commentaire', $_POST['commentaire'], PDO::PARAM_STR);
        $stmt->execute();
     
        // Retourne le nombre de champs mis à jour
        print("Retourne le nombre de champs mis à jour :\n");
        $count = $stmt->rowCount();
        print("Mis a jour $count rows.\n");
        $pdo_outputs = ob_get_clean();
    }
    ?>
    <form method="post" action="">
        <label for="materiel">Nouveau matériel</label>
        <?php
        $stmt = $db->prepare("SELECT * FROM movies WHERE repertoire = :repertoire LIMIT 1");
        $stmt->bindParam(':repertoire', $repertoire, PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        echo PHP_EOL . '<pre>$row en DB : ' . print_r($row, true) . '</pre>' . PHP_EOL;
        ?>
        <input type="text" name="materiel" id="materiel" value="<?= $row['materiel']; ?>" />
        <input type="hidden" name="modif" value="Enregistrer" />
        <button type="submit">Envoyer</button>
    </form>
    <?= $pdo_outputs; ?>

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Hobby
    Inscrit en
    Octobre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Octobre 2013
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    Voici la structure de ma table :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- Structure de la table `trainset`
    --
     
    DROP TABLE IF EXISTS `trainset`;
    CREATE TABLE IF NOT EXISTS `trainset` (
      `pays` varchar(20) NOT NULL,
      `repertoire` varchar(225) NOT NULL,
      `materiel` varchar(225) NOT NULL,
      `simulateur` varchar(10) NOT NULL,
      `commentaire` varchar(120) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    COMMIT;

    J'ai testé ce lien "https://tests.pierre-roels.com/pdo.php" et il me retourne bien 1 colonne mise à jour.

    A tout hasard voici le code du script de connexion :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
        $host = 'localhost';
        $dbname = 'catalogue_trains';
        $username = 'root';
        $password = '';
     
            try {
     
              $db = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
     
              $options = [
                PDO::ATTR_EMULATE_PREPARES   => false, // turn off emulation mode for "real" prepared statements
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //make the default fetch be an associative array
              ];
     
            } catch (PDOException $e) {
     
              die("Impossible de se connecter à la base de données $dbname :" . $e->getMessage());
              print_r($e);
     
            }
    ?>
    Il fonctionne pour les INSERT.

    Un formateur me disait un jour "coder, c'est facile, mais tu passeras beaucoup de temps à corriger les erreurs...".

    Cordialement
    Pascal

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Hobby
    Inscrit en
    Octobre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Octobre 2013
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    Super !!!

    J'ai modifié votre code pour l'adapter à la situation (pas de variables pré-définies) et ça fonctionne !

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
       include_once('connect.php');
     
       ini_set('display_errors', 1);
       error_reporting(E_ALL);
     
       // On s'assure que les données sont en utf8
       $db->EXEC("SET NAMES utf8");
     
       if (!empty($_POST['modif']) && $_POST['modif'] === 'Enregistrer') {
     
          // On écrit la requête
          $req = "UPDATE trainset SET 
                pays = :pays, 
                repertoire = :repertoire, 
                materiel = :materiel,  
                simulateur = :simulateur,  
                commentaire = :commentaire  
          WHERE repertoire = :repertoire";
     
          $stmt = $db->prepare($req);
          $stmt->bindParam(':pays', $_POST['pays'], PDO::PARAM_STR);
          $stmt->bindParam(':repertoire', $_POST['repertoire'], PDO::PARAM_STR);
          $stmt->bindParam(':materiel', $_POST['materiel'], PDO::PARAM_STR);
          $stmt->bindParam(':simulateur', $_POST['simulateur'], PDO::PARAM_STR);
          $stmt->bindParam(':commentaire', $_POST['commentaire'], PDO::PARAM_STR);
          $stmt->execute();
     
          // Retourne le nombre de champs mis à jour
          print("Retourne le nombre de champs mis à jour :\n");
          $count = $stmt->rowCount();
          print("Mis a jour $count rows.\n");
          $pdo_outputs = ob_get_clean();
       }
    ?>
    <?= $pdo_outputs; ?>
    Merci à vous, mais je ne sais toujours pas où se situait le problème. Je vais avoir le temps de comparer les scripts.

    Cordialement
    Pascal

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

Discussions similaires

  1. update d'une colonne entière sous bde
    Par gregcat dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/03/2007, 21h46
  2. Réponses: 4
    Dernier message: 31/10/2006, 19h03
  3. Update de plusieur colonne d'une meme table
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/09/2006, 09h25
  4. [Oracle] Update sur 1 colonne avec condition existence (SUBSTR)
    Par magic charly dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2006, 13h57
  5. update d'une colonne texte
    Par todd dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/10/2003, 13h12

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