Utilisation SELECT, LIKE + variable

Résolu
Bonjour,

Je cherche à afficher un tableau en y insérant les noms de la base mysql commençant par A, ou B, ou C, ......, + le total des même noms.

Voilà ce que j'ai écrit :

$lettre = $_GET['lettre']; 
$rechlettre = ' ' . $lettre . '%';

$select = 'SELECT nom,COUNT(*) AS nb FROM ville WHERE nom LIKE "$rechlettre" GROUP BY nom ORDER BY nom ASC';
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );

    while ($row = mysql_fetch_array($result))
    {
        echo '<tr>';
        echo '<td>'.$row['nom'].'</td>';
        echo '<td align="center">'.$row['nb'].'</td>';
        echo '</tr>';
	}


Si je fais un "echo" de $rechlettre, cela correspond à la demande. C'est à dire A%, ou B%, .....
Mais aucune donnée ne s'affiche !?
POurquoi ?
Merci.

9 réponses

  1. Bon ! J'ai contourné le problème ................

    Dans ma base, quand mon champs date_naissance est vide, je le remplace par 9999. Ce champs ne sera jamais minimum, et si il est seul à être trouvé, je le remplace par un vide à l'affichage ! Et ça fonctionne .............. ;o))

    A ++
    0
    1. J'ai testé avec mysql_num_rows, mais je me retrouve avec le même problème.
      C'est à dire que les enregistrements avec le champs date vide ne sont pas pris en compte dans le nombre de nom nb !
      Et si je fais en sorte qu'ils apparraissent dansx le total nb,
      Si j'enlève AND date_naissance != " " , la date vide est prise en compte comme minimum.
      Ce qu'il faudrait, c'est si date_naissance = " ", lire le date_naissance suivant ......
      0
      1. Dans ta requête, il faut essayer en enlevant
        nom,COUNT(*) AS nb, MIN( RIGHT(date_naissance, 4) ) AS date

        Tu peux essayer à la place:
        $sql = 'SELECT * FROM ville WHERE nom LIKE "'.mysql_real_escape_string($lettre).'%" AND date_naissance != "" GROUP BY nom ORDER BY nom ASC'
        0
    2. Ouaips ! Ca m'a l'air pas mal ! Je vais essayer ......

      J'avais commencé à imbriquer des if, else et select dans ma boucle while. Mais avec mysql_num_rows() ce sera peut-être plus propre ..........
      0
      1. OK !!!!!
        Avec AND date_naissance != "", si pour un nom A j'ai une ou plusieurs "date" existantes, et une ou plusieurs "date" vides, j'affiche du vide, au lieu d'afficher la dernière "date" minimum existante.
        Si pour un nom B je n'ai pas de "date" existante, mais uniquement une ou plusieurs "date" vides, je n'ai pas d'affichage du tout ......

        C'est un peu tordu, non ? ;o)
        1
        1. Tu peux utiliser mysql_num_rows() pour compter le nombre de résultat commençant par la lettre souhaité et dont le champ data_naissance n'est pas vide (ce qui est le but de ta requête).

          Ainsi par exemple:
          $sql = 'SELECT nom,COUNT(*) AS nb, MIN( RIGHT(date_naissance, 4) ) AS date FROM ville WHERE nom LIKE "'.mysql_real_escape_string($lettre).'%" AND date_naissance != "" GROUP BY nom ORDER BY nom ASC';
          $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
          $nb = mysql_num_rows($req);
          
          // Si pas de résultat
          if($nb==0) echo'<p>Aucun résultat trouvé.</p>';
          
          // Si un ou plusieurs résultats
          else{
          	echo'<p><strong>'.$nb.'</strong> résultats trouvés:</p>';
          	while($data = mysql_fetch_array($req))
          		{
          		echo'<p><strong>'.$data['nom'].'</strong> ('.$data['date_naissance'].')</p>';
          		}
          	}
          0
      2. Si j'écris
        $select = 'SELECT nom,COUNT(*) AS nb, MIN( RIGHT(date_naissance, 4) ) AS date WHERE date_naissance != " " FROM ville WHERE nom LIKE "'.mysql_real_escape_string($lettre).'%" GROUP BY nom ORDER BY nom ASC'; 
        

        ou
        ..... WHERE date_naissance <> " " .........
        j'ai Erreur : You have an error in your SQL syntax.

        De toute façon, je cherche un peu plus compliqué ........
        C'est à dire que je lis un enregistrement Arthur (il peut y avoir plusieurs enregistrements nommés Arthur) qui possède un champs "date".
        1) Si tous les enregistrements Arthur ont un champs "date", j'affiche le minimum. ( => Ca, c'est OK)
        2) S'il existe un (ou plusieurs) champs "date" vide dans les enregistrements Arthur, j'en fait abstraction, et je veux afficher le champs minimum existant. ( => Actuellement, j'affiche le champs vide car il est considéré comme minimum).
        3) Si tous les champs "date" sont vides, j'affiche un résultat vide. ( => Ca, c'est OK)

        Actuellement, j'arrive à faire ces résultat (1,2 ou 3) séparemment, en modifiant la base (supression ou pas des champs "date" vide, mais je n'arrive pas à combiner les trois ensemble !

        J'espère avoir été suffisamment compréhensible.

        Y a t'il une commade pour faire cela ? Ou faut-il paramétrer le champs "date" correctement sous Mysql pour y arriver ?
        0
        1. Essai plutôt:
          $select = 'SELECT nom,COUNT(*) AS nb, MIN( RIGHT(date_naissance, 4) ) AS date FROM ville WHERE nom LIKE "'.mysql_real_escape_string($lettre).'%" AND date_naissance != "" GROUP BY nom ORDER BY nom ASC';

          Il ne faut écrire qu'une seule fois "WHERE" dans la requête et après le "FROM".
          Pour ajouter un second critère de recherche tu l'ajoute avec "AND".
          0
      3. Merciiiiiiiiiiiii !

        Dans ma base mysql, j'ai des champs défini en "Varchar" qui peuvent être vide.

        Si je fait une requête dessus pour trouver la valeur minimum du champs ( ....MIN( RIGHT(varch, 4) ) AS txt....) j'ai une réponse vide, puisque le champs est vide et considéré comme NULL.

        Comment faire pour que la valeur "vide" ne soit pas considérer comme une valeur minimum numérique, et que le résultatv se fasse sur la prochaine occurence ?
        0
        1. Avec:
          WHERE champ!=""
          0
        2. ça marche ça ? C'est pas plutôt
          champ <> ""
          ?
          0
        3. J'ai déjà essayé et ça semble fonctionner :)
          0
      4. C'est bon ! J'ai trouvé :

        WHERE nom LIKE '$lettre%' et je n'utilise pas $rechlettre = ' ' . $lettre . '%';
        0
        1. Donc en occurrence ça serai plutôt:
          $select = 'SELECT nom,COUNT(*) AS nb FROM ville WHERE nom LIKE "%'.mysql_real_escape_string($lettre).'%" GROUP BY nom ORDER BY nom ASC';
          0
      5. Merci, mais ça fonctionne toujours pô !
        0
        1. Problème de guillemets, essaye ça :
          $select = 'SELECT nom,COUNT(*) AS nb FROM ville WHERE nom LIKE "'.$rechlettre.'" GROUP BY nom ORDER BY nom ASC';
          0
          1. Ainsi que la fonction mysql_real_escape_string pour protéger les données.
            $select = 'SELECT nom,COUNT(*) AS nb FROM ville WHERE nom LIKE "'.mysql_real_escape_string($rechlettre).'" GROUP BY nom ORDER BY nom ASC';
            0