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 :

Variable qui disparait temporairement ? [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut Variable qui disparait temporairement ?
    Bonjour,

    Je suis entrain d'écrire un petit script qui ne me semblait pas compliqué mais la je suis tombé sur un bel os...

    En fait je dois traiter un fichier csv pour importer une liste d'élèves dans une base de données. J'ai donc commencé par lire le fichier csv, jusque la pas de soucis, je retrouve mes petits.

    Juste après, je fais une requête grâce à PDO. Vient ensuite l'étape ou je dis au script de vérifier si la donnée du csv est égale à la donnée du select de la base de donnée pour faire des actions sur la base ou non.

    Du coup quand la condition est vraie j'ai bien accès aux variables de données du csv et je rentre dans le if, en revanche quand la condition est fausse je ne rentre pas dans le else et il ne m'affiche pas la variable de données du csv comme si elle n'existait pas.

    Également dans le bloc de code ligne 4 à 8 le message ne s'affiche que lorsque la condition est vrai sinon rien ne s'affiche.

    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
     
    $requete = $bdd->query("SELECT ID FROM eleves WHERE ID = $donneeCsv[$numEleve]");
                        while($donneeSelect = $requete->fetch()){
                            if(isset($donneeCsv[$numEleve])){
                                echo "OK - ";
                            }else{
                                echo "KO - ";
                            }
                            if( $donneeCsv[$numEleve] == $donneeSelect['ID']  ){
                                 print "<strong class=\"elevePresentEnBase\">" . $donneeCsv[$nomEleve] . " " . $donneeCsv[$prenomEleve] . " ==> Cet élève existe déjà dans la base de données</strong>";
                            }
                            else{
                                echo "on passe dans le else";
                                $insertionDonnees = $bdd->prepare('INSERT INTO eleves(ID, nom, prenom, dob, classe) VALUES(:id, :nom, :prenom, :DoB, :classe)');
                                $insertionDonnees->execute(array(   
                                    'id'        => $donneeCsv[$numEleve],
                                    'nom'       => $donneeCsv[$nomEleve],
                                    'prenom'    => $donneeCsv[$prenomEleve],
                                    'DoB'       => $donneeCsv[$naissanceEleve],
                                    'classe'    => $donneeCsv[$classeEleve]
                                 ));
                                 echo "<strong class=\"eleveAbsentEnBase\">" . $donneeCsv[$nomEleve] . " " . $donneeCsv[$prenomEleve] . " ==> Cet élève à été ajouté à la base de données</strong>";
                            }
    Quelqu'un aurait une petite idée sur ce qui bloque ?

    Merci d'avance pour votre aide.

  2. #2
    Membre actif Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Par défaut
    bin c'est normal peut etre des problemes de vue de mon coté mais tu dois fermer ta boucle while




    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Euh... La condition de ton if c'est $donneeCsv[$numEleve] == $donneeSelect['ID'] et la condition dans la requête c'est ID = $donneeCsv[$numEleve].
    Autant appeler "Kevin !" et ensuite à demander à celui qui répond "Au fait, tu t'appelles Kevin ?".
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre averti
    Profil pro
    étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    @Arman, merci pour ta réponse mais dans le script c'est bien fermé, j'ai oublié de mettre l'accolade fermante dans le C/C

    @Celira, oui ça peut paraître étrange, ça l'est même surement mais je n'ai pas trouvé d'autres façons de faire. En fait ma base contiendra des élèves qui seront présent dans l'école et d'autres qui n'y sont plus (mais il faut quand même les garder). Le seul soucis c'est que chaque années on devra faire un import des nouveaux élèves via un fichier csv qui contiendra l'ensemble des élèves.

    C'est pourquoi je veux comparer le csv avec la BDD, j'ai pas envie de me faire jeter par des erreurs SQL toutes les 3 lignes.
    Et je souhaite afficher un rapport sur la page d'import des élèves qui dira ce qui est fait ou pas.
    Voilà pourquoi il y a cette condition "bizarre".

    Biensûr si tu connais un autre moyen de faire je suis tout ouie.

  5. #5
    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
    Par défaut
    Question de logique : il faut donc comparer le fichier avec la table et pas l'inverse.

    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
    <?php
    $sth_select = $bdd->prepare("SELECT ID FROM eleves WHERE ID = :id");
     
    $sth_insert = $bdd->prepare('INSERT INTO eleves(ID, nom, prenom, dob, classe) VALUES(:id, :nom, :prenom, :DoB, :classe)');
     
    if (($handle = fopen("fichier.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
     
    		$id = $data[xxxx];
    		$nom = $data[xxxx];
    		$prenom = $data[xxxx];
    		$dob = $data[xxxx];
    		$classe = $data[xxxx];
     
    		$sth_select->execute(array(':id'=>$numEleve));
    		if ($sth_select->rowCount() == 1) {
    			print "<strong class=\"elevePresentEnBase\">" . $nom . " " . $prenom . " ==> Cet élève existe déjà dans la base de données</strong>";
    		}
    		else {
     
    			$insertionDonnees->execute(array(
    				':id'        => $id,
    				':nom'       => $nom,
    				':prenom'    => $prenom,
    				':DoB'       => $dob,
    				':classe'    => $classe
    			 ));
    			 echo "<strong class=\"eleveAbsentEnBase\">" . $nom . " " . $prenom . " ==> Cet élève à été ajouté à la base de données</strong>";
    		}
    	}
    }
    Et les prepare() ça se fait en dehors des boucles.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Autre solution :
    1) Importer le fichier csv dans une table temporaire avec LOAD DATA INFILE.

    2) Avec une requête, insérer les lignes de la table temporaire qui ne sont pas déjà présentes dans la table de production. MySQMerde ne connaissant pas les requêtes MERGE, il faut faire une requête de ce genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO eleves (ID, nom, prenom, dob, classe)
    SELECT ID, nom, prenom, dob classe
    FROM import_eleve i
    WHERE NOT EXISTS
    (
    	SELECT *
    	FROM eleves e
    	WHERE e.ID = i.ID
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre averti
    Profil pro
    étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Bonjour Sabotage et CinePhil,

    Merci pour vos réponses ça fonctionne parfaitement !

    Je ne connaissais pas la fonction rowCount de PDO et je sens qu'elle me sera très utile ^^.

  8. #8
    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
    Par défaut
    MySQMerde ne connaissant pas les requêtes MERGE, il faut faire une requête de ce genre
    Il existe une syntaxe équivalente en Mysql
    https://dev.mysql.com/doc/refman/5.7...duplicate.html
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable qui disparait en submit
    Par jejeman dans le forum Zend Framework
    Réponses: 1
    Dernier message: 13/06/2012, 19h30
  2. [MySQL] Variable qui disparait apres formulaire
    Par RomFou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/07/2010, 14h53
  3. [CR 8] Résultat d'une variable shared qui disparait
    Par ARONE dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/12/2009, 08h56
  4. Shellscript: variable qui disparait
    Par frankois dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 23/01/2009, 15h51
  5. Contenu d'une variable qui disparait :/
    Par Aleksis dans le forum C++
    Réponses: 10
    Dernier message: 02/06/2006, 15h50

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