Page 1 sur 2
Probleme de requete
Posté : 30 avr. 2007, 09:47
par djtec
bonjour
voila j'ai trouvé sur le net un script que je voudrais modifier
je voudrais afficher une liste trié par une lettre donne
en faites si la personne selectionne la lettre b seul les titres commencant par la lettre b s'afficherons
voici mon code
Code : Tout sélectionner
<form action="tri.php" method="post">
<select name="letter">
<option value="a">A</option>
<option value="b">B</option>
<option value="c">C</option>
<option value="d">D</option>
etc...
</select>
</form>
Et voici ma requete
Code : Tout sélectionner
$sql = "SELECT DISTINCT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM `".$prefixe."_articles` WHERE `titre` LIKE '%".addslashes($letter)."%' AND valide!='non'";
le probleme c'est que cela m'affiche tout ce qui se trouve dans la base et pas les titres commencant par la lettre donné
donc je voulais savoir quel requete je dois utiliser
merci d'avance
Posté : 30 avr. 2007, 10:15
par sadeq
1. Si ta requête t'affiche tous les articles c'est parce que la variable $letter utilisée dans la requête reste vide car ton script ne reçoit pas correctement le paramètre "letter" envoyé par le formulaire en mode "post"
Pour ce faire, il faut d'abord récupèrer le postage de "letter".
2. Puisque tu veux seulement les titres qui
"commencent" par la lettre choisie, il faut virer le premier caractère générique "%" dans le critère Like.
Dans tous les cas, voici une proposition de correction:
tri.php
...
$letter = $_POST["letter"];
$sql = "SELECT DISTINCT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM `".$prefixe."_articles` WHERE `titre` LIKE '".addslashes($letter)."%' AND valide!='non'";
...
Posté : 30 avr. 2007, 10:20
par djtec
ça marche nikel merci
moi j'avais essayé
Code : Tout sélectionner
$sql = "SELECT DISTINCT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM `".$prefixe."_articles` WHERE `titre` LIKE CONVERT(_utf8 '%".addslashes($letter)."%' USING latin1) COLLATE latin1_general_ci AND valide!='non'";
et cela m'était tout les titre contenant la lettre désiré
merci
Posté : 30 avr. 2007, 10:24
par djtec
juste une question si je met pas les choix dans un select mais en lien
comme ceci
<a href="tri.php">A</a>
que doit faire dans mon lien pour que la page tri.php reconnaisse que je veux les résultats commencant par A
Posté : 30 avr. 2007, 11:02
par sadeq
Il faut passer le parametre "letter" dans le HREF du lien à la suite d'un "?"
Cette méthode de transmission est appellée "GET", tu dois donc le récupérer sous PHP par la variable
$_GET["letter"]
et en php:
$letter = $_GET["letter"];
....
Posté : 30 avr. 2007, 11:11
par djtec
Et si je veux afficher les resultat commencant par L mais que de la categorie 1 en ignorant les autres categories je dois mettre
En lien
'.$categorie.' correspond a l'id de la categorie
Dans la page tri.php
on recupere les donnee
$letter = $_GET["letter"];
$categorie = $_GET['categorie'];
La requete sql
$sql = "SELECT DISTINCT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM `".$prefixe."_articles` WHERE id='".$categorie."' AND `titre` LIKE '".addslashes($letter)."%' AND valide!='non'";
Est-ce bon ou j'ai fait une erreur
Posté : 30 avr. 2007, 11:17
par sadeq
tout à fait, 10/10

Posté : 30 avr. 2007, 11:26
par djtec
Yes ca y ai je commence a comprendre en faites c'est pas si complique que ça
Et pour rechercher tout les resultat de 0 a 9 comment on fait la car la je vois pas du tout
Posté : 30 avr. 2007, 11:31
par Sékiltoyai
Posté : 30 avr. 2007, 11:37
par sadeq
Yes ca y ai je commence a comprendre en faites c'est pas si complique que ça
Et pour rechercher tout les resultat de 0 a 9 comment on fait la car la je vois pas du tout
Explique !
Posté : 30 avr. 2007, 11:51
par djtec
Si un titre commence par 100 un autre par 220 etc... comment faire pour qu'il se retrouve tous dans la meme page quand quand on fait une recherche de 0-9 au lieu des lettres
Exemple:
si je clique sur le lien suivant
Je voudrais que dans la page tri cela m'affiche tout les titres commencant par un chiffre
Posté : 30 avr. 2007, 12:19
par sadeq
Oui je comprends, à ce moment là, ce n'est plus LIKE mais une expression régulière qu'il te faut car quand tu ne connais pas le critère exact de recherche il te faut pencher vers l'usage des expressions régulières.
En SQL on utilise REGEXP dans le WHERE pour évaluer une expression réguliaire.
Exemple:
Cherche les enregistrements où "champ" contient un numérique (intervalle [0-9]) n'importe où.
Avec la variante
La recherche se limite aux valeurs commençant (^) par un numérique
La variante:
La recherche se limite aux valeurs se terminant ($) par un numérique
Pour les alphabétiques les intervalles sont [a-z] ou [A..Z]
L'assemblage est possible : [0-9a-zA-Z] c'est le tout
Voir le fonctionnement des REGEXP pour plus d'infos.
Posté : 30 avr. 2007, 13:04
par djtec
Donc je dois faire comme ça
mes liens
Code : Tout sélectionner
<a href="tri.php?categorie='.$categorie.'®=0-9">0-9</a> <a href="tri.php?categorie='.$categorie.'&letter=A">A</a>
je recupere les données
$categorie = $_GET['categorie'];
$letter = $_GET["letter"];
$reg = $_GET["reg"];
ma requete sql
$sql = "SELECT DISTINCT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM `".$prefixe."_articles` WHERE id='".$categorie."' AND `titre` REGEXP '^[".$reg."]' LIKE '".addslashes($letter)."%' AND valide!='non'";
Car normalement s'il detect le regxep et pas le letter il fonctionnera
Posté : 30 avr. 2007, 13:20
par sadeq
Non tu as une erreur de syntaxe, LIKE et REGEXP sont 2 conditions distinctes.
Mais tu peux te passer de LIKE quand tu utilise REGEXP car ce dernier peut faire ce que fait LIKE.
Pour confondre les [0-9] et les lettres, tu utilises le même parametre.
Un indice:
% dans LIKE est équivalent dans REGEXP à .*
Posté : 30 avr. 2007, 13:26
par djtec
Donc je dois faire ceci alors
$sql = "SELECT DISTINCT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM `".$prefixe."_articles` WHERE id='".$categorie."' AND `titre` REGEXP '^[".$letter."]' AND valide!='non'";