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 :

Ajouter une valeur à un identifiant par rapport au dernier [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Ajouter une valeur à un identifiant par rapport au dernier
    Salut tout le monde,

    J'insère une nouvelle ligne dans ma table avec des valeurs vides.

    Je récupère l'ID le plus important.

    Et j'aimerais faire un update de la nouvelle ligne en affectant le dernier ID + 1 à l'ID de la nouvelle ligne.

    J'ai ce code qui ne fonctionne bien sûr pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = "INSERT INTO ".$_SESSION['LaTable']." VALUES ()"; 
    $execution=mysql_query($sql, $link)or die($query . " - " . mysql_error());
     
    //Je prends la valeur du dernier ID 
    $sql = 'SELECT ID FROM '. $_SESSION['LaTable']. ' ORDER BY ID DESC LIMIT 0,1';
    $execution=mysql_query($sql, $link)or die($query . " - " . mysql_error());
     
    $IncrementationID = 'UPDATE '.$_SESSION['LaTable'].' SET ID VALUES ('.$sql+1.') WHERE ID = ""' ; 
    $execution=mysql_query($IncrementationID, $link)or die($query . " - " . mysql_error());
    Je ne peux PAS utiliser l'auto-incrémentation car ce n'est PAS une clé primaire.

    Sauriez-vous m'aider svp ?

    Merci d'avance.

    beegees

  2. #2
    Membre éprouvé Avatar de Grepsd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 96
    Par défaut
    Déjà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Je prends la valeur du dernier ID 
    $sql = 'SELECT ID FROM '. $_SESSION['LaTable']. ' ORDER BY ID DESC LIMIT 0,1';
    $execution=mysql_query($sql, $link)or die($query . " - " . mysql_error());
     
    $IncrementationID = 'UPDATE '.$_SESSION['LaTable'].' SET ID VALUES ('.$sql+1.') WHERE ID = ""' ;
    La variable $sql contient ta précédente requête et non pas la valeur de l'ID voulue.

    et tu n'as pas besoin de faire autant de requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE '.$_SESSION['LaTable'].' SET id = (SELECT ID+1 FROM '. $_SESSION['LaTable']. ' ORDER BY ID DESC)'
    Et encore mieu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'INSERT INTO table(ID,....) VALUES(SELECT max(ID)+1 FROM table,...)'
    Là tu insert directement une nouvelle ligne avec une ID égale à la plus grande ID plus 1.


    De plus ton code est difficilement lisible :/
    et essayes d'utiliser MySQLi ou PDO pour tout ce qui concerne MySQL si possible pour des raisons de protections contre les injections et par ce que mysql_*() sera bientôt déprécie ^^"

    De plus, essais de protéger par des `` les champs ayant des noms très utilisés en programmation (ID l'est énormément.)

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    J'obtiens ce message d'erreur :

    - You can't specify target table 'cours' for update in FROM clause
    Avec ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $IncrementationID = 'UPDATE '.$_SESSION['LaTable'].' SET id = (SELECT ID+1 FROM '. $_SESSION['LaTable']. ' ORDER BY ID DESC)'; 
    $execution=mysql_query($IncrementationID, $link)or die($query . " - " . mysql_error());
    Qu'en penses-tu ?

    Encore merci.

    beegees

  4. #4
    Membre éprouvé Avatar de Grepsd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 96
    Par défaut
    et essayes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $IncrementationID = 'UPDATE '.$_SESSION['LaTable'].' SET id = (SELECT max(ID)+1)';
    je ne sais plus si cette syntaxe est correct mais il me semble que oui.


    [edit]

    J'avoue ne pas avoir la solution sous la main, je regarderais ça de façon plus approfondie dans la soirée ou d'ici demain. Si quelqu'un n'a pas répondu d'ici là bien entendu :p

    [/edit]

  5. #5
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Re,

    Merci pour ton aide.

    On dirait qu'il prend toujours comme ID 1 car j'obtiens ce message:

    - Duplicate entry '' for key 1
    j'utilise donc ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $IncrementationID = 'UPDATE '.$_SESSION['LaTable'].' SET id = (SELECT max(ID)+1)';
    $execution=mysql_query($IncrementationID, $link)or die($query . " - " . mysql_error());
    Edit : le problème est qu'il ajoute un enregistrement avant le dernier.

    Il met ensuite à jour l'id du dernier enregistrement, donc l'ID 3 devient 4 et il ajoute une nouvelle linge qui porte l'ID 1 qui existe déjà.

    Qu'en penses-tu ?

    Encore merci.

    beegees

  6. #6
    Membre Expert
    Avatar de Jumano
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 1 163
    Par défaut
    Bonjour,
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql = "INSERT INTO ".$_SESSION['LaTable']." VALUES ()"; 
    $execution=mysql_query($sql, $link)or die($query . " - " . mysql_error());
     
    $query_IDmax = "SELECT ID FROM ".$_SESSION['LaTable']." ORDER BY ID DESC LIMIT 1";
    $IDmax = mysql_query($query_IDmax, $link) or die(mysql_error());
    $row_IDmax = mysql_fetch_assoc($IDmax);
    $max = ($row_IDmax['ID']+1);
     
    $IncrementationID = "UPDATE ".$_SESSION['LaTable']." SET ID = '".$max."' WHERE ID = '0'";
    $execution=mysql_query($IncrementationID, $link)or die($query . " - " . mysql_error());

  7. #7
    Membre éprouvé Avatar de Grepsd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 96
    Par défaut
    Justement, c'est ce que l'on cherche à éviter pour ne pas surcharger avec 3 requêtes différentes ce que l'on peut faire avec une seule comprenant une sous requête.

    J'avais déjà utiliser un système proche mais je ne l'ai plus sous la main.

  8. #8
    Membre éprouvé Avatar de Grepsd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 96
    Par défaut
    http://www.webmasterworld.com/forum112/345.htm

    Après une petite recherche je suis tombé là dessus, et donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table (ID, ...) VALUES(SELECT (SELECT max(ID) FROM table) AS ID,....)

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    Avec ce genre de requête, tu vas au devant des problèmes : imagine que 2 sessions différentes accèdent en même temps à la requête, elles trouveront toutes les 2 le même id. Quel fouillis ça va faire dans la table.
    Il FAUT que ton id soit auto incrémentée si elle doit être unique.

  10. #10
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Bonjour à tous,

    Message commun :

    Merci à tous pour vos réponses.

    Je n'ai pas reçu la confirmation de réponse, c'est pourquoi je réponds si tard.

    beegees

    Citation Envoyé par jumano Voir le message
    Bonjour,
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql = "INSERT INTO ".$_SESSION['LaTable']." VALUES ()"; 
    $execution=mysql_query($sql, $link)or die($query . " - " . mysql_error());
     
    $query_IDmax = "SELECT ID FROM ".$_SESSION['LaTable']." ORDER BY ID DESC LIMIT 1";
    $IDmax = mysql_query($query_IDmax, $link) or die(mysql_error());
    $row_IDmax = mysql_fetch_assoc($IDmax);
    $max = ($row_IDmax['ID']+1);
     
    $IncrementationID = "UPDATE ".$_SESSION['LaTable']." SET ID = '".$max."' WHERE ID = '0'";
    $execution=mysql_query($IncrementationID, $link)or die($query . " - " . mysql_error());
    Bonjour Jumano,

    Merci pour ton code.

    ça fonctionne avec le premier enregistrement, si par exemple le dernier enregistrement avait l'ID 33, il donne l'ID 34 au nouveau, c'est une bonne avancée.

    Par contre, dès que j'ajoute un autre enregistrement, il me dit ceci :

    - Duplicate entry '' for key 1
    Qu'en penses-tu ?

    Merci encore.

    beeges

    Citation Envoyé par Grepsd Voir le message
    Justement, c'est ce que l'on cherche à éviter pour ne pas surcharger avec 3 requêtes différentes ce que l'on peut faire avec une seule comprenant une sous requête.

    J'avais déjà utiliser un système proche mais je ne l'ai plus sous la main.
    Citation Envoyé par Grepsd Voir le message
    http://www.webmasterworld.com/forum112/345.htm

    Après une petite recherche je suis tombé là dessus, et donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table (ID, ...) VALUES(SELECT (SELECT max(ID) FROM table) AS ID,....)
    Bonjour,

    Merci pour ta réponse Grepsd.

    J'ai essayé de faire comme tu le dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO ".$_SESSION['LaTable']." VALUES(SELECT (SELECT max(ID) FROM ".$_SESSION['LaTable']. "AS ID));"
    Pour l'instant, ça me donne :

    Parse error: syntax error, unexpected T_VARIABLE in C:\wamp\www\Scripts\Insert_Into_Generation_Chaine_SQL.php on line 26
    La ligne 26 correspond à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $execution=mysql_query($sql,$link)or die($query . " - " . mysql_error());
    merci encore pour tout.

    beegees

    Citation Envoyé par jeca Voir le message
    Bonjour,

    Avec ce genre de requête, tu vas au devant des problèmes : imagine que 2 sessions différentes accèdent en même temps à la requête, elles trouveront toutes les 2 le même id. Quel fouillis ça va faire dans la table.
    Il FAUT que ton id soit auto incrémentée si elle doit être unique.
    Bonjour,

    Merci pour ta réponse.

    Deux choses :

    1) Le même ID --> impossible car je suis le seul à ajouter des enregistrements et je ne peux ajouter qu'un enregistrement qu'à la fois. En plus, il prend le dernier ID d'une certaine table et ensuite d'une autre table si j'ajoute dans une autre table.

    2) si j'aurais pu laisser en auto incrément, je l'aurais fait, c'est juste que mon analyse ne me le permet pas.

    merci
    beegees

  11. #11
    Membre Expert
    Avatar de Jumano
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 1 163
    Par défaut
    Re,
    Tes champs ID ne sont-ils pas de TYPE = UNIQUE ?

  12. #12
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par jumano Voir le message
    Re,
    Tes champs ID ne sont-ils pas de TYPE = UNIQUE ?
    Re,

    Non il ne sont pas de type "Unique".

    On sait quand même faire quelque chose ?

    Je peux le mettre en unique si tu veux, ça doit pas être obligatoirement une primary key alors ?

    Merci pour ton aide.

    beegees

  13. #13
    Membre Expert
    Avatar de Jumano
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 1 163
    Par défaut
    Tu dois avoir une clé primaire ou un champs de type unique dans ta table qui contient déjà une valeur vide, donc quand tu ajoutes une nouvelle valeur vide tu as ce message d'erreur.

  14. #14
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par jumano Voir le message
    Tu dois avoir une clé primaire ou un champs de type unique dans ta table qui contient déjà une valeur vide, donc quand tu ajoutes une nouvelle valeur vide tu as ce message d'erreur.
    OK problème résolu, il faut encoder une ligne à la fois et faire une mise à jour, ensuite on peut ajouter une autre ligne.

    Merci à toi jumano

    beegees

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

Discussions similaires

  1. Ajouter une valeur par défaut à un champ
    Par mougeole dans le forum Doctrine2
    Réponses: 3
    Dernier message: 19/05/2017, 15h40
  2. Réponses: 5
    Dernier message: 09/10/2013, 00h05
  3. Réponses: 4
    Dernier message: 14/05/2009, 14h15
  4. Ajouter une valeur par defaut à un champ
    Par smooncef dans le forum Informix
    Réponses: 9
    Dernier message: 15/04/2008, 13h40
  5. Réponses: 5
    Dernier message: 25/06/2007, 11h01

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