8721 sujets

Développement web côté serveur, CMS

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.

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.
Je ne comprend pas bien pourquoi tu ne défini pas les parents de chaque élève quitte à avoir des doublons:
Si tu veux obtenir un élève par-rapport à ses parents, comment feras-tu ?
En fait je trouve incohérent que seul un élève d'une famille ait ses parents indiqués.

Fais afficher la valeur de $verification, on comprendra sûrement mieux.
Modifié par juliendargelos (30 Mar 2013 - 21:35)
Le but de ce programme c'est de permettre à chaque parent de voter. Mais un seul vote. Donc le fait qu'ils aient plusieurs enfant ne sert pas.

De ce fait si j'ai 2 fois le même parent qui apparait (pour 2 enfants différents) je ne veux pas que la table aient 2 enregistrements car sinon la personne pourra voter 2 fois.
Salut, déja première constatation c'est la redondance de ton code, et qui dit redondance dit factorisation.
Ainsi créer une fonction qui passe en paramètre ($prenonm , $nom) me semble plus judicieux.
mais finalement, ce que je retiens c'est que je crois que tu peux te simplifier la vie avec une de requête SQL qui te permette d'éviter les doublons ... du type:
SELECT DISTINCT avec en option une sous requête, à toi de voir en fonction de tes besoins.
ou si tu as des jointures faire plutôt un GROUP BY
Modifié par lefelinherbivore (02 Apr 2013 - 14:29)