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.
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;<?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.
PS : Je ne savais pas trop où poster... J'espère ne pas m'être trompé... sinon, ben mille pardon !