Page 1 sur 1

non rerspect de la condition dans UPDATE

Posté : 13 nov. 2006, 15:46
par fiatt
Bonjour.

J'ai un soucis avec une variable intégrée à une requète sql.

Lorsque je lance la commande:
UPDATE habitations SET qtt_poss = qtt_poss + 1, date_fin = '' WHERE id_joueur = '20' AND TIMESTAMPDIFF( SECOND, CURRENT_TIMESTAMP(), TIMESTAMP( date_fin )) < '0' AND date_fin != '0000-00-00 00:00:00'


dans mon gestionnaire de base de donnée alors tout se passe comme prévu. cad le calcul TIMESTAMPDIFF se fait correctement et la condition < '0' est respectée.

Maintenant j'intègre cette requète dans mon script de cette manière:
TIMESTAMP( date_fin )
devient
TIMESTAMP( '" . $assoc['date_fin'] . "' )
et
id_joueur = '20'
devient
WHERE id_joueur = '" . $_SESSION['id_joueur'] . "'
Ce qui fait:
while ($assoc = mysql_fetch_assoc ($result))
	{
		//CONSTRUCTION TERMINEE: METTRE A JOUR LES POSSESSIONS ET LES PLACES MAX/DISPO
		$sql2 = " UPDATE habitations SET qtt_poss = qtt_poss + 1, date_fin = '' WHERE id_joueur = '" . $_SESSION['id_joueur'] . "' " .
		"AND TIMESTAMPDIFF( SECOND, CURRENT_TIMESTAMP(), TIMESTAMP( '" . $assoc['date_fin'] . "' )) < '0' AND date_fin != '0000-00-00 00:00:00' " ;
		$result2 = mysql_query($sql2) or die(mysql_error());
	}
Et c'est le drame.
La condition de l'id_session est respectée, pas de soucis à ce niveau là.
Par contre l'UPDATE se fait sans tenir compte de la condition TIMESTAMPDIFF() < '0' alors je suppose que l'erreur viens de
TIMESTAMP( '" . $assoc['date_fin'] . "' )
qui est la seule différence...
C'est pourtant la même syntaxe que
id_joueur = '" . $_SESSION['id_joueur'] . "'
Cela peut-il être du à la boucle WHILE? Pourtant je fais un UPDATE sur le champs date_fin en le mettant à '0000-00-00 00:00:00' (qui d'ailleurs s'effectue correctement) pour qu'il ne soit pas re-selectionner...

Posté : 13 nov. 2006, 15:57
par zeus
Est-ce que tu as essayé d'afficher la requête générée pour voir si elle est bien valide par rapport à ce que tu t'attends à voir :?:

Posté : 13 nov. 2006, 16:04
par fiatt
je ne sais pas trop ce que tu veux dire mais la requète fonctionne très bien dans eskuel (mon gestionnaire de BDD).

Il y a un moyen de faire afficher la requète complète dans la page html?

Posté : 13 nov. 2006, 16:15
par albat
tout simplement :
$req = "UPDATE ...";
echo "La requête générée est : ",$req;

Posté : 13 nov. 2006, 16:24
par fiatt
ok voici les requêtes:

La requête générée est : UPDATE habitations SET qtt_poss = qtt_poss + 1, date_fin = '' WHERE id_joueur = '20' AND (TIMESTAMPDIFF( SECOND, CURRENT_TIMESTAMP(), TIMESTAMP( '2006-11-13 10:00:00' )) < '0') AND date_fin != '0000-00-00 00:00:00' La requête générée est : UPDATE habitations SET qtt_poss = qtt_poss + 1, date_fin = '' WHERE id_joueur = '20' AND (TIMESTAMPDIFF( SECOND, CURRENT_TIMESTAMP(), TIMESTAMP( '2006-11-14 10:00:00' )) < '0') AND date_fin != '0000-00-00 00:00:00'

Posté : 13 nov. 2006, 16:29
par albat
:!: L'opérateur comparitif de différence s'écrit...
  • != en PHP
  • <> en SQL

Posté : 13 nov. 2006, 16:35
par fiatt
le résultat reste inchangé en remplacant != par <> car les 2 solutions sont utilisables (d'apres mon livre MySql qui n'est certes pas tout jeune).
De plus la condition qui n'est pas respectée est le calcul temprel TIMESTAMPDIFF.

Posté : 13 nov. 2006, 17:52
par pascaltje
je vois des différences:
_ les parentheses en plus autour de la condition TIMESTAMPDIFF
_ la condition TIMESTAMPDIFF, qui se fait sur une chaine avec la valeur de la date, au lieu de se faire sur le champ date date_fin

ce qui fait comme différence:
_ requete directe: on met à jour les lignes remplissant la condition
_ requete dans le PHP: on vérifie une condition pour chaque ligne ( apparemment, car les données correspondent à quelle requete? ) et on met éventuellement à jour

bon débuggage!

A+

Pascal

Posté : 13 nov. 2006, 20:13
par fiatt
J'ai finalement modifier l'approche et du coup mes requêtes sont différentes.
De ce fait il n'y a plus de problème!

Je sais ce n'est pas en évitant le problème que l'on va le résoudre mais pour le coup la nouvelle version du script est plus efficace et moins lourde.

Merci de votre aide.

Je mets RESOLU dans le titre du sujet mais si quelqun connait la solution je serais quand même intéressé.