Exporter csv

Résolu/Fermé
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016 - Modifié par jordane45 le 17/04/2016 à 15:29
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016 - 24 avril 2016 à 21:39
Bonjour,j'ai un code qui me renvoi une notification d'erreur comme suit:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\***********\csv.php on line 31
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0,50' at line 1.


S'il vous plait quelqu'un peux m'aider.

voici mon code:
$lot_courant = 0;
$nombre_elements_lot = 50;
$rsdata='SELECT Reference,Montant FROM tab';
$rsdata.="LIMIT ${lot_courant},${nombre_elements_lot}";
$resultats= mysql_query($rsdata);
$nombre_resultats = count($resultats);
while ($row = mysql_fetch_array($resultats) or die( mysql_error())) {
}


EDIT : Ajout des balises de code.

3 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié par jordane45 le 17/04/2016 à 15:33
Bonjour,


1 - Tu utilises l'ancienne extension mysql ... considérée comme obsolète. Merci de lire ceci : https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

2 - Fais un ECHO de ta variable $rsdata ... puis testes la requête ainsi obtenue DIRECTEMENT dans ta BDD ... tu devrais pouvoir voir l'erreur. (un espace manquant entre tab et Limit je pense... )

Au passage.. tu sais que tu peux, en php, écrire des lignes de code en plusieurs lignes ?
Comme ceci :
$rsdata="SELECT Reference
               ,Montant 
          FROM tab
          LIMIT ${lot_courant},${nombre_elements_lot}";

//le temps des tests :
echo "<u>La requête est : </u>".$rsdata;





Cordialement, 
Jordane                                                                 
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
Modifié par jordane45 le 17/04/2016 à 22:29
MERCI Jordane, je fais un Echo de $rsdata et tester directement la requête dans la BDD ça marche bien, par contre quand j’exécute mon code pour exporter mon fichier par lot de 50, j’obtiens une page vide.

voici le code:

//Extraire les données du contenu
$rsdata="SELECT Reference
               ,Montant 
          FROM tab
          LIMIT ${lot_courant},${nombre_elements_lot}";

//le temps des tests :
//echo "<u>La requête est : </u>".$rsdata;


$resultats= mysql_query($rsdata);
$nombre_resultats = count($resultats);
$dataLine="";
$date= date("d/m/Y");
while ($row = mysql_fetch_array($resultats) or die( mysql_error())) {
$dataLine.="NIGLC,,OM,,,$row[Reference],$date,31/12/2016,$row[Montant],N,,,,101\n";
}
$dataLine.="\n";
//Envoyer le contenu au navigateur 
$file="101_NIGLC_".Date('dmY_His').".csv";
header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=".$file);
echo $columnLine.$dataLine;
$lot_courant++;
unset($resultats);
}
   while($nombre_resultats == $nombre_elements_lot);



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 avril 2016 à 22:32
1 - Tu utilises TOUJOURS l'ancinne extention MYSQL ... passe donc à mysqli ou à la PDO !
2 - Ajoutes ceci au début de ta page pour afficher les éventuelles erreurs PHP :
 error_reporting(E_ALL);

3 - Désactive les header le temps de tes tests :
//header("Content-type: text/x-csv");
//header("Content-Disposition: attachment; filename=".$file);


4 - Que vient faire le WHILE à la fin de ton code ? Sa syntaxe n'est pas bonne !
Retire le !!
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
17 avril 2016 à 23:25
je fais les modifications et je eu les erreurs suivantes:
mysqli_query() expects at least 2 parameters, 1 given
mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given.
le WHILE à la fin est une condition comme je utilisé la boucle do while.
je vous fait un petit résumé de ce que j'aimerais faire, mon code marche très bien il me génère un fichier csv propre comme je le désire mais le fichier est lourd doc j'aimerais le généré
 par lot de 50...

    
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
17 avril 2016 à 23:40

je fais les modifications

Et si tu nous montres pas ton code modifié .... IMPOSSIBLE de t'aider !

