Conflit entre requête et fonction SQL ?

Résolu
Bonjour,
Bonjour,
J'ai fait un formulaire de recherche qui compte les résultats et les affiche page par page.
Tout marchait bien en faisant une connexion "classique" :
mysql_connect('localhost', 'root', 'root');
mysql_select_db('lithotheque');
Puis j'ai voulu remplacer cette connexion provisoire par celle que j'ai utilisé pour tout mon site, qui est dans un fichier de fonctions.
Et là : catastrophe, plus rien ne fonctionne.
Voici les erreurs que j'obtiens :
- Resource id #6string(35) ???
- Warning: mysql_query() expects parameter 1 to be string, resource given in .... ligne 57
Je pense qu'il y a un conflit ou quelque chose qui fait double emploi entre ma requête et la fonction SQL ?
Si vous pouviez m'aider à comprendre ce serait super et je vous en remercie par avance. Je galère là-dessus depuis 2 jours et toutes mes recherches n'ont rien donné. Non plus les var_dump, print_r et autres echo...
Evelyne

Ma requête :
$retour_total_query = SQLSelect("SELECT count(a.ID_gite) AS total FROM GITE a, DEPARTEMENT b, AS_COMMU_DEPAR c
			WHERE a.ID_commune = c.COMMUNE_ID_commune
			and b.ID_departement = c.DEPARTEMENT_ID_departement
			and b.codeDepartement = '".$mot_recherche."'
		");
	$clauseWhere; // Critères de recherche
	$retour_total = mysql_query($retour_total_query) or die('Erreur SQL !'.$retour_total_query.'<br>'.mysql_error());
	$donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
	$total = $donnees_total['total'] or die('requete =>'.$total.'<br> 
error->'.mysql_error()); //On récupère le total pour le placer dans la variable $total.


Ma fonction :
function SQLSelect($sql) {
    global $BDD_host;
    global $BDD_base;
    global $BDD_user;
    global $BDD_password;

    mysql_pconnect($BDD_host, $BDD_user, $BDD_password) or die("<font color=\"red\">Erreur de connexion : " . mysql_error() . "</font>");
    mysql_select_db($BDD_base) or die("<font color=\"red\">Erreur select db : " . mysql_error() . "</font>");
    mysql_query("SET NAMES 'utf8'");
    $rs = mysql_query($sql) or die("Erreur sur la requete : <font color=\"red\">$sql" . "|" . mysql_error() . "</font>");
    $num = mysql_num_rows($rs);
    if ($num == 0)
        return false;
    else
        return $rs;
}


11 réponses

  1. Contributeur
    Bonjour,

    si je comprends bien ton code, tu fais un mysql_query sur un mysql_query, ça ne peut pas marcher.

    Essaye de supprimer la ligne :

    $retour_total = mysql_query($retour_total_query) or die('Erreur SQL !'.$retour_total_query.'<br>'.mysql_error());

    et de passer à ton mysql_fetch_assoc la variable $retour_total_query
    1
    1. Bonjour ThEBiShOp,
      Je te remercie pour ta réponse, et ta rapidité. Il me semblait bien que le problème venait de là. J'ai modifié mon code selon tes indications et les résultats sont OK.
      Par contre j'ai le même problème avec la requête suivante et là je ne fais pas de mysql_query sur un mysql_query ? Pourtant j'ai le même message d'erreur que précédemment : "Warning: mysql_query() expects parameter 1 to be string, resource given in...".
      Je soumets cette nouvelle requête à ton oeil expert. L'erreur indiquée se situe ici
      $retour_messages = mysql_query($retour_messages_query);
      :
      		mysql_query("SET NAMES 'utf8'");
      	$retour_messages_query = 
      		SQLSelect("SELECT a.numGite, b.codeDepartement, b.nomDepartement   
      			FROM GITE a, DEPARTEMENT b, AS_COMMU_DEPAR c
      			WHERE a.ID_commune = c.COMMUNE_ID_commune 
      			and b.ID_departement = c.DEPARTEMENT_ID_departement
      		");
      		$clauseWhere. // Critères de recherche
      		" ORDER BY numGite 
      		ASC LIMIT ".$premiereEntree.", ".$messagesParPage." "; // Pagination*/
      	$retour_messages = mysql_query($retour_messages_query);
      	break;
      

      Merci pour ton aide.
      Evelyne
      0
      1. Contributeur
        Si tu fais exactement la même chose

        en fait, tu soumets ta requête à la fonction SQLSelect et dans cette fonction, il y a un mysql_query. Ta fonction retourne un jeu de résultat que tu mets dans la variable $retour_messages_query. Ensuite tu soumets $retour_messages_query à un mysql_query, mais mysql_query attends une requête, que tu ne lui donnes pas.
        0
    2. Super ThEBiShOp, j'ai enfin compris et cela va me servir pour d'autres fichiers en attente. Merci beaucoup pour ton aide, dire que ça fait 2 jours que je tournais en rond !
      Maintenant j'ai un problème d'affichage mais je me creuse un peu avant de poster un nouveau sujet.
      Très bonne journée,
      Evelyne
      0
      1. Contributeur
        bon courage
        0
    3. Re-bonjour,
      Désolée mais je crois que j'ai mis un peu trop vite mon post en "résolu". De plus je pensais avoir compris mais j'ai un nouveau problème du même ordre et je n'arrive pas à le résoudre.

      Je récupère le résultat de ma requête $retour_messages_query dans un tableau $retour_messages = mysql_fetch_assoc. Cela allait bien pour la précédente requête mais pas ici. Encore merci ThEBiShOp ;-)

      La requête :
      $retour_messages_query = 
      		SQLSelect("SELECT a.numGite, b.codeDepartement  
      			FROM GITE a, DEPARTEMENT b, AS_COMMU_DEPAR c
      			WHERE a.ID_commune = c.COMMUNE_ID_commune 
      			and b.ID_departement = c.DEPARTEMENT_ID_departement
      			and b.codeDepartement = '".$mot_recherche."'
      		");
      		$clauseWhere. // Critères de recherche
      		" ORDER BY numGite 
      		ASC LIMIT ".$premiereEntree.", ".$messagesParPage." ";// Pagination
      	$retour_messages = mysql_fetch_assoc($retour_total_query); //On range retour sous la forme d'un tableau.
      


      J'ai essayé plusieurs solutions (foreach...) sans succès. Voici le message d'erreur : Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in line 267. Cette ligne est dans le code final d'affichage des résultats qui semble poser problème :
      while($donnees_messages = mysql_fetch_array($retour_messages) or die(mysql_error()) ) { ...


      Je vois bien qu'il y a encore conflit entre 2 array. Merci par avance pour votre aide, je craque.
      Evelyne
      0
      1. Contributeur
        tu peux montrer ce qu'il y a avant la ligne de l'erreur ?
        0
    4. Voici le code ci-dessous, pour un affichage page par page classique. Merci par avance si vous pouviez m'indiquer pourquoi j'ai tout faux ? Je ne comprends pas pourtant vos explications semblaient claires ?
      Evelyne

      <?php
      if($total) {
          // début du tableau
          echo $total;
          
          echo '<table id=table1>'."\n";
              // première ligne on affiche les titres prénom et surnom dans 2 colonnes
              echo '<tr>';
              echo '<th>Numéros des gîtes</th>';
              //echo '<th>Nature des gîtes</th>';
              echo '</tr>'."\n";
          // lecture et affichage des résultats sur 1 colonne, 1 résultat par ligne.    
      while($donnees_messages = mysql_fetch_array($retour_messages) or die(mysql_error()) ) {
      
              echo '<tr>';
              echo '<td ><a href="../lith_page_gite.php?numGite='. $donnees_messages['numGite'] . '">' . $donnees_messages['numGite'] . '</a></td>';
              echo '</tr>'."\n";
          
          }    echo '</table>'."\n";
          // fin du tableau.
         }
      0
      1. Contributeur
        Je pense que le problème est similaire à ceux d'avant, ce coup ci ce n'est pas des mysql_query que tu fais en trop, mais tu fais un mysql_fetch_array sur un mysql_fetch_assoc.

        Le plus simple c'est que tu retires la ligne :
        $retour_messages = mysql_fetch_assoc($retour_total_query);

        et change ton while :
        while($donnees_messages = mysql_fetch_array($retour_total_query) or die(mysql_error()) )
        0
    5. Merci encore.
      Mon tableau listant les résultats ne s'affiche plus et je n'ai aucun message d'erreur. Je tente de reprendre morceau par morceau mon code en faisant des echo, print_r, var_dump...
      Dès la 1ère requête (pour compter le nombre d'enregistrements) quelque chose ne va pas, un "print_r ($retour_total_query);" renvoie : "Resource id #6". Je n'ai pas trouvé de solution sur le web.
      Ensuite des echos sur $messagesParPage, $nombreDePages, $total renvoient bien les bonnes valeurs.
      Il me semble que $retour_total_query est vide car un echo donne "array" et j'avais déjà eu ce souci ?
      Une piste peut-être ? Merci par avance,
      Evelyne
      0
      1. Contributeur
        si tu veux, mets ton code dans https://pastebin.com/ ça sera beaucoup plus clair, parce que là je peux pas trop t'en dire plus sans voir concrètement ce que tu as fait ^^
        0
    6. Merci ThEBiShOp,
      J'accepte bien volontiers ton aide. Si tu pouvais, STP, juste prendre quelques mn pour balayer mon code, je suis sûre que mon/mes erreurs vont te sauter aux yeux.
      Voici le lien : http://pastebin.archlinux.fr/459797
      Je te remercie encore par avance,
      Evelyne
      0
      1. Contributeur
        ça c'est pas certain, si je pouvais tester, c'est sûr que ça irait plus vite, mais c'est pas très beaucoup possible.

        Maintenant que j'ai ton code sous les yeux, est-ce que tu peux me dire les lignes (le n°) qui te posent problème et le problème en question.
        0
    7. Je pense qu'il y a un problème dès le début, dans la 1ère requête :
      ligne 43 : "print_r ($retour_total_query);" renvoie "Resource id #6"

      Ensuite, ligne 57 :
      "echo $donnees_total;" affiche "Array". Ca c'est que le tableau est vide. Normal puisque $retour_total_query est vide.

      Les 3 autres echos sont OK : echo $messagesParPage;
      echo $nombreDePages;
      echo $total;

      Je suis sûre que c'est toujours le même problème, des mysql_query sur des query, et des mysql_fetch_array sur des mysql_fetch_assoc...
      Je ne maîtrise pas du tout ça.

      Au final, je n'ai que l'entête de mon tableau qui s'affiche, aucun résultat dedans.
      La ligne "Pour le terme recherché : 31, il y a 14 enregistrements dans la Lithothèque." est OK, c'est bien 31 et 14.

      Merci.
      Evelyne
      0
      1. Contributeur
        ligne 43, c'est un ressource id, c'est normal je pense.

        par contre j'ai du mal à comprendre comment tu peux avoir $total alors que $donnees_total est vide.

        essaye de remplacer SQLSelect par mysql_query pour voir ce que ça donne
        0
    8. OK pour la ligne 43. Je vais voir ce que cela signifie.

      C'est vrai que c'est incompréhensible, d'autant que tout marchait bien encore la semaine dernière avec une connexion de type :
      mysql_connect('localhost', 'root', 'root');
      mysql_select_db('bdd');
      et un SELECT pour les requêtes.

      J'ai juste voulu utiliser ma fonction pour faire tout bien propre.

      SQLSelect est une fonction (dans un fichier à part) qui fait appel à mysql_query donc je ne peux pas remplacer SQLSelect par mysql_query.

      Voici la fonction (utilisée pour tout mon site et qui est nickel) :
      function SQLSelect($sql) {
          global $BDD_host;
          global $BDD_base;
          global $BDD_user;
          global $BDD_password;
      
          mysql_pconnect($BDD_host, $BDD_user, $BDD_password) or die("<font color=\"red\">Erreur de connexion : " . mysql_error() . "</font>");
          mysql_select_db($BDD_base) or die("<font color=\"red\">Erreur select db : " . mysql_error() . "</font>");
          mysql_query("SET NAMES 'utf8'");
          $rs = mysql_query($sql) or die("Erreur sur la requete : <font color=\"red\">$sql" . "|" . mysql_error() . "</font>");
          $num = mysql_num_rows($rs);
          if ($num == 0)
              return false;
          else
              return $rs;
      }


      Je te remercie pour ton aide mais ne perds pas trop de temps. J'ai tout imprimé et je vais décortiquer le code actuel et l'ancien pour voir. C'est galère mais ça fait progresser.
      Evelyne
      0
      1. Une indication : j'ai fait un "print_r($donnees_total);" en ligne 47, juste en-dessous de "$donnees_total = mysql_fetch_assoc($retour_total_query);" et cela m'affiche :
        Array ( [total] => 14 )


        Array correspond à "$donnees_total".
        "[total] => 14" : c'est juste il y a bien 14 résultats

        En fait cela correspond à la ligne 49 "$total = $donnees_total['total'] or die('requete =>'.$total.'<br> " qui ne s'affichait pas avant ?

        Par contre je ne comprends pas du tout cette ligne de code, à quoi correspond ce ['total'] qui n'apparaît nulle part ailleurs dans mon fichier ???

        Merci encore.
        Evelyne
        0
        1. Contributeur
          ta requête : SELECT count(a.ID_gite) AS total

          c'est ce champ là que tu retrouves dans $donnees_total
          0
      2. OK, merci. J'ai tout imprimé, je rentre ça me fera une coupure et je reprends en arrivant.
        Merci encore pour ton aide, je reposterai certainement ce soir... peut-être pour indiquer la solution ??? ;-)
        Bonne fin d'après-midi,
        Evelyne
        0