Page 1 sur 2

exporter le résultat d'une requete dans un fichier texte

Posté : 23 juin 2008, 18:34
par lili
Bonjour,

Je voulais savoir s'il est possible d'exporter le résultat d'une requete dans un fichier texte? je sais qu'on peut exporter une table mysql ,mais pour le résultat d'une requete

quelqu'un aurai il une idée?

Posté : 23 juin 2008, 19:09
par katagoto
file_put_contents() est ton amis, tu pourra même faire des pages PHP avec ^^

Posté : 23 juin 2008, 22:43
par Hywan
Hey :),

Katagoto, arrête d'être aussi bref s'il te plaît. Donner la solution (très incomplète) ne sert à rien.

Lili maintenant. Le résultat d'une requête peut s'exporter sous plusieurs formes. Une table SQL structure des données. Les données peuvent être structurées dans d'autre langage, comme XML qui est spécialement prévu pour ça. Tu peux aussi utiliser CSV, mais j'ai une grosse préférence pour XML, car c'est énormément plus maniable. En effet, tu as des feuilles XSLT qui permettent de manipuler XML et de le transformer vers n'importe quelle sortie (texte, HTML, PDF, etc.). Donc je te conseille de stocker tes données dans des fichiers XML.

Si tu utilises PHP 5, tu as la classe SimpleXML, native à PHP. Je te laisse explorer le manuel et ses nombreux exemples.
Si tu es en PHP 4, ce sera plus compliqué, mais tu trouveras d'autres classes plus ou moins bien.

Posté : 24 juin 2008, 00:02
par sadeq
Bonsoir lili,

Effectivement tu peux exporter une requête dans un fichier texte (csv) en utilisant SQL sans passer par PHP par la commande SQL suivante :

Code : Tout sélectionner

SELECT * INTO OUTFILE 'c:/data1.txt' FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' FROM maTable;
Ce qui va écrire dans un fichier "data1.txt" les enregistrement sélectionnés à partir de la table nommée "maTable".
Les données des champs (colonnes) seront séparées par un ";" et les enregistrements (lignes) seront terminés par un retour-chariot "\n"

Exemple de données produites si ma table contient des noms de personnes :

Code : Tout sélectionner

1;Dupont;Jean 2;Leroy;Aline 3;Petit;Georges 4;Leblanc;Michel
L'inverse, c'est à dire l'importation, est possible à partir d'un fichier texte (csv) vers une table de la base par la commande SQL :

Code : Tout sélectionner

LOAD DATA INFILE 'c:/data1.txt' INTO TABLE maTable FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n';

Posté : 24 juin 2008, 11:06
par lili
J'ai essayé mais ça ne marche pas voici mon code:
<?php
  $sql = "SELECT INTO OUTFILE 'c:/data1.txt'
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
* FROM ENREGISTRES" where nom_sta='tre';
  $query = mysql_query($sql)
    or die ("Requête incorrecte");
    $result = mysql_numrows($query);
      if ($result) { // Si il y'a des résultats
        while ($rs = mysql_fetch_array($query)) {
?>
 <tr>

<td><? echo $rs["nom_even"]; ?></td>
<td><? echo $rs["nom_sta"]; ?></td>
   
 </tr>
<?php
        } // Fin instruction while
      } else { // Pas de résultat trouvé
    echo "Pas de r&eacute;sultat";
      }
  mysql_free_result($query); // Libère la mémoire
  mysql_close(); // Ferme la connexion
?>
</table>
</body>
et voiçi mo ncode pour exporter une table ,j'ai pas su l'adapter pour afficher le résulta de ma requete (SELECT * FROM ENREGISTRES" where nom_sta='tre' ) :

<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'bd_Multiplets';
$table = 'STATIONS';
$file = 'export';

$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");





$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM '$table'");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j]."; ";
}
$csv_output .= "\n";
}

$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output;
exit;
?>
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 24 juin 2008, 11:13
par Hywan
Qu'est-ce qu'il ne marche pas ? Des erreurs ?

Posté : 24 juin 2008, 11:25
par lili
Voiçi l'erreur,pour le premier code
Can't create/write to file '/var/lib/mysql/c:/data1.txt' (Errcode: 2)