Mais bon... je devine déjà que tu as du mal utiliser (écrire) la fonctions mysqli_query()
Y as tu mis la 'connexion' ?
Par exemple :
mysqli_query($con,$rsdatal);

$con ... étant la connexion à la BDD..

$con=mysqli_connect("localhost","user","password","database");
// Check connection
if (mysqli_connect_errno())  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
Modifié par jordane45 le 17/04/2016 à 23:53
ok voici mon code entier:
<?php
error_reporting(E_ALL);
//connexion au serveur localhost et à la base de données
$serveur = "localhost";
$user = "root";
$pwd = "";
$bdd = "db";
mysql_connect($serveur, $user, $pwd) or die('Impossible de se connecter au serveur');
mysql_select_db($bdd) or die('Impossible de sélectionner la base de données');
//compter le nombre d'enregistrements de la table
$lot_courant = 0;
$nombre_elements_lot = 50;
do {
//l'entete du fichier
$columnLine="";
$contenu='Total Records*=,,,,,,,,,,,,,
Total New Records*=,,,,,,,,,,,,,
Total Updated Records*=,,,,,,,,,,,,,
Total Deleted Records*=,,,,,,,,,,,,,
Reserved Header Value,,,,,,,,,,,,,
Biller ID*,Billed Customer ID,Bill Account ID*,Reference 4,Reference 5,Bill Number*,Bill Date,Bill Due Date*,Bill Amount*,Requested Operation*,Reserved 1,Reserved 2,Reserved 3,ProviderID*';
$columnLine .= $contenu;
$columnLine .="\n";
//Extraire les données du contenu
$rsdata="SELECT Reference
               ,Montant 
          FROM tab
          LIMIT ${lot_courant},${nombre_elements_lot}";

//le temps des tests :
//echo "<u>La requête est : </u>".$rsdata;

$resultats= mysql_query($rsdata);
$nombre_resultats = count($resultats);
$dataLine="";
$date= date("d/m/Y");
while ($row = mysql_fetch_array($resultats) or die( mysql_error())) {
$dataLine.="NIGLC,,OM,,,$row[Reference],$date,31/12/2016,$row[Montant],N,,,,101\n";
}
$dataLine.="\n";
//Envoyer le contenu au navigateur 
$file="101_NIGLC_".Date('dmY_His').".csv";
header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=".$file);
echo $columnLine.$dataLine;
$lot_courant++;
unset($resultats);
}
   while($nombre_resultats == $nombre_elements_lot);
?>


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
17 avril 2016 à 23:54
1- Pour la dernière fois ..... merci d'utiliser les BALISES DE CODE lorsque tu postes du code sur le forum.Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

2 - Le code que tu nous montres .. n'est pas la version corrigée .... tu es toujours en mysql .... et donc ne correspond en rien aux messages d'erreurs que tu viens de nous poster !!
.
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
Modifié par jordane45 le 18/04/2016 à 00:20
voici le code modifier et ça me renvoi une page vide:


