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"]

Code : Tout sélectionner

<a href="tri.php?letter=A">A</a>
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

Code : Tout sélectionner

<a href="tri.php?categorie='.$categorie.'&letter=A">A</a>
'.$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 8-)

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

Code : Tout sélectionner

tri.php?categorie=1&letter=0-9
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:

Code : Tout sélectionner

SELECT * FROM ma_table WHERE champ REGEXP '[0-9]'
Cherche les enregistrements où "champ" contient un numérique (intervalle [0-9]) n'importe où.

Avec la variante

Code : Tout sélectionner

WHERE champ REGEXP '^[0-9]'
La recherche se limite aux valeurs commençant (^) par un numérique

La variante:

Code : Tout sélectionner

WHERE champ REGEXP '[0-9]$'
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.'&reg=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'";