[RESOLU] Problème insertion données dans base de donnée sql en php

Petit nouveau ! | 4 Messages

14 juin 2018, 22:43

Bonsoir,
Cette page PHP me permet d'importer une nouvelle promotion d'étudiants dans deux tables distinctes (etudiant et promotion), tout marche parfaitement, mais il arrive que le foreach va 1 trop loin, j'ai donc une ligne vide qui s'affiche dans ma base de donnée avec un numéro étudiant puisque lui est auto-incrémenté. J'ai cherché pendant un bon moment sur le web, je mesuis pas mal creusé la tête à créer un compteur... Mais je suis arrivé à rien. Je voudrais donc savoir si certains d'entre vous ont déjà eu ce problème et pour m'aider à la régler?

Merci d'avance



?php 
    include('./structure/header.php');
    echo "<title> Enseignant </title>";
    include('./menu.php');
    include('./script/verifenseignant.php')
?>
<div class="col-md-4 col-lg-4 offset-md-4 offset-lg-4">
       </br></br>
          </br></br>
<?php 

                    if (isset($_FILES['file'])) {
                        try {
                            $pdo = new PDO('mysql:host=localhost;dbname=stidwakj_Stage;charset=utf8','stidwakj_Root', 'RootRootRoot', [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'']);
                            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        } catch (Exception $e) {
                            die('Erreur : '.$e->getMessage());
                        }
                        //UPLOAD DU FICHIER CSV, vérification et insertion en BASE
                        if (isset($_FILES["file"]["type"]) != "application/vnd.ms-excel") {
                            die("Ce n'est pas un fichier de type .csv");
                        } elseif (is_uploaded_file($_FILES['file']['tmp_name'])) {
                    		
                            $req = $pdo->prepare('INSERT INTO ETUDIANT (numetudiant, login, nom, prenom, ddn, mail, telephone) VALUES(?, ?, ?, ?, ?, ?, ?)');
                            $file = new SplFileObject($_FILES['file']['tmp_name']);
                            $file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY);
                            $file->setCsvControl(';', '"', '"');
                    		
						
                            foreach ($file as $row) {
                    			$prenom=substr($row[1],0,1);
                    			$nom=substr($row[0],0,5);
                    			$login1=$prenom.''.$nom;
								
								 include ('./script/connexion.php');
                                
                                
                                $requete = "SELECT max(numetudiant) maxi FROM ETUDIANT" ;
								$result = $connexion -> query($requete);
								echo $requete;
                                $ligne = $result -> fetch();
                                                            
                                $req->execute([$row[0], $login1, $row[0], $row[1], $row[2], $row[3], $row[4]]);
                                
                               
                                include ('./script/connexion.php');
								$requete = "INSERT INTO PROMOTION(annee, numetudiant) VALUES('".$_POST['anne']."','".$numetu."')";
								echo $requete;
								$sql = $connexion -> exec($requete);
								
								 
                            }
                            $req->closeCursor();
							
														
                            echo "La promotion des nouveaux étudiants a bien été ajouté!";
                        } else {
                            echo "ATTENTION!!La promotion des nouveaux étudiants n'a pas été ajouté!";
                        }
                    }
                   ?>
                    <!--Insertion balise form qui permet de récuéper le chemin du fichier qui contient la nouvelle promotion d'étudiants-->
                    <form enctype="multipart/form-data" action="" method="POST">
                        <div class="form-group">
                            <input name="file" type="file" />
							<!-- Bouton qui envoye le fichier dans la base de donnée-->
                            <p><input type="submit" value="Envoyez le fichier"/></p>
                            <!--Balise input qui permet de récupérer l'année choisie précédement en cachant la valeur-->
							 <input type='hidden' name="anne" type="file" value ='<?php echo $annee=substr($_POST['annee'],0,4); ?>'/>
                        </div>
                    </form>
                    
<?php include('./structure/footer.php'); ?>

Mammouth du PHP | 920 Messages

14 juin 2018, 22:48

le csv peut avoir une ligne vide à la fin. il faut ouvrir le fichier dans un éditeur de texte pour s'en rendre compte.

un test sur le contenu de $row au début du foreach permet de ne pas faire le traitement si c'est vide.

Petit nouveau ! | 4 Messages

15 juin 2018, 12:44

SUPER!! J'avais déjà vérifié mon fichier CSV, rien à signaler. Mais j'ai réussi à résoudre mon problème en vérifiant le contenu du $row, je n'avais pas pas pensé à ça, merci infiniment de cotre aide!