Comparaison de requete SQL

Résolu
Bonjour bonjour,

Voila, je fais une petite application php, je doit récupérer des données dans un formulaire et les entrer dans une base de données SQLServer. Jusque là rien de compliqué.
Mais avant d'enregistrer les données je voudrais vérifier si l'enregistrement n'existe pas déjà.
Pour cela je me base sur 3 champs (nom, prénom et date de naissance).

Je ne sais pas comment m'y prendre pour ce contrôle.

Si quelqu'un a une idée....

Merci d'avance pour votre aide.
Configuration: Windows XP
Firefox 3.0.5

32 réponses

Résumé de la discussion

Une application PHP doit récupérer des données d'un formulaire et les insérer dans une base SQL Server, tout en évitant les doublons sur nom, prénom et date de naissance. Plusieurs réponses suggèrent de vérifier l'existence avec une requête SELECT utilisant les trois champs, puis d'insérer seulement si aucun enregistrement n'est trouvé. Des échanges portent aussi sur la syntaxe, notamment l'emploi correct de AND, et sur le choix entre SELECT COUNT(*) et la vérification directe via mssql_num_rows. Des extraits de code montrent des erreurs courantes liées à la gestion des POST, à la construction des requêtes et à la gestion des dates lors d'une insertion conditionnelle.

