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 :

Soit un update soit un insert [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Par défaut Soit un update soit un insert
    Bonjour,

    J'explique mon problème ..

    Dans un formulaire je dois tester si le produit est dans la base de donnée, si c'est le cas je dois faire un update et si ce n'est pas le cas alors je fais un insert..
    Mais comment faire???

    voici mon code de départ ..

    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
    		$requete_txt = "select * from corolle_fiches_pdt where ref = '".$_GET['ref']."'";
    		$result = $bdd->result_to_array($bdd->query($requete_txt));
    		for($i=0;$i<count($result);$i++)
    		{
    			if ($_GET['ref'] == true)
    				{
    				$requete_txt = " UPDATE `corolle_fiches_pdt` SET ref = '".$_GET['ref']."',nom = '".$_GET['nom']."',age = '".$_POST['age']."',img = '".$_GET['ref']."',
    txt = '".$_POST['txt']."',fin = '".$_POST['fin']."',cdc = '".$_POST['cdc']."',cdc2 = '".$_POST['cdc2']."',buy = '".$_POST['buy']."' WHERE ref =  '".$_GET['ref']."'";
    				$bdd->query($requete_txt);
    				}
    			else
    			{
    			$requete_txt = "INSERT INTO `corolle_fiches_pdt`(`ref`,`nom`,`age`,`img`,`txt`, `fin`, `cdc`, `cdc2`, `buy`)VALUES('".($_GET['ref'])."','".($_GET['nom'])." ','".($_POST['age'])."','".($_GET['ref'])."','".($_POST['txt'])."','".($_POST['fin'])."','0','0','0')";
    			$bdd->query($requete_txt);
    			}
    		}

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Par défaut
    Alors pour commencer j'ai un petite question pourquoi tu fais boucle pour ?Normalement ta requete de sélection te retournera au maximum une seule ligne (-> dans le cas ou ton produit est présent).
    Si la ref est unique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $requete_txt = "select * from corolle_fiches_pdt where ref = '".$_GET['ref']."'";
    $result = $bdd->result_to_array($bdd->query($requete_txt));
    if(mysql_num_rows($result)>0){
        //modification
    }
    else{
       //insertion 
    }

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    Dans ce genre de cas, j'utilise souvent la technique du delete/insert : elle marche à tous les coups (donc le code est le même partout), mais seulement s'il n'y a pas de timestamp ou d'auto-increment dans la table, ni de problème d'accès concurrent.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Par défaut
    Salut,

    Voici une façon plus simple :
    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
     
    $requete_txt = "select * from corolle_fiches_pdt where ref = '".$_GET['ref']."'";
    $result = $bdd->result_to_array($bdd->query($requete_txt));
    if (count($result) > 0) {  // Si la référence existe : mise à jour
      $requete_txt = "UPDATE `corolle_fiches_pdt` SET ref = '".$_GET['ref'].
                     "',nom = '".$_GET['nom']."',age = '".$_POST['age'].
                     "',img = '".$_GET['ref']."', txt = '".$_POST['txt'].
                     "',fin = '".$_POST['fin']."',cdc = '".$_POST['cdc'].
                     "',cdc2 = '".$_POST['cdc2']."',buy = '".$_POST['buy'].
                     "' WHERE ref =  '".$_GET['ref']."'";
      $bdd->query($requete_txt);
    }
     
    else {                         // sinon : insersion
      $requete_txt = "INSERT INTO`corolle_fiches_pdt`(`ref`,`nom`,`age`,`img`,`txt`, `fin`, `cdc`, `cdc2`, `buy`)" . 
                     "VALUES('".($_GET['ref'])."','".($_GET['nom']).
                     "','".($_POST['age'])."','".($_GET['ref']).
                     "','".($_POST['txt'])."','".($_POST['fin'])."','0','0','0')";  			
      $bdd->query($requete_txt);
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Par défaut
    Merci ca fonctionne !! J'ai fait ca en fait -->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		$requete_txt = "DELETE FROM `corolle_fiches_pdt` WHERE `ref` = '".$_GET['ref']."'";
    		$bdd->query($requete_txt);
     
    		$requete_txt = "DELETE FROM `corolle_fiches_pdt_us` WHERE `ref` = '".$_GET['ref']."'";
    		$bdd->query($requete_txt);
     
    		$requete_txt = "INSERT INTO `corolle_fiches_pdt`(`ref`,`nom`,`age`,`img`,`txt`, `fin`, `cdc`, `cdc2`, `buy`)VALUES('".($_GET['ref'])."','".($_GET['nom'])." ','".($_POST['age'])."','".($_GET['ref'])."','".($_POST['txt'])."','".($_POST['fin'])."','0','0','0')";
    		$bdd->query($requete_txt);
     
    		$requete_txt = "INSERT INTO `corolle_fiches_pdt_us`(`ref`,`nom`,`age`,`img`,`txt`, `fin`, `cdc`, `cdc2`, `buy`)VALUES('".($_GET['ref'])."','".($_GET['nom_us'])." ','".($_POST['age'])."','".($_GET['ref'])."','".($_POST['txt_us'])."','".($_POST['fin_us'])."','0','0','0')";
    		$bdd->query($requete_txt);

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Par défaut
    OUi mais cette technique est à proscrire si tu utilises comme référence une clé primaire autoincrémentée : c'est la cata à tous les coups pour les tables liées.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Par défaut
    ya mieux q'un delete puis un insert: la fonction replace
    La solution se trouve probablement dans la fonction REPLACE de MySQL (qui existe également dans d'autres SGBD SQL). Comme expliqué par la documentation MySQL, celle-ci fonctionne exactement comme INSERT, mais fera l'équivalent d'un UPDATE (pour simplifier) dans le cas où la table dispose d'un index UNIQUE (un PRIMARY KEY sur id par exemple).

    Sa syntaxe est donc similaire à celle de INSERT :

    REPLACE INTO dvd (id, titre, annee, region) VALUES (17, 'Mary of Scotland', 1936, 1), (18, 'Marie Stuart', 1936, 2);

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/03/2010, 18h11
  2. Problème d'Update et D'Insert
    Par domux dans le forum JDBC
    Réponses: 6
    Dernier message: 10/07/2006, 11h31
  3. TMediaPlayer Couper soit le son soit l'image
    Par kurul1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/05/2006, 12h35
  4. [VBA-E]Probleme relevant soit de SQL soit de VB
    Par Xan dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 07/04/2006, 15h50
  5. Impossibilité de faire un update ou un insert
    Par nazimb dans le forum ASP.NET
    Réponses: 13
    Dernier message: 09/03/2006, 17h27

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