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 :

faire correctement un update [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut faire correctement un update
    Bonjour,
    je voudrais copier un enregistrement de ma table afin que l'utilisateur qui souhaite en créer un nouveau puisse commencer par en dupliquer un avant de le modifier (comme 95% des données seront déjà bonnes, il gagnera du temps).
    Donc je fais la requête suivante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$sql='INSERT INTO `machines` (name,localization,pays) SELECT name,localization,pays FROM `machines` where name="'.$machselcopy.'"';
    	$qid->exec();
    Il y a bien plus que ces 3 colonnes mais je complèterai quand ça sera au point. Mais la difficulté, c'est que "name" est une clé unique : le dump de la table donne :
    ALTER TABLE `machines`
    ADD PRIMARY KEY (`id`),
    ADD UNIQUE KEY `name` (`name`);
    de ce fait, j'ai le message d'erreur
    Integrity constraint violation: 1062 Duplicata du champ 'ega' pour la clef 'name''
    comment éviter cela ?

  2. #2
    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
    Par défaut
    Met une autre valeur pour le "name" pardis.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    En effet, c'est plutôt logique ! Mais du coup, j'ai un petit problème pour faire ça : j'envisage de faire ma requête insert avec toutes les clés sauf name et id (primary key) suivi de 2 update. Mais pour ces 2 update, j'ai besoin d'identifier la ligne avec une clause where. Or les 2 clés qui permettraient de l'identifier ne sont pas encore définies. Donc du coup, y aurait-il moyen de faire mon insert initial avec toutes les clés et dans ce cas, comment mettre une valeur différente pour name et id, vu qu'avec la requête actuelle, je les copie ?

  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
    Par défaut
    Une fois que tu as fais l'insert, les deux clés sont définies et donc tu peux faire l'update.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Ok mais pour faire un update il faut bien dire sur quelle ligne (donc avec une clause where) et comme ces 2 clés ne sont pas encore renseignées je ne vois pas...

  6. #6
    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
    Par défaut
    Tu vas devoir fournir un "name" pour faire ton insertion donc tu as bien la référence non ?
    Mais la bonne méthode c'est d'utiliser lastInsertId pour avoir l'id généré par l'insert.
    http://php.net/manual/fr/pdo.lastinsertid.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut clé primaire dupliquée
    Bonsoir,

    mon souci est que j'ai un message d'erreur comme quoi la clé primaire est dupliquée
    Integrity constraint violation: 1062 Duplicata du champ '' pour la clef 'PRIMARY'' in C:\wamp\www\eis2\eisnew\page\copyserver.php on line 70
    alors qu'elle ne l'est pas :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    'INSERT INTO `INFOAPPLI` (`autre`,`cadence`,`coda`,`ftpsccm`,`genesis`,`licenseserver`,`loadpoint`,`mentor`,`moldflow`,`pcnetlink`,`pec`,`prointralink`,`promecanica`,`samba`,`symphony`,`teamforge`,`em-plant`,`mdm`) SELECT `autre`,`cadence`,`coda`,`ftpsccm`,`genesis`,`licenseserver`,`loadpoint`,`mentor`,`moldflow`,`pcnetlink`,`pec`,`prointralink`,`promecanica`,`samba`,`symphony`,`teamforge`,`em-plant`,`mdm` FROM `INFOAPPLI` where name="DBMAP"
    et
    Code sql : 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
    CREATE TABLE IF NOT EXISTS `infoappli` (
      `name` varchar(20) COLLATE latin1_bin NOT NULL DEFAULT '',
      `pec` tinyint(4) DEFAULT NULL,
      `autre` tinyint(4) DEFAULT NULL,
      `cadence` tinyint(4) DEFAULT NULL,
      `genesis` tinyint(4) DEFAULT NULL,
      `licenseserver` tinyint(4) DEFAULT NULL,
      `teamforge` tinyint(4) DEFAULT NULL,
      `mentor` tinyint(4) DEFAULT NULL,
      `em-plant` tinyint(4) DEFAULT NULL,
      `moldflow` tinyint(4) DEFAULT NULL,
      `pcnetlink` tinyint(4) DEFAULT NULL,
      `loadpoint` tinyint(4) DEFAULT NULL,
      `prointralink` tinyint(4) DEFAULT NULL,
      `promecanica` tinyint(4) DEFAULT NULL,
      `mdm` tinyint(4) DEFAULT NULL,
      `samba` tinyint(4) DEFAULT NULL,
      `ftpsccm` tinyint(4) DEFAULT NULL,
      `symphony` tinyint(4) DEFAULT NULL,
      `coda` tinyint(4) DEFAULT NULL,
      PRIMARY KEY (`name`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    donc quel est le bug ?

  8. #8
    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
    Par défaut
    "duplicata" c'est un doublon.
    Etant donné que tu n'as pas donné la valeur de "name" ça ne serait pas surprenant.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Je continue cette discussion même si le titre n'est plus bon...

    OK, je commence par définir le nouveau nom :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $query='INSERT INTO `infoappli` (name) VALUES("'.$name_copy.'")';
    Par contre ma méthode pour ensuite déclarer les autres colonnes ne convient pas.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $query='update `infoappli` SET pec=(SELECT pec from `infoappli` where name="'.$machselcopy.'") where name="'.$name_copy.'"';
    $qid = $bdd->query($query);//essai avec une seule colonne
    provoque le message d'erreur
    You can't specify target table 'infoappli' for update in FROM clause' in C:\wamp\www\eis2\eisnew\page\copyserver.php on line 76
    Quelle est la bonne méthode ?

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Maintenant, je tente de faire l'update en 2 requêtes :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	$query='INSERT INTO `infoappli` (name) VALUES("'.$name_copy.'")';
    	$bdd->query($query); // d'abord, on crée l'enregistrement avec le name
     
    	$sql='SELECT pec from `infoappli` where name="'.$machselcopy.'"';
    	$qid=$bdd->query($query);
    	$row=$qid->fetch(PDO::FETCH_OBJ);
    	$pec=$row->pec; // on va chercher la valeur à copier dans infoappli
     
    	$query='update `infoappli` SET pec='.$pec.' where name="'.$name_copy.'"';
     
    	$qid = $bdd->query($query);

    et ça se passe bien

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/01/2015, 18h30
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  5. Réponses: 6
    Dernier message: 30/08/2007, 16h47

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