Erreur de requête introuvable

Résolu
zeckwam Messages postés 50 Statut Membre -  
ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je suis élève de BTS IG et actuellement stagiaire, et mon m'a demandé de développer un programme permettant de gérer une base de donnée. J'ai donc décidé de faire tout ça sous forme de site web, et de gérer ma base de donnée via phpmyadmin.

Bref, tout ce petit monde marche plutôt pas mal, excepté une requête SQL qui me fait m'arracher les cheveux, après plusieurs jours de recherche de "pourquoi que ça marche pas nondédiou ?"

Via cette requête je veux afficher des données stockées dans ma base, et les trier selon un ordre choisi par l'utilisateur parmi une liste déroulante. Mais un message d'erreur apparait : "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in..." et impossible de trouver la failler...

				$nombreDeMessagesParPage = 10; //détermination d'un nombre de messages par page, affecté a une variable
				$retour = mysql_query('SELECT COUNT(*) AS code_ent FROM entreprise WHERE entreprise.nom_ent like "' .$_SESSION['lettre']. '%"'); //requête SQL retournant le nombre d'entreprises dans la base de données
				$donnees = mysql_fetch_array($retour);
				$totalDesMessages = $donnees['code_ent'];
				$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage); //calcul du nombre de pages
				
				if (isset($_GET['page']))
					{
						$page = $_GET['page'];
					}
				else
					{
						$page = 1;
					}

					
				$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
				$reponse = mysql_query('SELECT nom_ent, adresse_ent, nom_ville, cp_ent
										FROM entreprise, ville
										WHERE entreprise.code_ville = ville.code_ville
										AND entreprise.nom_ent like "' . $_SESSION['lettre'] . '%"
										ORDER BY ' . $_SESSION['tri'] . $_SESSION['sens'] . ' LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage); //requête SQL : données a afficher


Si vos yeux plus habitués que les miens a ce code pouvaient trouver le soucis, je vous en serais vraiment très reconnaissant !

13 réponses

Résumé de la discussion

La discussion porte sur une requête SQL en PHP visant à afficher et trier des entreprises stockées dans une base, avec pagination et tri paramétré par l'utilisateur via une liste déroulante. Plusieurs répondants pointent des erreurs potentielles dans ORDER BY et l'assemblage des paramètres, notamment un espace manquant entre les colonnes et les directions ASC/DESC et un mélange de guillemets. Il est conseillé de tester avec des requêtes simplifiées et d'afficher la requête générée pour localiser l'erreur, puis de corriger en utilisant un espace entre le champ et la direction. Enfin, les propositions retiennent ORDER BY tri et sens en séparant les éléments par un espace plutôt que par une virgule, afin que la requête retourne bien des résultats.

