UPDATE qui ne fonctionne pas tout le temps

Eléphant du PHP | 71 Messages

09 avr. 2007, 16:37

Hello,

Voilà bien quelques heures que je cherche sans trouver quel est le problème :(

Je me suis fait un petit formulaire pour insérer des commentaires... ça marche mais il y a quelques bugs... Par exemple, lorsqu'un utilisateur n'indique pas son site sur le premier commentaire et qu'il souhaite l'indiquer par la suite, je cherche à mettre les données de l'utilisateur à jour. Au premier coup, ça marche mais plus sur les suivants. :? J'ai beau retourner le problème dans tous les sens, rien à faire... ça veut pas...

Quelqu'un pourrait-il me dire ce qui peut engendrer ça ?

En gros, j'ai trois tables innoDB avec des clés étrangères... celle que je souhaite mettre à jour est celle-ci :

Code : Tout sélectionner

CREATE TABLE utilisateurs ( email VARCHAR(128) NOT NULL PRIMARY KEY, identifiant VARCHAR(60) NOT NULL, site VARCHAR(128) NOT NULL, ip VARCHAR(30) NOT NULL, navigateur VARCHAR(128) NOT NULL ) type=InnoDB;
et je procède comme suit :
<?php

class Comments
{
       ...

	// Requête de mise à jour de l'utilisateur
	static private $UPDUTIL = 'UPDATE utilisateurs SET email = ?, identifiant = ?, site = ?, ip = ?, navigateur = ?';

	// Requête d'insertion d'utilisateur
	static private $INSUTIL = 'INSERT INTO utilisateurs SET email = ?, identifiant = ?, site = ?, ip = ?, navigateur = ?';

	// Requête d'insertion d'article
	static private $INSART = 'INSERT INTO articles SET titre = ?, auteur = ?';

	// Requêtes d'insertion de commentaire
	static private $INSCOM = 'INSERT INTO commentaires SET msg = ?, cdate = ?, article = ?, auteur = ?';

       .....

	// Insertion d'un commentaire dans la bdd
	private function insComment($db)
	{
		$_SESSION['msg'] = $_POST['msg'];

		$email = Comments::protectToDb($_POST, 'email');
		$identifiant = Comments::protectToDb($_POST, 'identifiant');
		$site = Comments::protectToDb($_POST, 'site');
		$ip = $_SERVER['REMOTE_ADDR'];
		$navigateur = $_SERVER['HTTP_USER_AGENT'];
		$msg = Comments::protectToDb($_POST, 'msg');
		$cdate = str_replace(
			array_keys(Comments::$TABDATE),
			array_values(Comments::$TABDATE),
			date('D d M Y \à H:i:s')
		);
		$titre = 'Optimisation de la navigation d\'un site web';

		$eureka = 'false';

		$reqTest = "SELECT * FROM utilisateurs";
		$stmt = $db->prepare($reqTest);
		if($stmt === false)
			;
		else
		{
			$stmt->execute();
			$stmt->bind_result($tEmail, $tIdentifiant, $tSite, $tIp, $tNavigateur);

			while($stmt->fetch())
				if($tEmail === $email && $tIdentifiant === $identifiant &&
				$tSite != $site || $tIp != $ip || $tNavigateur != $navigateur)
					$eureka = 'true';
		}

		$stmt->free_result();

		if($eureka === 'false')
		{
			$stmt = $db->prepare(Comments::$INSUTIL);
			if($stmt === false)
			{
				echo 'Erreur lors de l\'insertion de l\'utilisateur';
				exit();
			}
			$stmt->bind_param('sssss', $email, $identifiant, $site, $ip, $navigateur);
			$stmt->execute();
		}
		else
		{
			$stmt = $db->prepare(Comments::$UPDUTIL);
			if($stmt === false)
			{
				echo 'Erreur lors de la mise à jour de l\'utilisateur';
				exit();
			}
			$stmt->bind_param('sssss', $email, $identifiant, $site, $ip, $navigateur);
			$stmt->execute();
		}

		$stmt = $db->prepare(Comments::$INSART);
		if($stmt === false)
		{
			echo 'Erreur lors de l\'insertion du titre';
			exit();
		}

		$stmt->bind_param('ss', $titre, $email);
		$stmt->execute();

		$stmt = $db->prepare(Comments::$INSCOM);
		if($stmt === false)
		{
			echo 'Erreur lors de l\'insertion du message';
			exit();
		}

		$stmt->bind_param('ssss', $msg, $cdate, $titre, $email);
		$stmt->execute();

		return $db;
	}

       ......
}

?>
J'ai supprimé quelques parties du code non essentielles pour ne pas faire trop long...

Le but est que si l'utilisateur change de site, d'ip ou de navigateur, celui-ci se mette à jour. Pour cela, je fais une première requête SELECT qui détermine si l'utilisateur existe déjà puis je lance un INSERT ou un UPDATE suivant le résultat du SELECT.

Voilà, ben si quelqu'un peut m'enlever cette épine du pied, je lui en serais très reconnaissant. :wink:


PS : Je ne savais pas trop où poster... J'espère ne pas m'être trompé... sinon, ben mille pardon ! :P

Eléphant du PHP | 71 Messages

10 avr. 2007, 11:38

Hello,

hem... ça ne doit pas être clair... y'a pas foule... :lol:

Quelques précisions supplémentaires...

Lors du premier SELECT, je définis en amont une variable $eureka = 'false'; si aucun utilisateur n'est trouvé que je passe à $eureka = 'true'; si un enregistrement correspond. A priori, le test fonctionne... pas de problème de ce côté.
Lorsque je prépare la requête de mise à jour, ça semble passer aussi (il ne trouve pas d'erreur)... donc apparemment le problème est bien au moment de l'éxécution de la requête... ce que je ne comprend pas trop, l'erreur ne me sautant pas au visage (ou bien alors je n'ai pas les yeux en face des trous...). Comme aucune erreur n'est signalée par PHP, c'est le flou le plus total.

A force, je me demande si je regarde au bon endroit... je n'en suis plus sûr... :?

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

10 avr. 2007, 11:51

Tu as un moyen d'afficher la requête générée ? les chaines spécifiées sont bien délimitées avec des apostrophes ?

C'est normal qu'il n'y ait pas de WHERE pour spécifier quel utilisateur dans ton update ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

10 avr. 2007, 13:47

Tu as un moyen d'afficher la requête générée ? les chaines spécifiées sont bien délimitées avec des apostrophes ?
ben pour afficher la requête générée, je ne vois pas trop comment faire non... :? ... ou peut-être après le $stmt->bind_param(...); ( Je ne sais pas... faut que je teste :wink: )
Je ne pense pas que l'erreur provienne de là parce mes variables $email, $identifiant et $site sont des chaines obtenues à partir de l'envoi ($_POST) de l'utilisateur. $ip et $navigateur sont les chaines renvoyées par les variables $_SERVER['...'].
C'est normal qu'il n'y ait pas de WHERE pour spécifier quel utilisateur dans ton update ?
oups ! maintenant que tu le dis... :oops: je regarde ça... Effectivement, le problème doit venir de là.

Eléphant du PHP | 71 Messages

10 avr. 2007, 21:00

ben c'était bien à cause de l'oubli du WHERE... désolé pour le dérangement donc :lol:

... et merci Ryle. :wink: