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 :

Retroanalyse : identification d'un array pour générer un csv


Sujet :

Langage PHP

  1. #1
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut Retroanalyse : identification d'un array pour générer un csv
    Bonjour,

    Je dois générer un fichier csv à partir du résultat d'une requête et je ne retrouve pas dans le code ci-dessous la variable de type array que je pourrais utiliser pour générer mon csv via la fonction "fputcsv" :

    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
     
    $query = "SELECT * FROM stock_livraison ".$innerjoin." WHERE 1=1 ".$where_recipient." ".$where_like." ".$where_date." ".$groupby." ORDER BY date_note DESC, loga_ref = REPLACE (loga_ref,'/','1') ASC";
    $tot_enregistrement=$sql->QueryItem("SELECT count(1) FROM stock_livraison ".$innerjoin." WHERE 1=1 ".$where_recipient." ".$where_like." ".$where_date." ORDER BY date_note DESC, loga_ref = REPLACE (ref,'/','1') ASC");
    $query.=" LIMIT ".$limit_deb.",".$nb_affichage_par_page."";
    if($sql->Exists($query)){
    	$sql->Query($query);
    	for ($i=0; $i<$sql->rows; $i++){
    		$sql->GetRow($i);
    		$sql->data=clean_affich($sql->data);
    		$sql->data['loga_ref']=str_replace("-","/",$sql->data['loga_ref']);
    		if($i%2 == 0)
    			$sql->data['class']="paire";
    		else
    			$sql->data['class']="impaire";			
    		//Status
    		$query2="SELECT * FROM stockr WHERE id_stock='".$sql->data['id_stock']."'";
    		if($sql2->Exists($query2)){
    			$sql2->Query($query2);
    			for ($j=0; $j<$sql2->rows; $j++){
    				$sql2->GetRow($j);
    				$sql2->=clean_affich($sql2->data);
    				if($sql2->data['status']=='1'){
    					$sql->data['status_image']="green";
    					$sql->data['awb']=$sql2->data['awb'];
    					$sql->data['hawb']=$sql2->data['hawb'];
     
    				}
    				else{
    					$sql->data['status_image']="red";
    					$sql->data['awb']="EN ATTENTE";
    				}	
    			}
    		}
    		//colis
    		$query2="SELECT * FROM stock_colis WHERE id_stock='".$sql->data['id_stock']."'";
    		if($sql2->Exists($query2)){
    			$sql2->Query($query2);
    			for ($j=0; $j<$sql2->rows; $j++){
    				$sql2->GetRow($j);
    				$sql2->data=clean_affich($sql2->data);
    				$sql->data['number']=$sql2->data['number'];
    				$colis = explode("-", $sql2->data['parcel_no']);
    				if(count($colis)<=16)
    					$parse_parcel_id_view_more=0;	
    				else
    					$parse_parcel_id_view_more=1;	
    				for($jj=0;$jj<count($colis);$jj=$jj+4){
    					if($jj<=15){
    						if(isset($colis[$jj]) && isset($colis[$jj+1]) && isset($colis[$jj+2]) && isset($colis[$jj+3]))
    							$sql->data['no_affich'].=$colis[$jj]." - ".$colis[$jj+1]." - ".$colis[$jj+2]." - ".$colis[$jj+3]."<br>";
    						elseif(isset($colis[$jj]) && isset($colis[$jj+1]) && isset($colis[$j+2]) && !isset($colis[$jj+3]))
    							$sql->data['no_affich'].=$colis[$jj]." - ".$colis[$jj+1]." - ".$colis[$jj+2]."<br>";
    						elseif(isset($colis[$jj]) && isset($colis[$jj+1]) && !isset($colis[$j+2]))
    							$sql->data['no_affich'].=$colis[$jj]." - ".$colis[$jj+1]."<br>";
    						elseif(isset($colis[$jj]) && !isset($colis[$jj+1]))
    							$sql->data['no_affich'].=$colis[$jj]."<br>";
    					}
    				}
    			}
    			$sql->data['id']=$sql->data['no_affich'];
    		}
     
    		//AFFICHAGE 
    		$xtpl2->assign("DATA", $sql->data);
    		if(!empty($parse_parcel_id_view_more)) $xtpl2->parse("main.table_result.ligne.parcel_id_view_more");		
    		$xtpl2->parse("main.table_result.ligne");
    	}
     
    }
    La fonction assign se présente comme ça :

    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
    public function assign ($name, $val = '', $reset_array = true) {
     
            if (is_array($name)) {
     
                foreach ($name as $k => $v) {
     
                    $this->vars[$k] = $v;
                }
            } elseif (is_array($val)) {
     
                // Clear the existing values
                if ($reset_array) {
                    $this->vars[$name] = array();
                }
     
                foreach ($val as $k => $v) {
     
                    $this->vars[$name][$k] = $v;
                }
     
            } else {
     
                $this->vars[$name] = $val;
            }
        }
    Mon but étant de générer ce tableau en fichier csv également...

    Si quelqu'un a une idée...

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    ton tableau est la variable $vars de la classe.

  3. #3
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Bonsoir Tsilefy,

    Merci de ta réponse.

    J'ai donc suivi tes conseils et essayer de sortir mon csv via ce tableau mais sans succès :

    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
     
     
    $chemin = 'fichier.csv';
    $delimiteur = ';'; // Pour une tabulation, utiliser $delimiteur = "t";
     
    $fichier_csv = fopen($chemin, 'w+');
    fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));
     
    // Boucle foreach 
    foreach(array($vars) as $ligne){
     
    	fputcsv($fichier_csv, $ligne, $delimiteur);
     
    }
     
    // fermeture du fichier csv
    fclose($fichier_csv);
     
    ?>
    La variable $vars semble vide alors que j'ai des données retournées par la requête.
    Effectivement, j'ai bien une variable public $vars dans la classe "xtemplate" définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        public $vars = array();
    J'ai du louper quelque chose...?

    Merci

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Tu dois donc utiliser et pas $var

  5. #5
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($xtpl2->vars) as $ligne){
     
    	fputcsv($fichier_csv, $ligne, $delimiteur);
     
    }
    ne me renvoie rien non plus... J'arrive à afficher quelque chose quand je passe directement par la requête, mais cela ne correspond pas tout à fait à l'affichage du tableau final.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    - Avant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xtpl2->assign("DATA", $sql->data);
    , teste la valeur de $sql->data avec var_dump() pour voir s'il y a quelque chose dans cette variable.

    - Que fait la méthode parse()? Est-ce qu'elle est susceptible de modifier $xtpl2->vars ? Je vois qu'elle est appelée deux fois après assign()

  7. #7
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    C'est bon, super ça fonctionne avec $sql->data. Par contre, le résultat de mon fichier csv n'est pas top. Il me double les colonnes (chaque colonne est doublée excepté les dernières...). Est ce que tu vois pourquoi ?

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Est-ce que ton tableau a les mêmes doublons? Dans ce cas c'est un problème avec ta requête. Sinon, peux-tu poster comment tu écris le csv?

  9. #9
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Mon csv, je le créé de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $chemin = 'fichier.csv';
    $delimiteur = ';'; // Pour une tabulation, utiliser $delimiteur = "t";
     
    $fichier_csv = fopen($chemin, 'w+');
    fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));
     fputcsv($fichier_csv, $sql->data, $delimiteur);
    Les valeurs ne sont doublées que par colonne. Pour les lignes c'est ok.
    Est-il possible que je recréé un tableau en intégrant une colonne sur deux ? (je sais que ce n'est pas très propre mais c'est pour tester)

  10. #10
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Etant donné que tu as ce genre de code dans ton script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql->Query($query);
    for ($i=0; $i<$sql->rows; $i++){
        $sql->GetRow($i);
    tu as visiblement une classe personnalisée pour accéder à la base de données. Peut-on voir le code de cette classe ? surtout celui de la méthode query et et la méthode getRow.

  11. #11
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    La méthode Query appelle un MySQL_query classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        function Query($query){
            $this->result=@mysql_query($query,$this->id) or
                mysql_ErrorMsg("Unable to perform query: $query");
            $this->rows=@mysql_num_rows($this->result);
        }
    Le méthode GetRow est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        function GetRow($row){
            @mysql_data_seek($this->result,$row) or
                mysql_ErrorMsg("Unable to seek data row: $row");
            $this->data=@mysql_fetch_array($this->result) or
                mysql_ErrorMsg("Unable to fetch row: $row");
        }
    La requête est en select *

  12. #12
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Le type de tableau retourné dépend de la définition du paramètre result_type. En utilisant MYSQL_BOTH (défaut), vous récupérerez un tableau contenant des indices associatifs et numériques.
    En utilisant MYSQL_ASSOC, vous ne récupérerez que les indices associatifs (comme le fonctionnement de la fonction mysql_fetch_assoc()), en utilisant MYSQL_NUM, vous ne récupérerez que les indices numériques (comme le fonctionnement de la fonctionmysql_fetch_row()).
    Autrement dit, par défaut tu remontes les données en double : une fois avec l'index numérique et une fois avec le nom de la colonne. Utilise mysqli_fetch_assoc à la place pour n'avoir que les index "nom de colonne".

    Au passage, l'extension mysql est obsolète depuis PHP 5.5 et est supprimée en PHP 7.

  13. #13
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    ok...merci pour l'info...
    Si je créé une fonction avec du mysqli dans la classe, est ce que cela fonctionnera avec du php 5.3 ? Je vais tester cela ce week end. Je vous tiens au courant.

    Encore merci

Discussions similaires

  1. Importation de base access pour générer un csv
    Par jmlabatut dans le forum VBA Access
    Réponses: 0
    Dernier message: 19/11/2009, 18h03
  2. [CSV] Code PHP pour générer un CSV
    Par Décibel dans le forum Langage
    Réponses: 4
    Dernier message: 16/05/2009, 21h18
  3. Librairies gratuites pour générer du PDF
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 02/05/2005, 21h18
  4. Quel outil UML (industriel) pour générer du code C# ?
    Par matsri2003 dans le forum Outils
    Réponses: 3
    Dernier message: 17/01/2005, 14h45

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