Bobot (l’IA à votre service)
  1. Il faut laisser faire l'auto-incrément de la table lors de l'insertion (donc mettre NULL en premier paramètre et non 0002).
    @+ n'oublie pas de marquer comme résolu.
    1. Woah trop de la boulette ca marche, le nouvel enregistrement s'insere dans la table.

      Un immense merci à toi !!!!!!

      C'etait quoi qui allait pas ???
      1. Attention la requete INSERT INTO a la fin a été modifiée, recopie bien tout:

        <?php
        //script de connexion à la base sous SQLServer
        include("connexion.inc");
        
        //connexion à la base de données
        $con = mssql_connect($host,$user,$pass)or die ("Probleme de connexion au serveur");
        mssql_select_db($BDD,$con)or die ("Problème d'accès à la base de données bdd_test_pilotes");
        
        //récupération des données formulaire
        $table="pilotes";
        $nom="";
        if(!empty($_POST["fnom"]))
        {
        	$nom=$_POST["fnom"];
        }
        $prenom="";
        if(!empty($_POST["fprenom"]))
        {
        	$prenom=$_POST["fprenom"];
        }
        $date="";
        if(!empty($_POST["fdate"]))
        {
        	$date=$_POST["fdate"];
        }
        
        //Test des valeurs reçues
        echo("Nom : " . $nom . "<br />Prenom : " . $prenom . "<br />Date naiss. :" . $date);
        
        //Requete SQL pour test
        $query = "SELECT * FROM " . $table . " WHERE nom='" . $nom . "' AND prenom='" . $prenom . "' AND date_naissance='" . $date . "'";
        
        if(strlen($nom)!=0)&&(strlen($prenom)!=0)&&(strlen($date)!=0))
        {
        	$result = mssql_query($query, $con);
        	echo("Nb enregistrement trouv&eacute;(s): ". mssql_num_rows($result));
        	if (mssql_num_rows($result) != 0)
        	{
        		echo "Enregistrement déjà présent dans la base de données.";
        	}
        	else
        	{
        		if(!mssql_query("INSERT INTO " . $table . "(code, nom, prenom, date_naissance) VALUES (NULL, '" . $nom . "', '" . $prenom . "', '" . $date . "')", $con))
        		{
        			echo("erreur");
        		}
        		else
        		{
        			echo("c'est bon");
        		}
        	}
        }
        
        mssql_close(); // Fermeture de la connexion
        ?>
        1. ah ! changement ...

          en plus des champs j'ai : NB enregistrements trouvés = 0 erreur
          1. Une dernière tentative...:

            <?php
            //script de connexion à la base sous SQLServer
            include("connexion.inc");
            
            //connexion à la base de données
            $con = mssql_connect($host,$user,$pass)or die ("Probleme de connexion au serveur");
            mssql_select_db($BDD,$con)or die ("Problème d'accès à la base de données bdd_test_pilotes");
            
            //récupération des données formulaire
            $table="pilotes";
            $nom="";
            if(!empty($_POST["fnom"]))
            {
            	$nom=$_POST["fnom"];
            }
            $prenom="";
            if(!empty($_POST["fprenom"]))
            {
            	$prenom=$_POST["fprenom"];
            }
            $date="";
            if(!empty($_POST["fdate"]))
            {
            	$date=$_POST["fdate"];
            }
            
            //Test des valeurs reçues
            echo("Nom : " . $nom . "<br />Prenom : " . $prenom . "<br />Date naiss. :" . $date);
            
            //Requete SQL pour test
            $query = "SELECT * FROM " . $table . " WHERE nom='" . $nom . "' AND prenom='" . $prenom . "' AND date_naissance='" . $date . "'";
            
            if(strlen($nom)!=0)&&(strlen($prenom)!=0)&&(strlen($date)!=0))
            {
            	$result = mssql_query($query, $con);
            	echo("Nb enregistrement trouv&eacute;(s): ". mssql_num_rows($result));
            	if (mssql_num_rows($result) != 0)
            	{
            		echo "Enregistrement déjà présent dans la base de données.";
            	}
            	else
            	{
            		if(!mssql_query("INSERT INTO " . $table . "(code, nom, prenom, date_naissance) VALUES ('000002', '" . $nom . "', '" . $prenom . "', '" . $date . "')", $con))
            		{
            			echo("erreur");
            		}
            		else
            		{
            			echo("c'est bon");
            		}
            	}
            }
            
            mssql_close(); // Fermeture de la connexion
            ?>
            1. euh pareil, les champs du formulaires
              1. Bien vu l'erreur vient sans doute de cet oubli!
            2. Attention à la faute de frappe dans le code de Benno
              if(($nom!='')&&($prenom!='')&&($date!=''))
              1. Et ce code affiche quoi:

                <?php
                //script de connexion à la base sous SQLServer
                include("connexion.inc");
                
                //connexion à la base de données
                $con = mssql_connect($host,$user,$pass)or die ("Probleme de connexion au serveur");
                mssql_select_db($BDD,$con)or die ("Problème d'accès à la base de données bdd_test_pilotes");
                
                //récupération des données formulaire
                $table="pilotes";
                $nom="";
                if(!empty($_POST["fnom"]))
                {
                	$nom=$_POST["fnom"];
                }
                $prenom="";
                if(!empty($_POST["fprenom"]))
                {
                	$prenom=$_POST["fprenom"];
                }
                $date="";
                if(!empty($_POST["fdate"]))
                {
                	$date=$_POST["fdate"];
                }
                
                //Test des valeurs reçues
                echo("Nom : " . $nom . "<br />Prenom : " . $prenom . "<br />Date naiss. :" . $date);
                
                //Requete SQL pour test
                $query = "SELECT * FROM " . $table . " WHERE nom='" . $nom . "' AND prenom='" . $prenom . "' AND date_naissance='" . $date . "'";
                
                if(($nom!="")&&($prenom!="")&&($date!=""))
                {
                	$result = mssql_query($query, $con);
                	echo("Nb enregistrement(s) trouv&eacute;(s): ". mssql_num_rows($result));
                	if (mssql_num_rows($result) != 0)
                	{
                		echo "Enregistrement déjà présent dans la base de données.";
                	}
                	else
                	{
                		if(!mssql_query("INSERT INTO " . $table . "(code, nom, prenom, date_naissance) VALUES (NULL, '" . $nom . "', '" . $prenom . "', '" . $date . "')", $con))
                		{
                			echo("erreur");
                		}
                		else
                		{
                			echo("c'est bon");
                		}
                	}
                }
                
                mssql_close(); // Fermeture de la connexion
                ?>
                1. Essaye ceci... (code reformaté avec quelques modifs)... Et dis moi ce qui s'affiche.

                  <?php
                  //script de connexion à la base sous SQLServer
                  include("connexion.inc");
                  
                  //connexion à la base de données
                  $con = mssql_connect($host,$user,$pass)or die ("Probleme de connexion au serveur");
                  mssql_select_db($BDD,$con)or die ("Problème d'accès à la base de données bdd_test_pilotes");
                  
                  //récupération des données formulaire
                  $table="pilotes";
                  $nom="";
                  if(!empty($_POST["fnom"]))
                  {
                  	$nom=$_POST["fnom"];
                  }
                  $prenom="";
                  if(!empty($_POST["fprenom"]))
                  {
                  	$prenom=$_POST["fprenom"];
                  }
                  $date="";
                  if(!empty($_POST["fdate"]))
                  {
                  	$date=$_POST["fdate"];
                  }
                  
                  //Test des valeurs reçues
                  echo("Nom : " . $nom . "<br />Prenom : " . $prenom . "<br />Date naiss. :" . $date);
                  
                  //Requete SQL pour test
                  $query = "SELECT * FROM " . $table . " WHERE nom='" . $nom . "' AND prenom='" . $prenom . "' AND date_naissance='" . $date . "'";
                  
                  if(($nom!='')&&($prenom!='')&&($date=''))
                  {
                  	$result = mssql_query($query, $con);
                  	if (mssql_num_rows($result) != 0)
                  	{
                  		echo "Enregistrement déjà présent dans la base de données.";
                  	}
                  	else
                  	{
                  		if(!mssql_query("INSERT INTO " . $table . "(code, nom, prenom, date_naissance) VALUES ('000002', '" . $nom . "', '" . $prenom . "', '" . $date . "')", $con))
                  		{
                  			echo("erreur");
                  		}
                  		else
                  		{
                  			echo("c'est bon");
                  		}
                  	}
                  }
                  
                  mssql_close(); // Fermeture de la connexion
                  ?>
                  1. Avant j'y rentrais de sur, maintenant on dirais que non.

                    voici le code :

                    <?php
                    //script de connexion à la base sous SQLServer
                    include("connexion.inc");

                    //connexion à la base de données
                    $con=mssql_connect($host,$user,$pass)or die ("Probleme de connexion au serveur");
                    mssql_select_db($BDD,$con)or die ("Problème d'accès à la base de données bdd_test_pilotes");

                    //récupération des données formulaire
                    $table="pilotes";
                    $nom=""; if(!empty($_POST["fnom"]))
                    $nom=$_POST["fnom"];
                    $prenom=""; if(!empty($_POST["fprenom"]))
                    $prenom=$_POST["fprenom"];
                    $date=""; if(!empty($_POST["fdate"]))
                    $date=$_POST["fdate"];

                    //controle
                    $query = "SELECT nom, prenom, date_naissance FROM".$table."WHERE nom='".$nom."' AND prenom='".$prenom."' AND date_naissance='".$date."'";

                    if(($nom!='')&&($prenom!='')&&($date=''))
                    {
                    $result = mssql_query($query, $con);
                    if (mssql_num_rows($result) != 0)
                    {
                    echo "Enregistrement déjà présent dans la base de données.";

                    }
                    else
                    {
                    if(!mssql_query("insert into ".$table."(code, nom, prenom, date_naissance) values ('000002', '".$nom."', '".$prenom."', '".$date."')", $con))
                    {
                    echo("erreur");
                    }
                    else
                    {
                    echo("c'est bon");
                    }
                    }
                    }

                    @mssql_close(); // Fermeture de la connexion
                    ?>
                    1. Es-tu sûre de rentrer dans le if(($nom!='')&&($prenom!='')&&($date!='')) ? As-tu fait un echo pour t'en assurer ?
                      Peux-tu nous re-montrer le code tel qu'il est actuellement ?
                      1. je vais devenir folle avec ce truc !!!

                        il ne se passe strictement rien.

                        Je doit faire un truc de travers c'est pas possible.
                        1. essaie de lui rajouter des signalemens, comme ça:

                          $query = "SELECT nom, prenom, date_naissance FROM ".$table." WHERE nom='".$nom."' AND prenom='".$prenom".'  AND date_naissance='".$date."'";
                          
                          $rs=mssql_query($query, $con);
                          
                          if(mssql_num_rows($rs)!=0)
                          {
                                         echo("Utilisateur déja enregistré");
                          }
                          else
                          {
                                      if(!mssql_query("INSERT INTO ".$table." (nom, prenom, date_naissance) VALUES ('".$nom."', '".$prenom."', '".$date."')", $con))
                                      {
                                           echo("samarshpa");
                                      }
                                      else
                                      {      echo("c bon");      }
                          }
                          1. toto : J'ai bien rajouté les and aussi tkt, lol. ca fait rien.

                            niahoo : dsl ta solution ne marche pas non plus

                            C'est le néant aucune action, la requete insert ne s'effectue pas

                            mystère....lol
                            1. j'ai bien mis les apostrophes.
                              et j'ai rajouté la ligne que tu m'a dit.

                              Mais il ne se passe rien dans la base.

                              et j'ai pas de message d'erreur c'est déjà bien. hi
                              1. t'as essayé ce que je t'ai donné ?
                            2. décidément, je n'y arriverai pas... Il faut bien les AND aussi
                              $query = "SELECT nom, prenom, date_naissance FROM $table WHERE nom='$nom' AND prenom='$prenom' AND date_naissance='$date'";
                              1. $query = "SELECT nom, prenom, date_naissance FROM ".$table." WHERE nom='".$nom."' AND prenom='".$prenom".'  AND date_naissance='".$date."'";
                                
                                $rs=mssql_query($query, $con);
                                
                                if(mssql_num_rows($rs)!=0)
                                {
                                               echo("Utilisateur déja enregistré");
                                }
                                else
                                {
                                             mssql_query("INSERT INTO ".$table." (nom, prenom, date_naissance) VALUES ('".$nom."', '".$prenom."', '".$date."')", $con);
                                }


                                si ton champ code est en auto increment ou serial, tu ne dois pas le mettre dan ta requête
                                • 1
                                • 2