Clause WHERE LIKE

cdie Messages postés 31 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 12 février 2012 - 25 févr. 2010 à 15:37
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 27 févr. 2010 à 09:50
Bonjour,
J'essaye activement de faire fonctionner un clause LIKE pour récuperer un nombre de ligne avec le code suivant :
		
$tab = explode("/",date("d/m/Y",time()));
$mois = $tab[1];
$an=$tab[2];
$filtre = "$mois/$an";
$data=mysql_query("SELECT * FROM tachat WHERE pseudo = '$_SESSION[pseudo]' AND date LIKE '%$filtre%'") or die(mysql_error());
$nombre = mysql_fetch_row($data);

mais malheureusement $nombre ne contient rien ...
Quelqu'un peut-il m'éclairer ?

Merci d'avance


 

5 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
25 févr. 2010 à 19:57
Salut,


Quel est le type de champ de date ?

Attention a ne pas utiliser de mots réservés comme date !!
Tu devrais renommer ce champ, ou alors mets le entre `

Pourquoi passer par PHP pour les dates alors que tu peux le faire dans la requête SQL ?
SELECT * FROM tachat WHERE MONTH(date_renommee) LIKE MONTH(NOW());


Cordialement,

Kohntark -
0
cdie Messages postés 31 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 12 février 2012 2
25 févr. 2010 à 20:20
Salut à toi,
C'est vrai que j'ai pas pensé à mon nom de colonnes, je le change.
Aussi, j'ignorais que ça marchait comme ça en SQL. Merci pour cet eclaircissement. Y a-t-il un moyen d'avoir l'année avec ?



 
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010
26 févr. 2010 à 01:40
Bonjour,

Puisque tu en es à l'optimisation, tu peux aussi enlever le "or die()" et mettre en place une vraie gestion d'erreur. Le die(mysql_error()); c'est non seulement moche mais en plus c'est une faille de sécurité (des infos sur ton serveur et ta db pourraient bien s'afficher à l'écran).

Pour l'année, il y a tout bêtement une fonction YEAR() en MySql (et DAY() pour le jour si ça t'intéresse).

Pour ton script plus haut, le problème venait probablement du fait que tu met le mois avant l'année et que tu utilise le slash comme séparateur. En mettant $an.'-'.$mois tu devrais mieux t'en sortir. Tu peux aussi te passer du 1er '%' dans le filtre puisqu'il ne peut rien y avoir avant.

Pour finir, je te conseil d'utiliser php plutôt que MySql, une requête ou il n'y a pas d'appel à des fonctions est forcement plus rapide qu'une ou il y a des fonction. En plus, l'utilisation de NOW() empêche l'utilisation de la cache MySql.


Grrrrrrrrrrr
0
cdie Messages postés 31 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 12 février 2012 2
26 févr. 2010 à 08:18
Salut,
Le die(mysql_error()) me sert surtout à moi, pour débugguer. Je l'enlève généralement de mes pages une fois que le débuggage est fait.

Aussi, merci de ta réponse au sujet des fonctions mysql.
Je stocke la date dans ma BDD sous la forme d'un varchar et la date d'hier était stockée comme 25/02/2010. L'explode me semblait donc justifié. Mais malheureusement, il n'arrive pas sélectionner les lignes de date du mois encours de cette année ...

Merci quand même pour ta réponse :)


 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
27 févr. 2010 à 09:50
@Cdie :
Stocker une date dans un VARCHAR est à mon sens une grosse erreur, il y a le type date pour cela.
Tu gagneras un temps précieux à l'utiliser. La requête que je te proposais ne fonctionnera pas avec un VARCHAR (désolé d'avoir oublié l'année, Gibozsec a apporté l'info)

@gibozsec :
Pour finir, je te conseil d'utiliser php plutôt que MySql, une requête ou il n'y a pas d'appel à des fonctions est forcement plus rapide qu'une ou il y a des fonction. En plus, l'utilisation de NOW() empêche l'utilisation de la cache MySql.

=> pour le coup certainement, encore que ça ne soit pas gagné, surtout avec l'utilisation de 3 fonctions PHP + l'assignation aux variables.
De toute façon ça doit être négligeable et il reste difficile de se faire une idée là dessus sans connaitre le contexte (structure de la DB, taille de la table, fréquence des appels, etc ...)

Autre point sur lequel j'ai un gros doute, c'est la mise en cache d'une requête sur une date avec un joker.
Il me semble, mais je n'en suis pas certain, que le moteur mySQL mettra en cache un "LIKE '2010-02-27'" mais pas un "LIKE '2010-02-%'" ... à tester.

Bref, je préfère intégrer le traitement en SQL, je trouve cela plus "propre", mais c'est une question de goût.

Selon moi l'optimisation n'est pas qu'une question de rapidité d'exécution, mais également de lisibilité du code, de réutilisation, etc ... etc ... quitte à perdre qq centièmes.

Si l'on voulait réellement optimiser :
$tab = explode("/",date("d/m/Y",time()));
$mois = $tab[1];
$an=$tab[2];
$filtre = "$mois/$an";
$data=mysql_query("SELECT * FROM tachat WHERE pseudo = '$_SESSION[pseudo]' AND date LIKE '%$filtre%'") or die(mysql_error());
$nombre = mysql_fetch_row($data);

en bleu :
c'est totalement inutile de procéder ainsi, autant mettre un date('Y') et un date('m') directement dans la requête et supprimer ces lignes.

en orange :
les fonctions mysql_* sont dépassées, mieux vaut utiliser PDO ou mysqli.

en rouge :
Ne vaut il pas mieux sélectionner les champs dont tu as réellement besoin ? (c'est peut être déjà le cas ?)

+ ce qui a déjà été dit concernant le premier % et le die.

Par ailleurs le nom de ta variable $nombre laisse penser à d'autres pbs.
Que souhaites tu faire au juste ?


Cordialement,

Kohntark -
0
Rejoignez-nous