<?php
error_reporting(E_ALL);
//connexion au serveur localhost et à la base de données
$con=mysqli_connect("localhost","root","","IMPAYE");
// Check connection
if (mysqli_connect_errno())  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }
//compter le nombre d'enregistrements de la table
$lot_courant = 0;
$nombre_elements_lot = 50;
do {
//l'entete du fichier
$columnLine="";
$contenu='Total Records*=,,,,,,,,,,,,,
Total New Records*=,,,,,,,,,,,,,
Total Updated Records*=,,,,,,,,,,,,,
Total Deleted Records*=,,,,,,,,,,,,,
Reserved Header Value,,,,,,,,,,,,,
Biller ID*,Billed Customer ID,Bill Account ID*,Reference 4,Reference 5,Bill Number*,Bill Date,Bill Due Date*,Bill Amount*,Requested Operation*,Reserved 1,Reserved 2,Reserved 3,ProviderID*';
$columnLine .= $contenu;
$columnLine .="\n";
//Extraire les données du contenu
$rsdata="SELECT Reference
               ,Montant 
          FROM nigelec
          LIMIT ${lot_courant},${nombre_elements_lot}";

//le temps des tests :
//echo "<u>La requête est : </u>".$rsdata;

$resultats= mysqli_query($con,$rsdata);
$nombre_resultats = count($resultats);
$dataLine="";
$date= date("d/m/Y");
while ($row = mysqli_fetch_array($resultats) or die( mysql_error())) {
$dataLine.="NIGLC,,OM,,,$row[Reference],$date,31/12/2016,$row[Montant],N,,,,101\n";
}
$dataLine.="\n";
//Envoyer le contenu au navigateur 
$file="101_NIGLC_".Date('dmY_His').".csv";
//header("Content-type: text/x-csv");
//header("Content-Disposition: attachment; filename=".$file);
echo $columnLine.$dataLine;
$lot_courant++;
unset($resultats);
}
   while($nombre_resultats == $nombre_elements_lot);
?>


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié par jordane45 le 18/04/2016 à 00:29
J'ai encore corrigé tes balises de code.....
Pour que ça marche ... il faut ecrire le code ENTRE les balies
<code php>
//Ici tu mets le code ...
//...
</code>

Ce qui donne :
//Ici tu mets le code ...
//...


Cette ligne de code :
$nombre_resultats = count($resultats);

Ne peut pas fonctionner !
$resultats est un "jeu" de résultat ... pas un ARRAY.


Pour connaitre le nombre de résultats retournés par ta requête tu dois utiliser :
$nombre_resultats = mysqli_num_rows($resultats);


Celle la non plus :
while ($row = mysqli_fetch_array($resultats) or die( mysql_error())) {
$dataLine.="NIGLC,,OM,,,$row[Reference],$date,31/12/2016,$row[Montant],N,,,,101\n";
}

Il faut concaténer les variables de type ARRAY de cette façon
sans oublier de ne pas mélanger du mysql .... et du mysqli !

while ($row = mysqli_fetch_array($resultats)) {
  $dataLine.="NIGLC,,OM,,,".$row['Reference'].",$date,31/12/2016,".$row['Montant'].",N,,,,101\n";
}


Pour savoir si il y a une erreur dans ta requête... c'est comme ça qu'il faut l'écrire :
if (! $resultats= mysqli_query($con,$rsdata)){
   echo("Error :". mysqli_error($con) );
}


