Utilisation SELECT, LIKE + variable

[Résolu/Fermé]
Signaler
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
-
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
-
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

Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
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>';
		}
	}
Messages postés
210
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
9 avril 2014
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';
Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
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';
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
Merci, mais ça fonctionne toujours pô !
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
C'est bon ! J'ai trouvé :

WHERE nom LIKE '$lettre%' et je n'utilise pas $rechlettre = ' ' . $lettre . '%';
Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
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';
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
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 ?
Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
Avec:
WHERE champ!=""
Messages postés
210
Date d'inscription
lundi 19 septembre 2011
Statut
Membre
Dernière intervention
9 avril 2014
44
ça marche ça ? C'est pas plutôt
champ <> ""
?
Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
J'ai déjà essayé et ça semble fonctionner :)
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
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 ?
Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
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".
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
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 ..........
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
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 ......
Messages postés
3538
Date d'inscription
jeudi 15 mai 2008
Statut
Membre
Dernière intervention
11 septembre 2016
463
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'
Messages postés
1306
Date d'inscription
lundi 25 février 2008
Statut
Membre
Dernière intervention
3 mai 2021
10
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 ++