[RESOLU] Ecrire dans plusieurs fichiers txt

Eléphanteau du PHP | 27 Messages

05 juin 2013, 21:27

Bonjour,
J'ai une base avec deux tables. Dans la première table il y a deux colonnes , une colonne "identifiant" et une autre "libelle".
Il y a une dizaine d'identifiants et chaque identifiant a plusieurs libelles. Je souhaite créer un fichier txt par identifiant et le remplir avec les libellés correspondants. La deuxième table ne contient que des identifiants.
J'arrive à créer mes fichiers, mais chacun n'est rempli qu'avec un seul enregistrement.
Voilà le code, auriez-vous une idée ?
Merci
<?php
//variables de connexion ?a base
 //$host="localhost";
 $dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');
$dbname = 'intrade';
mysql_select_db($dbname);
$query = mysql_query("SELECT DISTINCT agcepo FROM structure ORDER by agcepo") or die (mysql_error()); 
while($array = mysql_fetch_assoc($query)){
	 $po=$array['agcepo'];
	$query1 = mysql_query("SELECT DISTINCT libelle, po FROM mails WHERE po='$po' ORDER by po") or die (mysql_error()); 
	 	while($array1 = mysql_fetch_assoc($query1)){
	 		print $array1['po']." - ";
      print $array1['libelle'];
      echo ";";
      echo "<br>";
	 $departement_file = fopen("mails_".$po.".txt", "w");
	 fputs($departement_file,$array1['libelle'].";");
}
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 juin 2013, 21:58

salut,

le fopen doit être avant le second while. la tu ouvre le fichier à chaque while c'est pas utile.
seul le fputs reste dans le while du milieux.

il te manque un fclose.

perso je modifierais ton code ainsi
<?php

//variables de connexion ?a base
//$host="localhost";
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');
$dbname = 'intrade';
mysql_select_db($dbname);
$query = mysql_query("SELECT DISTINCT agcepo FROM structure ORDER by agcepo"));
while ($array = mysql_fetch_assoc($query)) {
    $query1 = mysql_query("SELECT DISTINCT libelle, po FROM mails WHERE po='$po' ORDER by po");
    $str = '';
    while ($array1 = mysql_fetch_assoc($query1)) {
        $str .= $array1['libelle'] . ';' . PHP_EOL;
    }
    file_put_contents('mails_' . $array['agcepo'] . '.txt', $str);
}
?>
Personnellement j'utiliserais plutot PDO et ferai ainsi
<?php
try {
    // connexion
    $conn = new PDO('mysql:host=localhost;dbname=intrade', 'root', '');
// prépare la requete select pour "optimiser" un peu le script.
    $query1 = $conn->prepare('SELECT DISTINCT libelle, po FROM mails WHERE po=:po ORDER by po');

    $query = $conn->query('SELECT DISTINCT agcepo FROM structure ORDER by agcepo');
    while ($array = $query->fetch(PDO_FETCH_ASSOC)) {
        $query1->bindValue(':po', $array['agcepo']);
        $query1->execute();
        $fileName = 'mails_' . $array['agcepo'] . '.txt';
        while ($array1 = $query1->fetch(PDO_FETCH_ASSOC)) {
            file_put_contents($fileName, $array1['libelle'] . ';' . PHP_EOL, FILE_APPEND | LOCK_EX);
        }
        $query1->closeCursor();
    }
    $query->closeCursor();
} catch (Exception $e) {
    // a personnaliser
    echo 'Erreur SQL : ' . $e->getMessage() . '<br />' . $e->getTraceAsString();
}
?>
@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 27 Messages

06 juin 2013, 10:12

Merci pour ces réponses. En m'inspirant de tout ça, j'ai réécris ces lignes :
<?php
//variables de connexion ?a base
 //$host="localhost";
 $dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');
$dbname = 'intrade';
mysql_select_db($dbname);
$query = mysql_query("SELECT DISTINCT agcepo FROM structure ORDER by agcepo") or die (mysql_error()); 
while($array = mysql_fetch_assoc($query)){
	 $agcepo=$array['agcepo'];
	 $departement_file = fopen("mails_".$agcepo.".txt", "w");
	$query1 = mysql_query("SELECT DISTINCT libelle, agcepo FROM mails WHERE agcepo='$agcepo' ORDER by agcepo") or die (mysql_error()); 
	 	while($array1 = mysql_fetch_assoc($query1)){
	 		print $array1['agcepo']." - ";
      print $array1['libelle'];
      echo ";";
      echo "<br>";
	 	 fputs($departement_file,$array1['libelle'].";");
	 //fclose($departement_file);
}
}
?>