et pour ce qui est du second copde je n'ai pas su l'adapter pour exporter le résulta de ma requete dans un fichier texte :(

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 24 juin 2008, 11:41
par b.jerome
Voiçi l'erreur,pour le premier code
Can't create/write to file '/var/lib/mysql/c:/data1.txt' (Errcode: 2)

et pour ce qui est du second copde je n'ai pas su l'adapter pour exporter le résulta de ma requete dans un fichier texte :(
Le chemin auquel tu fais référence n'existe pas. Il faut adapter le code de sadeq a tes besoins.
$sql = "SELECT INTO OUTFILE 'data1.txt' 
Tu devrais trouver ton fichier data1.txt dans '/var/lib/mysql/'

Posté : 24 juin 2008, 11:53
par lili
J'ai modifié le chemin comme ceci :'/var/www/html/interface/essai/Login/data2.txt'
mais ça me donne le meme résultat:
Can't create/write to file '/var/www/html/interface/essai/Login/data2.txt' (Errcode: 13)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 24 juin 2008, 12:21
par sadeq
Voici une correction de ton code :
<?php
  // Penser aux droits d'accès au dossier de travail
  chmod('/var/www/html/interface/essai/Login', 0777); // Tous les droits (à ajuster selon les besoins)
  
   // Requête d'export en CSV
   $sql = "SELECT * INTO OUTFILE '/var/www/html/interface/essai/Login/data2.txt'
             FIELDS TERMINATED BY ';'
             LINES TERMINATED BY '\\n'
             FROM ENREGISTRES where nom_sta='tre' ";

   // Exécution de la requête
    $query = mysql_query($sql)
    or die ("Requête incorrecte");
?>
Effectivement, il faut avoir au moins les droits lecture/Ecritue sur le dossier où tu veux créer et lire le CSV (moi, j'étais généreux, j'ai donné tous les droits à tout le monde : 0777)

Il faut rappeler aussi que la requête d'export n'est pas un SELECT normal, il ne faut pas donc attendre de résultats de la part de $query dans la mémoire du programme car les données résultats sont stockées dans le fichier CSV indiqué.

Annexe:

chmod : change les droits d'accès d'un fichier/dossier

syntaxe:

Code : Tout sélectionner

chmod (fichier ou dossier, 0xxx);
  • 0xxx = mode d'accès qui est un nombre octal commençant par 0
    xxx = Utilisateur|Groupe|Autres où x représente un entier 1<x<7
En général:
Lecture=4, Ecriture=2, Exécution=1
7 = Lecture+Ecriture+Exécution = Tous les droits

Les valeur de x:
  • 0 signifie aucun droit
    1 signifie droit d'exécution
    2 signifie droit en écriture
    3 signifie droit en écriture et en exécution
    4 signifie droit en lecture
    5 signifie droit en lecture et en exécution
    6 signifie droit en lecture et droit en écriture
    7 signifie tous les droits

Posté : 24 juin 2008, 12:50
par lili
J'ai modifié le code mais toujours le meme message d'erreur :(
Can't create/write to file '/var/www/html/interface/essai/Login/data2.txt' (Errcode: 13)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 24 juin 2008, 14:00
par sadeq
Apparemment, tu travaille sous Linux. N'est-ce pas ?

Si c'est le cas essaye de donner les permissions par la commande système "chmod" sur ton dossier en se logant en tant qu'administrateur (root)

Posté : 24 juin 2008, 14:03
par lili
Oui effectivement, vous coyer que c'est un probléme de droit?

Posté : 24 juin 2008, 15:01
par sadeq
Selon le message, il y a deux possibilités : soit le chemin '/var/www/html/interface/essai/Login/' que tu donne n'est pas correct (c'est possible aussi que certains dossiers n'existent pas) ou bien le processus mysql n'a pas le droit d'écrire dans le dossier "Login/"

Voici, un tuto qui peut toujours aider : http://www.math-linux.com/spip.php?article23

Posté : 25 juin 2008, 10:54
par Invité
Merci ,je vais essayer de voir.