Utilisation SELECT, LIKE + variable

Résolu/Fermé
t671 Messages postés 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 - 29 sept. 2011 à 15:02
t671 Messages postés 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 - 2 oct. 2011 à 10:04
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

t671 Messages postés 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
Modifié par t671 le 30/09/2011 à 18: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 jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
30 sept. 2011 à 19:03
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 lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
Modifié par jojo673 le 29/09/2011 à 15:09
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 jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
29 sept. 2011 à 15:14
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 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
29 sept. 2011 à 15:54
Merci, mais ça fonctionne toujours pô !
0
t671 Messages postés 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
29 sept. 2011 à 16:03
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 jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
Modifié par arthezius le 29/09/2011 à 17:42
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 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
29 sept. 2011 à 17:59
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 jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
29 sept. 2011 à 19:28
Avec:
WHERE champ!=""
0
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
29 sept. 2011 à 22:37
ça marche ça ? C'est pas plutôt
champ <> ""
?
0
arthezius Messages postés 3538 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
30 sept. 2011 à 17:38
J'ai déjà essayé et ça semble fonctionner :)
0
t671 Messages postés 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
Modifié par t671 le 30/09/2011 à 17:22
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 jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
30 sept. 2011 à 17:40
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 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
30 sept. 2011 à 19:18
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 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
1 oct. 2011 à 17:47
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 jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 473
1 oct. 2011 à 19:26
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 1404 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 2 septembre 2022 10
2 oct. 2011 à 10:04
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