Probleme de requete

Eléphant du PHP | 451 Messages

30 avr. 2007, 09:47

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 avr. 2007, 10:15

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'";
...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

30 avr. 2007, 10:20

ç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

Eléphant du PHP | 451 Messages

30 avr. 2007, 10:24

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 avr. 2007, 11:02

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"];
....
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

30 avr. 2007, 11:11

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 avr. 2007, 11:17

tout à fait, 10/10 8-)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

30 avr. 2007, 11:26

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

ViPHP
ViPHP | 5924 Messages

30 avr. 2007, 11:31


Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 avr. 2007, 11:37

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 !
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

30 avr. 2007, 11:51

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 avr. 2007, 12:19

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.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

30 avr. 2007, 13:04

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 avr. 2007, 13:20

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 à .*
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 451 Messages

30 avr. 2007, 13:26

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'";