Erreur mysql_fetch_object
RésoluJ'ai un code pour exporter le résultat d'une requête dans un fichier en .csv mais j'ai une erreur : mysql_fetch_object() : supplied is not a valid mysql result ressource in...
Et le problème vient de ma ligne :
while($row = mysql_fetch_object($req))
et voici la partie du code qui permet l'exportation :
//exportation
if (isset($_POST['exporter']))
{
// Titre des colonnes de votre fichier .CSV ou .XLS
$fichier = "Attestation n°; Référence Q2C; Nom opération; Ville; Code postal; Département; Nombre de téléchargement; Date d'ajout; Nom Adhérent";
$fichier .= "\n";
// Requête SQL
$req = mysql_query($requete);
// Enregistrement des résultats ligne par ligne
while($row = mysql_fetch_object($req))
{
$fichier .= "".$row->id_attestation.";".$row->ref_Q2C.";".$row->nom_operation.";".$row->ville.";".$row->code_postal.";".$row->departement.";".$row->nbre_telechargement.";".$row->dateajout.";".$row->le_demandeur."\n";
}
// Déclaration du type de contenu
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=requete.csv");
print $fichier;
exit;
}
$requete comporte bien ma requête sql et celle ci fonctionne je l'ai testé.
Help me please
29 réponses
La difficulté porte sur l'utilisation de mysql_fetch_object sur une ressource invalide lors de l'export CSV des résultats MySQL, entraînant une interruption de l'enregistrement des lignes. Plusieurs réponses suggèrent que la variable $requete peut être vide ou non initialisée au moment de l'export, notamment lorsque valider et exporter déclenchent des requêtes distinctes sans persistance. Des conseils évoquent l'usage des sessions avec session_start(), puis le stockage de la requête dans $_SESSION et sa récupération lors du clic sur exporter pour éviter l'échec de mysql_fetch_object. La consultation de debug comme echo $requete; ou mysql_error() est souvent préconisée pour diagnostiquer les erreurs SQL et les quotes/magic_quotes qui pourraient transformer la requête.
-
Merci ça marche !
J'ai rajouté :
$requete=stripslashes($_POST['requete_cache']);
J'aurais dû y pensé avant, je l'ai déja utilisé en plus
Merci pour ton aide !
A l'occasion je je peux t'aider, n'hésite pas -
Le faire par POST au lieu de GET ne changera pas grand chose à la confidentialité. La seule différence, c'est que ça ne saute pas aux yeux, mais quand on a remarqué la requête, c'est aussi facile à pièger.
Le moyen le plus raisonnablement fiable reste celui des sessions. Ou alors, code tes requêtes (avec un codage convenable, ça t'évitera les injections de slashes, d'ailleurs) -
Je vais le faire en poste et tester ta méthode, je l'ai déja fait ca me dit quelque chose
-
C'est une question de configuration de ton PHP, tu as "magic_quotes" actif c'est à dire qu'il ajoute automatiquement des \ devant les apostrophes dans les GET (entre autres...)
Il faut faire strip_slashes pour retirer ces slashes quand tu récupères la requête par GET.
Mais si tu ne maîtrises pas ce genre de choses, tu risques d'avoir des surprises si tu as par exemple un nom de ville avec une apostrophe..
D'autre part, passer une requête en clair dans une URL, c'est inciter au piratage de ton site. Très tentant de taper soi-même des requêtes dans l'URL pour introduire des données que tu ne contrôles pas, pour effacer des tables ou pour les lister ... -
le problème vient de la requête
SELECT id_attestation, ref_Q2C, nom_operation, dateajout, nbre_telechargement, ville, code_postal, departement, le_demandeur FROM videos, jos_comprofiler, jos_users WHERE jos_users.id=jos_comprofiler.id AND jos_users.username=videos.name_createur AND ville=\'Boulogne Sur Mer\'
il me met des \ donc ça bug, je sais pas d'où cela sors
code de l'url pour l'envoie :
<?php
<a href=\"exporter.php?requete=".$_SESSION['requete']."\">Exporter la requête</a><br /><br />"
?> -
Tu as abandonné la méthode précédente, c'est donc que tu acceptes qu'il se passe dans ton script des choses que tu ne comprends pas. C'est une très bonne méthode pour avoir des ennuis.
Ceci étant dit (je comprends que tu as envie d'avancer)), cette fois, c'est une erreur SQL
Affiche la requête, tu verras bien où est l'erreur. -
j'ai trouvé une solution avec la méthode get et j'effectue le traitement sur une autre page.
Tout fonctionne en local et en ligne j'ai l'erreur :
"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 '\'Nord\'' at line 1"
;( -
Les variables de session ne s'envolent pas comme ça...
Pour piéger ce qui se passe, peux-tu ajouter vers le début de ton script (mais après le démarrage des sessions...)
if (isset($_POST['exporter'])) {
echo '<pre>';
print_r ($_SESSION);
echo '</pre>';
}
Ça permettra de savoir si la variable est bien passée. -
les sessions je les utilises ailleurs dans le site, pour les comptes utilisateurs etc
Quand on clic sur valider ça affiche le résultat de la requête dans un tableau en dessous. Et oui il est dans la même page. -
Le formulaire est-il bien dans ce script-ci ?
Si non, qu'est-ce qui renvoie au formulaire quand on clique sur valider ?
Je ne vois pas où tu utilises les variables de session ailleurs. Fais un essai avec une variable quelconque pour t'assurer qu'elles sont bien transmises -
Ca ne marche toujours pas, j'ai fait :
$requete="";
if (isset($_POST['valider']))
{
$_SESSION['requete']=$search_sql;
}
//exportation
if (isset($_POST['exporter']))
{
$requete=$_SESSION['requete'];
// Titre des colonnes de votre fichier .CSV ou .XLS
$fichier = "Attestation n°; Référence Q2C; Nom opération; Ville; Code postal; Département; Nombre de téléchargement; Date d'ajout; Nom Adhérent";
$fichier .= "\n";
// Requête SQL
$envoie = mysql_query($requete) or die(mysql_error());
// Enregistrement des résultats ligne par ligne
while($row = mysql_fetch_object($envoie))
{
$fichier .= "".$row->id_attestation.";".$row->ref_Q2C.";".$row->nom_operation.";".$row->ville.";".$row->code_postal.";".$row->departement.";".$row->nbre_telechargement.";".$row->dateajout.";".$row->le_demandeur."\n";
}
// Déclaration du type de contenu
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=requete.csv"); // Remplacer .csv par .xls pour exporter en .XLS
print $fichier;
exit;
}
J'ai bien déclaré ma variable de session, et il me dit toujours : query was empty -
Pour que les sessions fonctionnent, il faut mettre session_start() au début de chaque script
pour enregistrer la requête quand on clique sur 'valider', il faut bien faire comme tu l'as fait.
Il ne faut pas oublier de récupérer sa valeur quand on clique sur 'exporter' :if (isset($_POST['exporter'])) { $requete=$_SESSION['requete']; ... -
J'ai trouvé une solution avec une case à cocher au lieu d'un bouton exporter, cela fonctionne.
Mais si vous avez une solution à me proposer pour garder le bouton, je préférerai
Merci -
oui j'ai déja les session mis en place sur mon site,
Mais je ne voit pas trop comment faire.
J'ai essayé comme ça mais ca ne change rien :
$requete="";
if (isset($_POST['valider']))
{
$_SESSION['requete']=$search_sql;
}
Toujours pas de changement -
oui c'est ça.
Si tu n'utilises pas les sessions, chaque appel au script (chaque fois que tu cliques sur un bouton) est un nouveau démarrage du script, qui n'a aucun rapport avec les exécutions précédentes.
En fait, il y a d'autres techniques que les sessions : les cookies, les données cachées dans les formulaires ou passées par URL... Mais les sessions sont les plus pratiques à mon point de vue. -
En faite quand je clic sur le bouton valider il prend bien ma requête en mémoire et ensuite quand je clic sur le bouton exporter il efface si j'ai bien compris?
Donc pour la variable de session, il faudrait que j'en créé une qui stock ma requête au moment où je clic sur valider, c'est ça? -
Quand tu cliques sur le bouton exporter , tu ne cliques pas sur le bouton valider.
Donc $requete est vide (puisque tu vides son contenu juste avant de tester if (isset($_POST['valider'])) et que tu n'entres pas dans ce if)
C'est bien ce que te dit mysql.
N'oublie pas que chaque fois que tu cliques sur un bouton, valider ou exporter, ton script s'exécute à nouveau à partir de zéro et a "oublié" ce que tu avais fait à l'appel précédent. Si tu veux garder une trace des variables d'un appel à l'autre, il faut utiliser les sessions. -
J'ai mis des or die... partout
L'erreur que j'obtiens quand je clic sur le bouton exporter est la même que tout à l'heure :
Query was empty
Quand je met un echo juste avant le query, je ne peut rien voir car la boite de dialogue s'ouvre directement, donc soit c'est que la variable est vide soit je ne peux pas la voir car la boite de dialogue est là. -
Ça en sert à rien de faire un echo $requete là, il faut absolument le faire immédiatement avant le query, là où je te l'avais montré au départ.
Et il faut toujours laisser le or die(mysql_error()) après le query, c'est lui quei te dit ce qui n'a pas plû à mysql
Es-tu sûr de la ligne qui ne marche pas ? ajoute bien des or die(mysql_error()) à tous tes mysql_query, par exemple ligne 93
$rs_search = mysql_query( $search_sql , $conn_bdd ) or die(mysql_error()); -
J'ai fais un echo $requete; au niveau de :
if (isset($_POST['valider']))
{
$requete=$search_sql;
echo $requete;
}
Et il m'affiche bien la requête en fonction de la recherche,
Si je copie colle cette requête à la place de ma requête, c'est à dire:
$query = "MA REQUETE COPIE";
$result = mysql_query($query);
au lieu de
$query = $requete;
$result = mysql_query($query);
Cela fonctionne !
Après pour ce qui est du bouton valider, l'utilisateur est obliger de clické deçu car lorsqu'il effectue une recherche par ville par exemple, il sélectionne la ville dans le menu déroulant et il clic sur valider pour afficher cette recherche dans un tableau.
(C'est a ce moment la que j'ai fait mon echo)
- 1
- 2