problème avec une requete

Eléphant du PHP | 417 Messages

04 mai 2012, 08:56

bonjour

j'ai une table dans la quel y a un champ dateFin de type date exemple (2012-03-26 12:35:24)
et je veux afficher tous les enregistrement dans cette table dont la date de jour est inférieur a la date de fin donc je fait un truc de ce genre

$dateActuelle= date('Y-m-d H:i:s'); // résultat de $dateActuelle sera donc pour ce moment 2012-05-04 08:54:21
$req = mysql_query('SELECT * FROM price WHERE dateFin < "'.$dateActuelle.'" ')or die(mysql_error());

et ça me donne cette erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dateFin < "2012-03-26 12:35:24"' at line 1

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 mai 2012, 09:13

salut,

pour ta requête tu peux directement demande à mysql d'utiliser la date du jour (attention faut que le serveur mysql et le serveur soit à la même date et à la même heure :) ).

SELECT * FROM price WHERE dateFin < now();

après faut tu affiche ta requête pour que l'on y voit plus clair :)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 417 Messages

04 mai 2012, 09:15

j'ai fait ce que tu m'as demandé mais tjr meme erreur

$req = mysql_query('SELECT * FROM ps_specific_price WHERE to < now() ')or die(mysql_error());
echo $req;

et le echo $req ne donne rien vu que y a une erreur avant je pense

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 mai 2012, 09:27

déja on n'arrete pas une script a cause d'une requete c'est pas beau.
Il faut l'afficher correctement.

j'en profite pour t'indiquer que le die sert à "tuer" le script il s'arrete en affichant ce qui est passé en paramètre c'est tout.
donc tu vire le die et test le retour du mysql_query si c'est === false tu affiche proprement le message d'erreur
par exemple
<?php
$ret = mysql_query($sql);
if ($ret === false){
echo 'Erreur SQL '.mysql_error().'<br />Avec la requête '.$sql;
}
?>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 417 Messages

04 mai 2012, 09:43

Dac donc ta méthode a donné ça

Erreur SQL You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dateFin < now()' at line 1
Avec la requ�te SELECT * FROM price WHERE dateFin < now()

Eléphant du PHP | 417 Messages

04 mai 2012, 11:41

j'ai toujours pas trouvé l'erreur :s

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 mai 2012, 19:26

Euh... ta table s'appelle "price" ou "ps_specific_price" ? et ton champ s'appelle "dateFin" ou "to" ? parce que ça ne peut pas marcher si tu n'utilises pas les bons noms...

Pour débugger plus facilement ta requête, si le message d'erreur indique une erreur au niveau de 'dateFin < now()', c'est que le problème est situé juste avant dateFin dans ta requête... y manquerait pas un espace entre le WHERE et le champ ? ou un truc du genre...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 417 Messages

06 mai 2012, 22:34

Euh... ta table s'appelle "price" ou "ps_specific_price" ? et ton champ s'appelle "dateFin" ou "to" ? parce que ça ne peut pas marcher si tu n'utilises pas les bons noms...

Pour débugger plus facilement ta requête, si le message d'erreur indique une erreur au niveau de 'dateFin < now()', c'est que le problème est situé juste avant dateFin dans ta requête... y manquerait pas un espace entre le WHERE et le champ ? ou un truc du genre...

enfait c'est deux erreurs avec deux requete l'une avec la table price et l'autre avec ps_specific_price ^^

mais pour le moment on peut débugger d'abord une après je ferai la même chose pour l'autre

donc voila ma requête est SELECT * FROM ps_specific_price WHERE to < now(); y a bien un espace entre WHERE et le champ

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 mai 2012, 00:09

Ok, alors pour celle-ci, ton problème vient du fait que "TO" est un mot clé réservé de mysql, et comme tu t'en sers comme nom de colonne il est un peu perdu :)

Le mieux serait de renommer ta colonne pour lui donner un nom qui ne soit pas une commande sql, mais à défaut MySQL tolère le fait d'utiliser des ` pour lui dire qu'il s'agit bien du nom d'une colonne et non d'une instruction à exécuter :
SELECT * FROM ps_specific_price WHERE `to` < now();
Ca dépanne, m'enfin ça vaudra jamais le fait de bien nommer ses tables et ses colonnes ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 417 Messages

07 mai 2012, 08:47

merci pour les infos de plus que tu m'as donné aujourd'hui ^^

mais le problème de changer le nom de colonne va rendre mon projet un peu bordel enfait je travaille sur prestashop donc la BDD c'est eux qui l'ont fait et
mais j'ai essayé ta methode on utilisent des 'to' et ça marche j'ai plus l'erreur mais les résultat ils sont pas bonne
ex : dans ma table j'ai 3 lignes et dans la colonne qui ne concerne 'to' j'ai

2012-05-01 10:16:21
2012-05-06 10:02:05
2012-05-09 08:20:30

donc quand je met dans la requete
SELECT * FROM ps_specific_price WHERE `to` < now();
avec ce script
$req = "SELECT * FROM ps_specific_price WHERE 'to' < now(); ";
	$ret = mysql_query($req);
	$nb = mysql_num_rows($ret);
	if ($ret === false){
		echo 'Erreur SQL '.mysql_error().'<br />Avec la requête '.$req;
	}else
		echo 'nb resultat : '.$nb;
la résultat qui m'affiche c'est : nb resultat : 0
alors que dans la bdd y a bien deux lignes ou 'to' < now()

et quand je modifier la requete et je met > a la place de <

nb resultat : 3 (les 3 enregistrement de ma table alors que comme vous le voyez y a qu'un enregistrement ou la date de 'to' est > de now()

:s la function now() renvoie bien une valeur de aaaa-mm-jj hh:mm:ss ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 mai 2012, 10:49

Attention, ce n'est pas l'apostrophe classique qu'il faut utiliser " ' " (placé sur le 4 du clavier) et qui permet de délimiter des chaines de caractères, mais l'apostrophe oblique " ` " (que tu obtiens en faisant AltGr+7) qui te permettra de protéger le nom des tables et des colonnes dans MySQL :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 417 Messages

07 mai 2012, 11:02

ah j'ai jamais entendu parler de cette apostrophe ^^ ça marche trés bien maintenant :) merci beaucoup

juste une amélioration a ma requête le champ 'to' est de type DATETIME aaaa-mm-jj hh:mm:ss

et je souhaiterai récupérer que la partie aaaa-mm-jj donc j'ai trouvé sur le site de zero la méthode suivante :
$req = "SELECT id_product, DAY(to) AS jour, MONTH(to) AS mois, YEAR(to) AS annee FROM ps_specific_price WHERE `to` > now(); ";
mais quand je l'utilise ça me donne le message d'erreur suivant :

Erreur SQL You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'to) AS jour, MONTH(to) AS mois, YEAR(to) AS annee FROM ps_specific_price WHERE `' at line 1

y a t il une méthode plus facile pour récupérer la partie que je veux ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 mai 2012, 18:49

Le problème est le même, "to" reste un mot clé réservé MySQL qu'il soit placé dans le SELECT ou dans le WHERE. Il te faut donc des `to` partout pour qu'il soit considéré comme un nom de colonne :)

Quant à faire plus simple, tu peux utiliser la fonction MySQL "DATE_FORMAT()" qui va te permettre de transformer ta date en chaine de caractères et d'obtenir le format que tu veux (par exemple : '%d/%m/%Y pour obtenir ta date au format 07/05/2012 :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 417 Messages

14 mai 2012, 08:38

Merci Ryle :)