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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : exporter le résultat d'une requete dans un fichier texte

par mike001 » 31 août 2008, 05:46

bonjour,

moi j'ai l'errcode 2 aussi,

Pourtant j'ai mis tous les droits possible, le chemin est bon,
<?php
$db = "test";
$link_database = mysql_connect("195.**.**.**","root","*******");
if (! $link_database) 
	die("Impossible d'ouvrir la base de donnée :".mysql_error());
mysql_select_db($db)
	or die("Impossible d'ouvrir la base $db : ".mysql_error());
$reponse = mysql_query("SELECT * FROM clients into outfile '/home/users/**/**/**/home/www/test/clients.txt'")or die("erreur : ".mysql_error()); // Requête SQL
Merci d'avance pour votre aide ...

par sadeq » 25 juin 2008, 21:36

Il est possible aussi que tu as déjà un fichier "data2.txt" dans le dossier "/var/www/html/interface/essai/Login/" à ce moment là il faut le supprimer avant d'exécuter la requête d'importation CSV.

Voici la commande PHP qui supprime le fichier s'il existe déjà :
if ( file_exists("/var/www/html/interface/essai/Login/data2.txt") ) // si le fichier existe
     unlink("/var/www/html/interface/essai/Login/data2.txt"); // le supprimer
}

par Invité » 25 juin 2008, 10:54

Merci ,je vais essayer de voir.

par sadeq » 24 juin 2008, 15:01

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

par lili » 24 juin 2008, 14:03

Oui effectivement, vous coyer que c'est un probléme de droit?

par sadeq » 24 juin 2008, 14:00

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)

par lili » 24 juin 2008, 12:50

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]

par sadeq » 24 juin 2008, 12:21

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

par lili » 24 juin 2008, 11:53

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]

par b.jerome » 24 juin 2008, 11:41

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/'

par lili » 24 juin 2008, 11:25

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]

par Hywan » 24 juin 2008, 11:13

Qu'est-ce qu'il ne marche pas ? Des erreurs ?

par lili » 24 juin 2008, 11:06

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]

par sadeq » 24 juin 2008, 00:02

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';

par Hywan » 23 juin 2008, 22:43

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.