non rerspect de la condition dans UPDATE

Eléphanteau du PHP | 28 Messages

13 nov. 2006, 15:46

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...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

13 nov. 2006, 15:57

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 :?:
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éphanteau du PHP | 28 Messages

13 nov. 2006, 16:04

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?

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

13 nov. 2006, 16:15

tout simplement :
$req = "UPDATE ...";
echo "La requête générée est : ",$req;

Eléphanteau du PHP | 28 Messages

13 nov. 2006, 16:24

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'

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

13 nov. 2006, 16:29

:!: L'opérateur comparitif de différence s'écrit...
  • != en PHP
  • <> en SQL

Eléphanteau du PHP | 28 Messages

13 nov. 2006, 16:35

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.

ViPHP
ViPHP | 1024 Messages

13 nov. 2006, 17:52

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

Eléphanteau du PHP | 28 Messages

13 nov. 2006, 20:13

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é.