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 :

insert si vide et update sinon [PDO]


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 insert si vide et update sinon
    Bonjour,

    je voudrais mettre à jour une bdd de membres : si le membre est nouveau, faire un insert et sinon un update, donc je commence par compter le nombre de membres portant le nom et le prénom donnés. Mais mon code doit être faux car il devrait renvoyer 0 alors qu'il renvoit 4 (le nombre de champs de la table). Il est où mon problème ?

    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
    	$connexion=connect();
    	$sql="SELECT * from `patient` WHERE (nom=:nom AND prenom=:prenom)";
    	$prep = $connexion->prepare($sql);
    	//Associer des valeurs aux place holders
    	$prep->bindValue(':nom', $_POST['nom'], PDO::PARAM_STR);
    	$prep->bindValue(':prenom', $_POST['prenom'], PDO::PARAM_STR);	
    	$prep->execute();
    	$colcount = $prep->columnCount();
    	echo "colcount=".$colcount."<br/>";
    	if ($colcount==0)	
    			$sql="INSERT INTO `patient` (nom,prenom,date_naissance) VALUES (:nom,:prenom,:champ_date)";
    	else
    			$sql="UPDATE `patient` SET nom=:nom,prenom=:prenom,date_naissance=:champ_date";
     
    	$prep = $connexion->prepare($sql);
     
    	//Associer des valeurs aux place holders
    	$prep->bindValue(':nom', $_POST['nom'], PDO::PARAM_STR);
    	$prep->bindValue(':prenom', $_POST['prenom'], PDO::PARAM_STR);
    	$prep->bindValue(':champ_date', setFrenchDate($_POST['date_naissance']), PDO::PARAM_STR);
     
    	//Compiler et exécuter la requête
    	$prep->execute();

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Avec mysql on peut faire une unique requête avec ON DUPLICATE KEY UPDATE.

    EDIT et pour l'erreur, mysql te donne le résultat que tu lui demande (columnCount retourne le nombre de colonnes sélectionnées).

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    A part cela je vois une erreur de conception dans ton code car deux patients peuvent avoir un même prénom et un même nom. Il faut utiliser un identifiant unique pour les distinguer (ex : numéro de secu).

  4. #4
    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 pour l'erreur de conception (je m'en occuperai plus tard), mais pour l'instant j'essaye d'utiliser ON DUPLICATE KEY UPDATE. Il est pas d'accord avec mon code :
    ERREUR PDO dans C:\wamp\www\petit_site\action_patient.php L.28 : SQLSTATE[HY093]: Invalid parameter number
    Où me suis-je tromper ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql="INSERT INTO `patient` (nom,prenom,date_naissance) VALUES (:nom,:prenom,:champ_date) ON DUPLICATE KEY UPDATE nom=:nom,prenom=:prenom,date_naissance=:champ_date";

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    je m'en occuperai plus tard
    Ah... ben alors bon courage pour déterminer, entre nom, prenom et date de naissance lequel sera la clé unique !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  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 ne peux pas avoir deux paramètres avec le même nom
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `patient` (nom,prenom,date_naissance) VALUES (:nom,:prenom,:date) ON DUPLICATE KEY UPDATE nom=:nom_update, prenom=:prenom_update, date_naissance=:date_update
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Sur le principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     "...ON DUPLICATE KEY UPDATE 
    			nom = VALUES(nom)
    			,prenom = VALUES(prenom)
    			,date_naissance = VALUES(date_naissance)";
    Mais pour que ON DUPLICATE KEY UPDATE fonctionne correctement il faudrait définir dans ta table une clé unique éventuellement constituée par la combinaison de plusieurs colonnes.

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    À vrai dire, j'ai surtout du mal à comprendre pourquoi tu veux faire un UPDATE...

    À part les cas rares (et que tu ne sembles d'ailleurs pas chercher) d'une femme qui s'est mariée, je vois pas comment une personne peut changer de nom, de prénom ou de date de naissance... mais dans ce cas là, ce toujours un INSERT qu'il faut faire...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  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
    Ca me rappelle quelque chose car une fois j'avais déjà utilisé cela, mais j'ai plus rien dessus ; tu peux préciser cette histoire de clé unique ?

    Et sinon, merci Sabotage ; j'avais compris ta remarque sans lire ton code ...et :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	$sql="INSERT INTO `patient` (nom,prenom,date_naissance) VALUES (:nom,:prenom,:champ_date) ON DUPLICATE KEY UPDATE nom=:nom2,prenom=:prenom2,date_naissance=:champ_date2;";
     
    	$prep = $connexion->prepare($sql);
     
    	//Associer des valeurs aux place holders
    	$prep->bindValue(':nom', $_POST['nom'], PDO::PARAM_STR);
    	$prep->bindValue(':prenom', $_POST['prenom'], PDO::PARAM_STR);
    	$prep->bindValue(':champ_date', setFrenchDate($_POST['date_naissance']), PDO::PARAM_STR);
    	$prep->bindValue(':nom2', $_POST['nom'], PDO::PARAM_STR);
    	$prep->bindValue(':prenom2', $_POST['prenom'], PDO::PARAM_STR);
    	$prep->bindValue(':champ_date2', setFrenchDate($_POST['date_naissance']), PDO::PARAM_STR);

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

Discussions similaires

  1. [AC-2010] UPDATE sinon INSERT dans une requete
    Par Mut dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/03/2012, 08h03
  2. Update sinon Insert
    Par yamatoshi dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/06/2010, 09h38
  3. [Conception] INSERT fonctionne a moitié, UPDATE Fonctionne, comprends pas?
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 06/09/2006, 17h22
  4. Erreur INSERT id vide
    Par concombre dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 26/05/2006, 17h23
  5. INSERT ... ON DUPLICATE KEY UPDATE
    Par luffy san dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/10/2005, 17h29

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