Commence par corriger tout ça ...
pour la suite on verra.
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
18 avril 2016 à 00:59
Oui ça marche,il génère un fichier de lot de 50 Lignes mais plusieurs plus que ce qui est dans ma BDD et une notification d'erreur entre les lot comme suit:
Cannot modify header information - headers already sent by (output started at.
donc il faut que je revois ma boucle aussi.
voici le code:
error_reporting(E_ALL);
//connexion au serveur localhost et à la base de données
$con=mysqli_connect("localhost","root","","IMPAYE");
// Check connection
if (mysqli_connect_errno())  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }
//compter le nombre d'enregistrements de la table
$lot_courant = 0;
$nombre_elements_lot = 50;
do {
//l'entete du fichier
$columnLine="";
$contenu='Total Records*=,,,,,,,,,,,,,
Total New Records*=,,,,,,,,,,,,,
Total Updated Records*=,,,,,,,,,,,,,
Total Deleted Records*=,,,,,,,,,,,,,
Reserved Header Value,,,,,,,,,,,,,
Biller ID*,Billed Customer ID,Bill Account ID*,Reference 4,Reference 5,Bill Number*,Bill Date,Bill Due Date*,Bill Amount*,Requested Operation*,Reserved 1,Reserved 2,Reserved 3,ProviderID*';
$columnLine .= $contenu;
$columnLine .="\n";
//Extraire les données du contenu
$rsdata="SELECT Reference
               ,Montant 
          FROM tab
          LIMIT ${lot_courant},${nombre_elements_lot}";

//le temps des tests :
//echo "<u>La requête est : </u>".$rsdata;

$resultats= mysqli_query($con,$rsdata);
$nombre_resultats = mysqli_num_rows($resultats);
$dataLine="";
$date= date("d/m/Y");
while ($row = mysqli_fetch_array($resultats)) {
  $dataLine.="NIGLC,,OM,,,".$row['Reference'].",$date,31/12/2016,".$row['Montant'].",N,,,,101\n";
}
if (! $resultats= mysqli_query($con,$rsdata)){
   echo("Error :". mysqli_error($con) );
}
$dataLine.="\n";
//Envoyer le contenu au navigateur 
$file="101_NIGLC_".Date('dmY_His').".csv";
header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=".$file);
echo $columnLine.$dataLine;
$lot_courant++;
unset($resultats);
}
   while($nombre_resultats == $nombre_elements_lot);
 
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
18 avril 2016 à 04:23
Bonjour,j'ai pu avancé un peu car je ne plus la notification d'erreur précédente, je vérifié les espaces et aussi remplacer error reporting(E_ALL) par error reporting(0) .
le problème maintenant il me génère le premier lot correctement mais le deuxième lot commence par la deuxième ligne du premier lot ainsi de suite.
Cordialement
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
20 avril 2016 à 12:18
Bonjour jordane45,
Merci pour vos réponses, cela a résolu mon problème.
0
ymoussa Messages postés 18 Date d'inscription dimanche 6 mars 2016 Statut Membre Dernière intervention 24 avril 2016
24 avril 2016 à 21:39
Bonsoir jordane45iens,
je reviens vers vous encore,mon code me génère bien mes fichiers de lot par 50 mais sur le même fichier en décalent d'une entre les lot.
comment procédé pour qu'il me les génère fichier par fichier en utilisant la fonction split?
voici mon code:
error_reporting(0);
//connexion au serveur localhost et à la base de données
$con=mysqli_connect("localhost","root","","IMPAYE");
// Check connection
if (mysqli_connect_errno())  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }
//compter le nombre d'enregistrements de la table
$lot_courant = 0;
$nombre_elements_lot = 50;
do{
//l'entete du fichier
$columnLine="";
$contenu='Total Records*=,,,,,,,,,,,,,
Total New Records*=,,,,,,,,,,,,,
Total Updated Records*=,,,,,,,,,,,,,
Total Deleted Records*=,,,,,,,,,,,,,
Reserved Header Value,,,,,,,,,,,,,
Biller ID*,Billed Customer ID,Bill Account ID*,Reference 4,Reference 5,Bill Number*,Bill Date,Bill Due Date*,Bill Amount*,Requested Operation*,Reserved 1,Reserved 2,Reserved 3,ProviderID*';
$columnLine .= $contenu;
$columnLine .="\n";
//Extraire les données du contenu
$rsdata="SELECT Reference
               ,Montant 
          FROM tab
          LIMIT ${lot_courant},${nombre_elements_lot}";
//le temps des tests :
//echo "<u>La requête est : </u>".$rsdata;
$resultats= mysqli_query($con,$rsdata);
$nombre_resultats = mysqli_num_rows($resultats);
$dataLine="";
$date= date("d/m/Y");
while ($row = mysqli_fetch_array($resultats)) {
  $dataLine.="NIGLC,,OM,,,".$row['Reference'].",$date,31/12/2016,".$row['Montant'].",N,,,,101\n";
}
if (! $resultats= mysqli_query($con,$rsdata)){
   echo("Error :". mysqli_error($con) );
}
$dataLine.="\n";
//Envoyer le contenu au navigateur 
$file="101_NIGLC_".Date('dmY_His').".csv";
header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=".$file);
echo $columnLine.$dataLine;
$lot_courant = $lot_courant + 50 ;
unset($resultats);
} while($nombre_resultats == $nombre_elements_lot);
0