Utilisation SELECT, LIKE + variable

Résolu
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -  
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -
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.
A voir également:

9 réponses

t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
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
jojo673 Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   44
 
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
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
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
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
Merci, mais ça fonctionne toujours pô !
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
C'est bon ! J'ai trouvé :

WHERE nom LIKE '$lettre%' et je n'utilise pas $rechlettre = ' ' . $lettre . '%';
0
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
Avec:
WHERE champ!=""
0
jojo673 Messages postés 210 Date d'inscription   Statut Membre Dernière intervention   44
 
ça marche ça ? C'est pas plutôt
champ <> ""
?
0
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
J'ai déjà essayé et ça semble fonctionner :)
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
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
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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
arthezius Messages postés 3538 Date d'inscription   Statut Membre Dernière intervention   475
 
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
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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