Problème de resquette avec like

aurélien69
Invité n'ayant pas de compte PHPfrance

24 août 2007, 14:10

Bonjour,

J'ai une base de données sur laquelle je veux effectuer un tri en fonction de la date et l'heure.

Voici la requette que je dois effectuer

-selectionner tous les champs pour lequels DATETIME finit soit par "00:20" soit par "00:40" entre la date $datedepart et la date $datearrivee.

Voici ma requette :

Code : Tout sélectionner

$sql ="select* FROM `station` WHERE DATETIME>='$_GET[depart]:00' AND DATETIME<='$_GET[arrivee]:00' AND DATETIME LIKE '%00:20' AND DATETIME LIKE '%00:40' ORDER BY DATETIME LIMIT $_GET[limitedeb], $limite";


Là ca ne marche pas car comme il comprend que DATETIME doit terminer par 00:20 et 00:40 en même temps ce qui est impossible.

Voici la même chose avec un OR :

Code : Tout sélectionner

$sql ="select* FROM `station` WHERE DATETIME>='$_GET[depart]:00' AND DATETIME<='$_GET[arrivee]:00' AND DATETIME LIKE '%00:20' OR DATETIME LIKE '%00:40' ORDER BY DATETIME LIMIT $_GET[limitedeb], $limite";
Avec ce OR, il me selectionne aussi les données qui sont hors de mon interval $datedepart $datearrivee.

Que faut il faire?

Eléphant du PHP | 193 Messages

24 août 2007, 14:23

Salut Aurélien,

essaie dans le mesure du possible de soumettre du SQL pur, genre en affichant la requête générée avec un
echo $sql;
Je crois que c'est plus simple.

En tout cas, essaie ça:

Code : Tout sélectionner

select* FROM `station` WHERE (DATETIME>='$_GET[depart]:00' AND DATETIME<='$_GET[arrivee]:00' ) OR DATETIME LIKE '%00:20' OR DATETIME LIKE '%00:40' ORDER BY DATETIME LIMIT $_GET[limitedeb], $limite"

Aurélien69
Invité n'ayant pas de compte PHPfrance

24 août 2007, 15:05

Non, celà me selectionne les dates finissant par 00:20 et 00:40 HORS de mon intervalle de temps voulu :shock:

aurélien69
Invité n'ayant pas de compte PHPfrance

24 août 2007, 15:13

C'est résolut, voici la solution :

Code : Tout sélectionner

select* FROM `station` WHERE DATETIME>='$_GET[depart]:00' AND DATETIME<='$_GET[arrivee]:00' AND (DATETIME LIKE '%00:20' OR DATETIME LIKE '%00:40' ) ORDER BY DATETIME LIMIT $_GET[limitedeb], $limite"
Suffisais que je mette les parenthèses au bon endroit !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 août 2007, 15:19

Conseil qui te permettra d'éviter des erreurs inutiles et camouflée :
Sort tes variables des chaines et encadres les indexs de tes tableaux par des quotes
$sql = "SELECT *
		FROM station
		WHERE 
			DATETIME >= '". $_GET['depart'] .":00' 
			AND DATETIME <= '". $_GET['arrivee'] .":00'
			AND (	DATETIME LIKE '%00:20' 
					OR DATETIME LIKE '%00:40' )
		ORDER BY 
			DATETIME LIMIT ". $_GET['limitedeb'] .", ".	$limite;
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 193 Messages

24 août 2007, 15:30

Non, celà me selectionne les dates finissant par 00:20 et 00:40 HORS de mon intervalle de temps voulu :shock:
Excuse-moi, j'avais mal compris:

Code : Tout sélectionner

select* FROM `station` WHERE DATETIME>='$_GET[depart]:00' AND DATETIME<='$_GET[arrivee]:00' AND (DATETIME LIKE '%00:20' OR DATETIME LIKE '%00:40' ) ORDER BY DATETIME LIMIT $_GET[limitedeb], $limite"
Sinon j'ai un petit doute, mais essaie ça aussi, c'est peut-être plus clair comme code

Code : Tout sélectionner

select* FROM `station` WHERE DATETIME BETWEEN '$_GET[depart]:00' AND '$_GET[arrivee]:00' AND (DATETIME LIKE '%00:20' OR DATETIME LIKE '%00:40' ) ORDER BY DATETIME LIMIT $_GET[limitedeb], $limite"
Fais aussi attention au choix des noms de tes colonnes, datetime peut être un mot réservé.

[Edit: owned]