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

Langage PHP Discussion :

Problème avec la fonction fgetcsv() et resource id#7


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut Problème avec la fonction fgetcsv() et resource id#7
    Bonjour à tous,

    Voilà j’ai un petit soucis avec ma fonction fgetcsv()
    En effet j’ai un fichier *.csv à ouvrir (cela fonctionne) et à traiter (cela fonctionne aussi) mais ce qui ne marche pas est ma boucle while…
    Je m’explique je veux que toutes les lignes de mon fichier soient traiter, or en ce moment le fichier est ouvert mais il n’y a que la première ligne du fichier qui est traité…

    Voici mon code qui vous parlera sûrement plus :

    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
     
    <?php
    /* Les variables et méthodes sont contenues dans une classe, aucun problème pour y accéder et les résultats sont ceux attendus */
     
    		/* ... On ouvre le fichier et on boucle pour récupérer toutes les lignes ... */
    		$ouverture = fopen($navette->fichier, "r");
     
    		while(($ligne = fgetcsv($ouverture, $navette->taille, $navette->delimiteur)) !== FALSE)
    		{
    			/* $ouverture = resource id#7 */	
    			/* ... On sépare les dates, heures et nom de pharmacies ... */
     
    			$navette->date_garde = $ligne[0];
    			$navette->heure_debut = $ligne[1];
    			$navette->heure_fin = $ligne[2];
    			$navette->nom_pharm = $ligne[3];
     
                             /* traitement des informations ... */
                    }
    ?>
    Ma variable $ouverture est égale à Resource id#7 lorsque je fais un echo ou un die dessus…

    Je pense que l’erreur vient de là mais je ne sais pas comment la régler…

    Merci d’avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Ton code fonctionne parfaitement :
    -> le "Resource id#7" est le résultat normal de la fonction fopen() (cf la doc)
    -> si tu fais un print_r($ligne) dans ta boucle tu verras qu'il est différent à chaque fois, que toutes tes lignes sont bien lues

    Par contre, tu modifies toujours la même variable $navette, ce qui ne peut pas être bon. Il te faut autant de navettes que de lignes dans ton CSV

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    $navette est un objet
    Donc si je dois avoir autant d'objet que de ligne dans mon fichier je suis pas rendu...

    [EDIT] je viens de faire un print_r et non justement $ligne n'est pas différent à chaque fois, il ne lit qu'une seul ligne...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ah ben après je sais pas précisément ce que tu veux faire ou comment tu gères tes variables.

    Une chose est sûre c'est que tu as l'impression que seule la première ligne de ton CSV est traitée, alors qu'elles le sont toutes, c'est juste que tu écrases tes résultats au fur et à mesure...

  5. #5
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    C quoi ton délimiteur de fichier CSV ?

    A quoi servent $navette->taille et $navette->delimiteur ?

    En fait je me pose la question sur ton while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(($ligne = fgetcsv($ouverture, $navette->taille, $navette->delimiteur)) !== FALSE)
    pourquoi pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while($ligne = fgetcsv($ouverture, 0, $navette->delimiteur))
    depuis php 5.3 taille = 0 donne la ligne ...


    Edit: En effet, les valeurs sont écrasées au fur et à mesure ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Merci de l'aide mais le 0 ne change rien...

    Mon délimiteur est le ;

    Je vais coller le code entier peut-être que ça éclairera plus...

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
     
    <?php
     
    require_once(dirname(__FILE__).'/navette.class.php');
    require_once(dirname(__FILE__).'/connexion_base.php');
     
     
    function moulinette_php($chemin)
    {
     
    	/* ... Instanciation de la classe fichier_navette() ... */
    	$navette = new fichier_navette();
     
    	/* ... On précise le chemin du fichier à ouvrir ... */
    	$navette->fichier = $chemin;
     
    	if($chemin == NULL)
    	{
    		die('Chemin du fichier invalide !');
    	}
    	else
    	{
     
    		/* ... On ouvre le fichier et on boucle pour récupérer toutes les lignes ... */
    		if (($ouverture = fopen($navette->fichier, "r")) !== FALSE)
    		{
    			while(($ligne = fgetcsv($ouverture, 0, $navette->delimiteur)) !== FALSE)
    			{
    				print_r($ligne);
     
    				/* ... On sépare les dates, heures et nom de pharmacies ... */
     
    				$navette->date_garde = $ligne[0];
    				$navette->heure_debut = $ligne[1];
    				$navette->heure_fin = $ligne[2];
    				$navette->nom_pharm = $ligne[3];
     
     
    				/* ... On stocke la position des différents séparateurs pour tester ... */
    				/* ... Si la ligne est conforme à ce que l'on recherche ... */
     
    				$ex_date = $navette->exist_date();
    				$ex_heure_debut = $navette->exist_heure_debut();
    				$ex_heure_fin = $navette->exist_heure_fin();
    				$ex_pharma = $navette->exist_pharma();
    				$ex_cp = $navette->exist_cp();
     
     
    				/* ... On stocke les différents éléments pour construire notre requête ... */
    				/* ... A savoir le jour, le mois etc ... */
     
    				$test_date = $navette->test_exist_date($ex_date);
    				$test_heure_debut = $navette->test_exist_heure_debut($ex_heure_debut);
    				$test_heure_fin = $navette->test_exist_heure_fin($ex_heure_debut, $ex_heure_fin, $test_date[0]);
    				$tStamp = $navette->timeStamp($test_heure_debut[0], $test_heure_debut[1], $test_heure_debut[2]);
    				$test_pharm = $navette->test_exist_pharma($ex_pharma);
    				$test_cp = $navette->test_exist_cp($ex_cp);
     
     
    				/*******************************************************************************************
    				 *																						  *
    				 *						On teste si la garde est de jour ou de nuit						  *
    				 *																					      *
    				 *								2 : Garde de jour										  *
    				 *								3 : Garde de nuit										  *
    				 *																						  *
    				*******************************************************************************************/
     
    				if($test_heure_debut[3] < 19)
    				{
    					$fperiode = 2;
    				}
    				else
    				{
    					$fperiode = 3;
    				}
     
     
    				/*******************************************************************************************
    				 *																						  *
    				 *									Echos de tests										  *
    				 *																						  *
    				********************************************************************************************/
     
    					echo "jour_debut = ". $test_heure_debut[0] .", mois_debut = ". $test_heure_debut[1] .", annee_debut = ". $test_heure_debut[2] .", heure_debut = ". $test_heure_debut[3] .", minute_debut = ". $test_heure_debut[4] ."<br /><br />";
    					echo "jour_fin = ". $test_heure_fin[0] .", mois_fin = ". $test_heure_fin[1] .", annee_fin = ". $test_heure_fin[2] .", heure_fin = ". $test_heure_fin[3] .", minute_fin = ". $test_heure_fin[4] ."<br /><br />";
    					echo "La periode de la garde est : ". $fperiode ."<br /><br />";
    					echo "timestamp = ". $tStamp ."<br /><br />";
    					echo "Pharmacie = ". $test_pharm ."<br /><br />";
    					echo "Code Postal = ". $test_cp ."<br /><br />";
     
    				/**********************************************************************************************/
     
     
    				/* ... On construit notre requête nous permettant de récupérer l'ID de la pharmacie ... */
     
    				$requete_sql = "SELECT p.ID
    								FROM pharmacie as p
    								INNER JOIN commune as C
    									ON C.ID = p.ID_comm
    									AND C.cp =  $test_cp
    									AND p.libelle = '$test_pharm'
    								";
     
    				$res = mysql_query($requete_sql) or die(mysql_error());
     
    				/* ... On traite le résultat de la requête ... */
     
    				while( $donnees = mysql_fetch_array($res))
    				{
    					$ID = $donnees['ID'];
    				}
     
     
    				/* ... On lève une exception si à la suite de notre requête ... */
    				/* ... On se trouve avec deux identifiants pour un même nom ... */
     
    				if(mysql_num_rows > 1)
    				{
    					throw new Exception("Deux pharmacies portent le même nom !");
    				}
    				else
    				{
    					return array($ID, $tStamp, $fperiode);
    				}
    			}
    		}
    	}
    }

  7. #7
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Oui donc comme disait torvalds17, tu écrases les données au fur et à mesure ...

    Il te faut modifier ta class en ajoutant un tableau contenant une liste d'objet des données de ta boucle while, OU alors créer une class collection d'objet contenant les navettes.

    Je te recherche le lien de cette discussion, ya tout ce que tu voudras.

  8. #8
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Voilà,

    Tu lis cette discussion: http://www.developpez.net/forums/d86...xe/debuts-poo/

    Puis tu modifies ton code avec des next dans ta boucle While, puis nous verrons bien la suite,

    Bon courage

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    J'avoue avoir pas mal de mal à comprendre tout ça :/

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Problème réglé !

    En fait une erreur à la ***... j'avais mis le return dans le while, donc le while se bloquait car il croyait que c'était la fin de la fonction...

    Merci infiniment tout de même à vous deux qui avez cherché avec moi où avait pu être l'erreur.

    Bonne soirée,

    Cordialement,

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

Discussions similaires

  1. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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