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 :

Problème de vérification SQL


Sujet :

PHP & Base de données

  1. #1
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut Problème de vérification SQL
    Bonjour

    Je suis actuellement sur un petit script PHP/MySQL pour un établissement scolaire et j'ai un soucis lors de l'import d'un fichier CSV.

    Ce fichier recense les élèves et les parents. Chaque ligne comporte :
    - nom de l'élève
    - prénom de l'élève
    - nom du parent 1
    - prénom du parent 1
    - nom du parent 2
    - prénom du parent 2

    L'élève est toujours présent, en revanche, il peut y avoir les 2 parents, le parent 1 seulement et le parent 2 seulement.

    Pour éviter d'ajouter plusieurs fois le même parent (par exemple plusieurs élèves de la même famille dans l'établissement), je fais une vérification censée m'empêcher l'ajout si le parent est déjà présent dans la table.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    if($fp = fopen($fichier,"r")){
    	//on ne lit pas la première ligne (en-tête)
    	$ligne = fgets($fp,4096);
    	/* extraction d'une ligne */
    	while($ligne = fgets($fp)){
    		$tableau = explode(';',$ligne);
    		for($i=0;$i<1;$i++){
    			//Vérification que la personne n'est pas déjà présente dans la table
    			$nommin1 = strtolower($tableau[4]);
    			$prenommin1 = strtolower($tableau[5]);
    			$verification = mysql_query('SELECT * FROM votants WHERE nom_votant = "'.$nommin1.'" AND prenom_votant = "'.$prenommin1.'"');
    			$resultat = mysql_num_rows($verification);
    			if($tableau[4]!='' && $tableau[5]!='' && $resultat == 0){
    				$parent1 = mysql_query('INSERT INTO votants (id_votant,login_votant,mdp_votant,nom_votant,prenom_votant,nom_eleve,prenom_eleve,classe_eleve,etat_votant)
    					VALUES ("","","","'.$tableau[4].'","'.$tableau[5].'","'.$tableau[0].'","'.$tableau[1].'","'.$tableau[2].'","")');
    				if($parent1){
    					echo 'requête '.$tableau[4].$tableau[5].' OK.<br />';
    				}
    			}
    			//Vérification que la personne n'est pas déjà présente dans la table
    			$nommin2 = strtolower($tableau[7]);
    			$prenommin2 = strtolower($tableau[8]);
    			$verification2 = mysql_query('SELECT * FROM votants WHERE nom_votant = "'.$nommin2.'" AND prenom_votant = "'.$prenommin2.'"');
    			$resultat2 = mysql_num_rows($verification2);
    			if($tableau[7]!='' && $tableau[8]!='' && $resultat2 == 0){
    				$parent2 = mysql_query('INSERT INTO votants (id_votant,login_votant,mdp_votant,nom_votant,prenom_votant,nom_eleve,prenom_eleve,classe_eleve,etat_votant)
    					VALUES ("","","","'.$tableau[7].'","'.$tableau[8].'","'.$tableau[0].'","'.$tableau[1].'","'.$tableau[2].'","")');
    				if($parent2){
    					echo 'requête '.$tableau[7].$tableau[8].' OK.<br />';
    				}
    			}
    		}
    	}
    	echo '<span style="color: #009900;font-weight: bold;">Upload effectué avec succès !</span><br />';
    }
    Visiblement mon code de vérification ne fonctionne pas mais je n'arrive pas à trouver pourquoi.

    Merci pour votre aide.

  2. #2
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu fais la vérification en mettant le nom en minuscules mais l'insertion en laissant le nom tel quel.
    Ca peut poser un problème.
    Pour debuguer affiche tes requêtes et contrôle tes cas de doublons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if($parent1){
    	echo 'requête '.$tableau[4].$tableau[5].' OK.<br />';
            echo 'SELECT * FROM votants WHERE nom_votant = "'.$nommin1.'" AND prenom_votant = "'.$prenommin1.'"<br />';
    }
    Sinon un méthode plus rapide est de d'ajouter une clef d'unicité sur prenom/nom du parent
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Qu'appel tu clé d'unicité?

  4. #4
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans Phpmyadmin ajoute un index de type UNIQUE portant sur les colonnes nom et prénom.
    Avantage : cela garanti que tu n'auras aucun doublon, tu peux faire ta routine d'ajout sans contrôles.
    Désavantage : tu ne peux pas avoir d'homonymes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    OK pour le principe. Mais du coup :
    - Faire mes ajouts sans contrôle ne va t'il pas engendrer des erreurs? Est ce que le script continuera de se faire si un doublon est trouvé?
    - Pas d'homonymes ... ok. Mais si j'ai un Charles MACHIN présent et que je veut ajouter un Charles TRUC ou un Jean MACHIN, ça ne gênera pas?

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    le problème c'est que rien n’empêche d'avoir 2 couplke nom et prénom identique et étant 2 personne distinct

    donc tu importes ton fichier dans une table temporaire...
    tu te sers d'elle pour extraire ce qui va remplir tes tables ensuite...

    sans plus d'info stocker pour dédoublonner les homonynes sur les noms courant (genre Martin, etc..)

    pas besoin d'index unique...
    admettons que ta table d'import est truc:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select n_parent1 as nom,p_parent1 as prenom
    from truc
    union
    select n_parent2 as nom,p_parent2 as prenom
    from truc
    order by nom,prenom
    et hop tes 2 colonnes de parent n'en font qu'une, sont dédoublonnées et dans l'ordre alphabétique
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  7. #7
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Je ne suis pas sur de tout avoir saisi dans ton raisonnement.

    OK pour le fait qu'un couple nom/prénom puisse être identique mais avec 2 personnes distinctes. Mais dans ce cas je ne sais pas comment gérer la situation ...

    Pour le reste de ton explication je suis totalement perdu.

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    l'union te permet de coller cul à cul 2 jeux de résultats identiques en terme de structure (ici ton couple nom/prénom des parents)

    tu veux une liste unique à partir de 2 jeux de valeurs cote à cote c'est le

    l'union par défaut dédoublonne sauf si tu fais un "union all"
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Discussions similaires

  1. [SQLserver2000][SQLServer CE] problème de requête SQL
    Par JBernn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/01/2005, 09h29
  2. [Interbase] Problème de syntaxe SQL
    Par navis84 dans le forum InterBase
    Réponses: 4
    Dernier message: 22/12/2004, 17h07
  3. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58
  4. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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