Bobot (l'IA à votre service)
  1. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
     
    Bonjour,
    'SELECT
       COUNT(*) AS code_ent
    FROM  
       entreprise
    WHERE 
       entreprise.nom_ent like " ' .$_SESSION['lettre']. '%" '
    


    Aucun souci visible ici
    SELECT 
        nom_ent,
        adresse_ent,
        nom_ville,
        cp_ent
    FROM 
        entreprise,
        ville
    WHERE 
        entreprise.code_ville = ville.code_ville AND
        entreprise.nom_ent like " ' . $_SESSION['lettre'] . '%"
    ORDER BY ' . $_SESSION['tri'] . $_SESSION['sens'] . ' 
    LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage
    


    A mon avis il te manque un espace entre $_SESSION['tri'] et $_SESSION['sens']
    0
  2. zeckwam Messages postés 50 Statut Membre 2
     
    Merci de cette réponse rapide !

    Il faudrait, selon toi, que j'écrive
    ORDER BY ' . $_SESSION['tri'] .' ' . $_SESSION['sens'] . '
     
    0
    1. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      oui, debug en ajoutant un print devant la requete, et copie la dans phpmyadmin
      0
    2. zeckwam Messages postés 50 Statut Membre 2
       
      Même avec un print j'ai le même message d'erreur... L'erreur n'est peut-être pas dans la requête, mais je ne comprend pas où elle pourrait être...
      0
  3. Alain_42 Messages postés 5413 Statut Membre 904
     
    a mon avis c'est une virgule qu'il faut entre $_SESSION['tri'] et $_SESSION['sens']

    ORDER BY '.$_SESSION['tri'].','.$_SESSION['sens'].'
    0
    1. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      Un espace ...
      [ORDER BY {unsigned_integer | nom_de_colonne | formula} [ASC | DESC] ,...]

      http://dev.mysql.com/doc/refman/5.0/fr/select.html
      0
  4. zeckwam Messages postés 50 Statut Membre 2
     
    Arf, ni la virgule ni l'espace ne fonctionnent :s
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      Mais je me demande si le problème vient réellement de la requête, puisqu'elle me parrait correcte...
      0
    2. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      affiche la requete entière
      0
    3. zeckwam Messages postés 50 Statut Membre 2
       
      $reponse = mysql_query('SELECT nom_ent, montant, secteur_taxe, anneesco
      FROM entreprise, offre, taxe, annee
      WHERE entreprise.code_ent = offre.code_ent
      AND offre.code_taxe = taxe.code_taxe
      AND taxe.code_annee = annee.code_annee
      AND entreprise.nom_ent like "'.$nom.'"
      AND offre.montant >= ' . $_SESSION['montant'] . '
      ORDER BY ' . $_SESSION['tri'] . $_SESSION['sens'] . ' LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
      0
    4. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      ORDER BY ' . $_SESSION['tri'] . $_SESSION['sens'] . ' LIMIT ' .

      ORDER BY ' . $_SESSION['tri'] .' '. $_SESSION['sens'] . ' LIMIT ' .
      0
    5. zeckwam Messages postés 50 Statut Membre 2
       
      C'est ce que j'ai tenté de faire, oui, mais rien n'y fait "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in..."
      Merci de m'aider, en tout cas !
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Alain_42 Messages postés 5413 Statut Membre 904
     
    ORDER BY {unsigned_integer | nom_de_colonne | formula}

    ce ne sont pas des noms de colonnes différentes dans cet exemple mais les différentes possibilités

    un peu plus bas dans ce document (http://dev.mysql.com/doc/refman/5.0/fr/select.html) voir l'exemple avec plusieurs champs:

    SELECT college, region, seed FROM tournament
    -> ORDER BY region, seed;

    donc je persiste et signe il faut bien une virgule pour séparer plusieurs champs pour ORDER BY

    par contre tu as peut être une autre erreur dans ta requette

    essayes comme ça pour voir quelle erreur elle te sort et quelle gueule elle a (verifies qu'il y a bien un espace entre chaque AND etc..):
    $query="SELECT nom_ent, montant, secteur_taxe, anneesco
    FROM entreprise, offre, taxe, annee
    WHERE entreprise.code_ent = offre.code_ent
    AND offre.code_taxe = taxe.code_taxe
    AND taxe.code_annee = annee.code_annee
    AND entreprise.nom_ent like "'.$nom.'"
    AND offre.montant >= ".$_SESSION['montant']."  
    ORDER BY ".$_SESSION['tri'].",".$_SESSION['sens']." LIMIT ".$premierMessageAafficher.",".$nombreDeMessagesParPage." ";
    
    $reponse=mysql_query($query) or die ("Pb avec la requette :<br />".$query."<br />".mysql_error());
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      Rien a faire... j'ai retenté tout ça, virgule, espace, changer le nom des variables (puisque j'utilisais les mêmes noms pour une autre page), rien n'y fait... toujours cette erreur : "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\dbentreprise\entreprises.php on line 120".
      Même mon maître de stage bug devant mon problème...

      En essayant ton code, ça me sort :
      Pb avec la requette :

      Query was empty
      0
  7. Alain_42 Messages postés 5413 Statut Membre 904
     
    et si tu fais:

    $query="SELECT nom_ent, montant, secteur_taxe, anneesco
    FROM entreprise, offre, taxe, annee
    WHERE entreprise.code_ent = offre.code_ent
    AND offre.code_taxe = taxe.code_taxe
    AND taxe.code_annee = annee.code_annee
    AND entreprise.nom_ent like "'.$nom.'"
    AND offre.montant >= ".$_SESSION['montant']."  
    ORDER BY ".$_SESSION['tri'].",".$_SESSION['sens']." LIMIT ".$premierMessageAafficher.",".$nombreDeMessagesParPage." ";
    
    echo "contenu de la requette: ".$query;
    
    


    ça affiche quoi ?
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      ça n'affiche rien :
      "contenu de la requete :

      "
      puis ça passe à la suite du code (le choix de la page, etc...)
      0
    2. zeckwam Messages postés 50 Statut Membre 2
       
      Ma journée de stage s'arrête là. Je vous remercie d'avoir essayer de m'aider. A demain j'espère, pour tenter de régler ce foutu problème...
      0
  8. Alain_42 Messages postés 5413 Statut Membre 904
     
    donc la requette est VIDE !

    fais un echo des variables qui la compose:

    echo "Session_montant=".$_SESSION['montant']."<br />session tri=".$_SESSION['tri']."<br />session sens= ".$_SESSION['sens']."<br /> Premier message a afficher= ".$premierMessageAafficher."<br /> Nbr par page= ".$nombreDeMessagesParPage;


    verifies aussi tes noms de table, de champs
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      Hum ça ça marche, ça me donne ce qui est censé être dans les variables.
      0
  9. Alain_42 Messages postés 5413 Statut Membre 904
     
    //on va "surnommer" le nom des tables:  entreprise -> Ent offre -> Off etc..
    //verifies que les champs juste après SELECT sont bien dans les tables que j'ai mis
    //il y avait une erreur juste après LIKE  inversion des ' et "
    //on va passer par la fonction escape string au cas ou il y aurait une apostrophe dans le nom ça l'e
    échappe en mettant un \ devant
    
    $query="SELECT Ent.nom_ent, Off.montant, Ent.secteur_taxe, An.anneesco
     FROM entreprise Ent, offre Off, taxe Tx, annee An
     WHERE Ent.code_ent = Off.code_ent
     AND Off.code_taxe = Tx.code_taxe
     AND Tx.code_annee = An.code_annee
     AND Ent.nom_ent LIKE '".mysql_real_escape_string($nom)."'
     AND Off.montant >= ".$_SESSION['montant']."  
     ORDER BY ".$_SESSION['tri'].",".$_SESSION['sens']." LIMIT ".$premierMessageAafficher.",".$nombreDeMessagesParPage." ";
    
    echo "Texte de la requette: ".$query; //ça donnes quoi ?
    
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      Bonjour ! Merci de continuer à m'aider à trouver la solution !

      Je viens de tester votre code, et encore une fois, ça n'affiche rien :
      "Texte de la requete :

      "
      Puis la suite du code.
      0
    2. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      Alain, pour moi ORDER BY ".$_SESSION['tri'].",".$_SESSION['sens'] est faux, d'apres le nom de variable, $_SESSION['sens'] c'est ASC ou DESC donc

      ORDER BY champ ASC, tu as raison si il y a plusieurs champs c'est séparé par une virgule
      0
    3. zeckwam Messages postés 50 Statut Membre 2
       
      Oui, $_SESSION['sens'] devient "ASC" ou "DESC"
      0
  10. zeckwam Messages postés 50 Statut Membre 2
     
    Bizarrement, en rajoutant ça :
    if (! $reponse)
    {
    	echo ("Erreur requete".mysql_error());
    } 	
    

    ça ne m'affiche pas d'erreur de requête, mais simplement "Warning: mysql_fetch_array() expects parameter 1 to be resource, string given in C:\wamp\www\dbentreprise\entreprises.php on line 125"
    (j'avais remis le résultat qui était censé opérer, que j'avais mis en commentaire). La ligne 125 est juste après la requête, c'est justement le résultat :
    while ($donnees = mysql_fetch_array($reponse))
    {...}
    
    0
  11. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
     
    Essayes aussi de remplacer les " par de '.

    Essayes une requête écrite en dur d'un cas puis tu remplaces chaque valeur par la variable
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      Raaah ! Je comprend pas... même en remplaçant les variables par des valeurs brutes ($_SESSION['sens'] par ASC, $_SESSION['tri'] par "nom_ent" etc) j'ai la même erreur. Ce qui veut dire que le problème ne vient pas de ma requête ?!
      0
    2. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      affiche ta requete.
      De plus tu dois avoir
      $reponse = mysql_query($query);
      while($row = mysql_fetch_array($reponse))
      {
        ...
      }
      
      0
  12. sapma Messages postés 174 Statut Membre 5
     
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in...

    Tu peux stp écrire tout le message d'erreur ?
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      Warning: mysql_fetch_array() expects parameter 1 to be resource, string given in C:\wamp\www\dbentreprise\entreprises.php on line 124

      C'est plus le même, d'ailleurs !
      0
  13. zeckwam Messages postés 50 Statut Membre 2
     
    Merci de m'aider. Je suis en week-end pour le moment, et je ne peux pas emmener mon travail chez moi. Donc je testerais tout ça lundi matin. Encore merci !
    0
  14. Alain_42 Messages postés 5413 Statut Membre 904
     
    Je reviens
    ORDER BY ".$_SESSION['tri'].",".$_SESSION['sens']

    effectivement si la 2 iéme variable contient ASC ou DESC dans ce cas il na faut pas les séparer par une virgule mais un espace

    ORDER BY ".$_SESSION['tri']." ".$_SESSION['sens'] 


    mais en un premier temps essayes en "racourcissant la requette pour voir à partir de quel endroit elle coince

    $query="SELECT Ent.nom_ent, Off.montant, Ent.secteur_taxe, An.anneesco
     FROM entreprise Ent, offre Off, taxe Tx, annee An
     WHERE Ent.code_ent = Off.code_ent
     AND Off.code_taxe = Tx.code_taxe
     AND Tx.code_annee = An.code_annee
     AND Ent.nom_ent LIKE '".mysql_real_escape_string($nom)."'
     AND Off.montant >= ".$_SESSION['montant']." ";
    
    echo "Texte de la requette: ".$query; //ça donnes quoi ?
    


    si tu n'as toujours rien derriere "Texte de la requette", raccourcis jusqu'à ce que tu ai qq chose
    0
    1. zeckwam Messages postés 50 Statut Membre 2
       
      J'ai repris ma requête a zéro, comme tu me l'a conseillé, je suis parti de
      "SELECT nom_ent
      FROM entreprise");
      

      et j'ai ajouté la suite petit a petit, et Oh MIRACLE !!! ça maaaaaaaarche !!! :D
      Donc voilà ma requête de base :
      $reponse = mysql_query('
      SELECT nom_ent, adresse_ent, nom_ville, cp_ent
      FROM entreprise, ville
      WHERE entreprise.code_ville = ville.code_ville
      AND entreprise.nom_ent like "' . $_SESSION['lettre'] . '%"
      ORDER BY ' . $_SESSION['tri'] . $_SESSION['sens'] . ' LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage
      );
      

      Telle que je vous l'avais donnée tout au début de ce post ; et voici ma requête finale, qui fonctionne :
      $query = mysql_query("
      SELECT nom_ent, adresse_ent, nom_ville, cp_ent
      FROM entreprise, ville
      WHERE entreprise.code_ville = ville.code_ville
      AND entreprise.nom_ent LIKE '".$_SESSION['lettre']."%'
      ORDER BY ".$_SESSION['trier']." ".$_SESSION['ordre']."
      LIMIT ".$premierMessageAafficher.",".$nombreDeMessagesParPage."
      ");
      

      (dont j'ai modifier un petit paquet d'appellations, et autres noms de variables, tout au long de la résolution du problème)
      Un grand merci a tout ceux qui m'ont aidés, et je vous souhaites une excellente journée (la mienne commence plutôt bien !!)
      A bientot, et merci encore !
      0
    2. ChrisCompote Messages postés 44 Date d'inscription   Statut Membre Dernière intervention   8
       
      De rien
      0