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 :

Comment updater si la clé existe lors d'un INSERT


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut Comment updater si la clé existe lors d'un INSERT
    Bonjour,

    J'inserts des donnée dans une base de donnée comme ceci
    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
     
    $query_add_ingredient = sprintf("INSERT INTO tb_recettes_ingredients (
    								id_ingredients,
    								tb_recettes_id_recettes,
    								tb_fruits_id_fruits,
    								fd_quantite
     
    							)VALUES	('%s','%s','%s','%s')",
     
    								mysql_real_escape_string("", $connect), 							
    								mysql_real_escape_string($_POST['id_recette'], $connect),
    								mysql_real_escape_string($id_fruits, $connect),
    								mysql_real_escape_string($quantite, $connect)
     
    							);																
    						mysql_query($query_add_ingredient,$connect) or die('Erreur SQL !'.$connect.'<br>'.mysql_error());

    Le problème que j'ai est le suivanr.

    Si les clé existes. C'est à dire, si ces deux valeurs (en gras) existe dans la base de donné
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mysql_real_escape_string($_POST['id_recette'], $connect),
    mysql_real_escape_string($id_fruits, $connect),

    J'aimerais alors qu'il ne créé pas un duplicat mais qu'il mette à jour le champs fd_quantite

    J'ai vu qu'il existait ceci
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO table (a,b,c) VALUES (1,2,3)
      ON DUPLICATE KEY UPDATE c=c+1;
     
    UPDATE table SET c=c+1 WHERE a=1;

    mais j'ai du mal a comprendre comment modifier mon code pour utiliser ON DUPLICATE KY UPDATE

    Pourriez-vous m'informer?

    Merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Sauf que visiblement, la clé de ta table, qui est pourtant, semble t-il, une table associative, n'est pas le couple {tb_recettes_id_recettes, tb_fruits_id_fruits} mais, je suppose, id_ingredients.

    Le ON DUPLICATE KEY va chercher le doublon éventuel sur cette colonne. Comme tu ne lui fournis pas de valeur car elle est probablement de type entier auto-incrémenté, il n'y aura jamais de doublon.

    Il faudrait vérifier si ON DUPLICATE KEY fonctionne sur une clé primaire multi-colonnes. Si c'est le cas, tu peux changer la structure de ta table en supprimant id_ingredients inutile et en faisant du couple précité ta clé primaire, comme il se doit sur toute table associative issue d'une association du MCD dont les cardinalités maximums sont à n.

    Si tu veux, ou si tu as besoin, de garder ta structure ainsi, il faut que tu fasses un TRIGGER BEFORE INSERT qui vérifiera si le couple est déjà présent dans la table et agira en conséquence. Et encore, je ne suis même pas sûr que ça fonctionne avec MySQL car ça demande de requêter la table dans laquelle on tente d'insérer une ligne.

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Oui en effet, je crois me trompé.
    Car en effet, la colonne "id_ingredient" est "primaire" et autoincrement. Donc elle ne pourra jamais est doublée.

    En fait ce que je cherche à faire est donc ceci:
    1. Si dans ma base de donnée j'ai deja la valeur de "13" pour la colonne tb_recettes_id_recettes, ET la valeur de "3" pour la colonne tb_fruits_id_fruits
    2. et que si mon formulaire en voir les meme valeurs pour les colonnes mentionnées, il met alors a jour la colonne tb_quantite
    3. si non, il INSERT et crée une nouvelle ligne, doit id_ingredients incrémente


    Voili, voilà

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Et bien j'ai donné une solution :
    Citation Envoyé par CinéPhil
    Si tu veux, ou si tu as besoin, de garder ta structure ainsi, il faut que tu fasses un TRIGGER BEFORE INSERT qui vérifiera si le couple est déjà présent dans la table et agira en conséquence. Et encore, je ne suis même pas sûr que ça fonctionne avec MySQL car ça demande de requêter la table dans laquelle on tente d'insérer une ligne.
    Une autre consiste à faire ça côté application, donc en PHP, avec le léger risque que la table soit modifiée entre le moment où tu la requêtes pour savoir si la ligne existe déjà et le moment où tu lance l'action selon le résultat de la première requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    ha oui excuse moi.
    Mais je t'avoue avoir du mal a comprendre utilisé ceci.

    J'ai une autre question.
    Si au lieux d'utilisé INSERT, j'utilise UPDATE. Avec UPDATE il y a pas moyen qu'il crée une ligne s'il ne trouve pas les condition du WHERE de l'UPDATE

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $sql_update_ingredient = 'UPDATE tb_recettes_ingredients 
    			SET 
    				tb_recettes_id_recettes = "'.$_POST['id_recette'].'",
    				tb_fruits_id_fruits		= "'.$id_fruits.'",
    				fd_quantite				= "'.$quantite.'",
     
    			WHERE tb_recettes_id_recettes LIKE '.$_POST['id_recette'].' AND tb_fruits_id_fruits LIKE '.$id_fruits;
    			mysql_query($sql_update_ingredient) or die('Error SQL !'.$sql_update_recette.'<br>'.mysql_error());

    Par ce que là, si je peux avoir un retour sur l'action, du genre 0 si rein a été update, je crée une condition qui va alors insérer une ligne.

    CA doit etre possible non?

    Merci pour ton aide
    PS: Je regarde encore le TRIGER BEFORE INSERT....

Discussions similaires

  1. [VB6]Comment savoir si un répertoire existe
    Par pendragon dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 30/09/2016, 06h42
  2. Comment imprimer un fichier text existant?
    Par AODRENN dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2005, 17h26
  3. comment savoir si une table existe dans la base?
    Par isa21493 dans le forum ASP
    Réponses: 6
    Dernier message: 01/09/2005, 17h09
  4. [javascript] Comment savoir si un div existe
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/08/2005, 17h13
  5. [URL] Comment savoir si une URL existe?
    Par jse dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 07/10/2004, 15h33

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