Exporter csv [Résolu/Fermé]

Signaler
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016
-
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016
-
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

Messages postés
29268
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2020
2 696
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                                                                 
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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.
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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...

    
Messages postés
29268
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2020
2 696 >
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016


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();
 }
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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.
Messages postés
29268
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2020
2 696 >
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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 !!
.
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

je corrigé et vous revenir.
et sorry les balises je pas encore maitrisé ça.
cordialement
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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.
Messages postés
29268
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2020
2 696
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.
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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);
 
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

Bonjour jordane45,
Merci pour vos réponses, cela a résolu mon problème.
Messages postés
18
Date d'inscription
dimanche 6 mars 2016
Statut
Membre
Dernière intervention
24 avril 2016

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