Problème de vérification PHP/MySQL

  • Auteur de la discussion Auteur de la discussion matbaldy
  • Date de début Date de début
Nouveau WRInaute
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:
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.
 
WRInaute accro
matbaldy a dit:
- 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
6 data par ligne dans le fichier pourtant :
$tableau[7] $tableau[8] ??? tu te serait pas embrouillé les manivelles dans tes indices ?

edit > après il y a le fait que tes noms prénoms sont cherchés en minuscule dans la base ($nommin1 = strtolower($tableau[4]) par exemple) mais qu'ils vont être insérés sans traitement (VALUES ("","","","'.$tableau[4].'",) ce qui va fatalement fausser le test suivant si le fichier contiens des majuscules.

Tu pourrait "optimiser un peut" et "uniformiser le traitement" en mettant cache tout en minuscule dès le départ ligne 7 de ton script :
PHP:
<span class="syntaxdefault"></span><span class="syntaxcomment">/* extraction d'une ligne */<br /></span><span class="syntaxkeyword">while(</span><span class="syntaxdefault">$ligne </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> fgets</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$fp</span><span class="syntaxkeyword">)){<br /></span><span class="syntaxdefault">       $ligne </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> strtolower</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$ligne</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">       $tableau </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">';'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$ligne</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">       </span><span class="syntaxkeyword">...</span><span class="syntaxdefault"> </span>
 
WRInaute accro
bon après comme j'ai rien de spécial a faire ce soir en y réfléchissant un peut tu te prend peut être la tête pour rien car tu pourrait te passer de ce test en créant une clé "unique" sur les deux champs "nom_votant" et "prenom_votant" ce qui fait que tout insert serait rejeté par la base si cette clé existe déjà ... du coup pas besoin de vérifier tu y va bourrin d'un coup en injectant tout et c'est mysql qui fait le ménage a l’entrée (c'est le mode videur)

Après il y a un truc qui me chagrine c'est justement pour les parents qui ont plusieurs enfants dans l'école que ce passe t il au niveau du champ du prénom de l'enfant ? il n'y en a qu'un qui est pris en compte ? ... pas logique ton truc.

En fait ce que ton script me dis c'est que tu t'est peut être planté dans le modèle a la base car tu devrais avoir au moins deux tables (ça peut aussi se faire avec une vue que c'est tous des personnes mais faisons simple)

une table parent, une table enfant reliés par des tables de liaison
(est l'enfant de 1 ou 2 parents -> couple d'id dans une table de liaison) (le parent est le papa ou la maman de -> couple d'id dans une table de liaison).
et une troisième table vote relié a la table parent par une relation qui règlerait le nombre de vote possibles (il serait aussi possible de déporter le vote dans la table parent si ils n'ont qu'une voix).
 
Nouveau WRInaute
En fait la partie élève ne sert pas trop.

1 parent ne peut voter qu'une fois, assez logique. Donc je dois éviter que le même parent apparaisse 2 fois dans ma table. Hors un même parent peu avoir plusieurs enfants et donc apparaitre sur X lignes différentes, d'où cette idée de vérification.

Ton idée de clé unique me plait mais je ne voit pas trop comment mettre ça en place et l'utiliser.
 
WRInaute accro
tu utilise phpmyadmin ? si oui dans l'onglet "structure" correspondant a ta table tu as un volet "index" qui te permet de créer des index de type unique sur 2 colonnes pas exemple. du coup les requêtes insert en doublon seront écartées.
 
Discussions similaires
Haut