Script qui tourne pas rond [ Double insertion dans bdd ]
gregorybts
Messages postés30Date d'inscriptiondimanche 10 juin 2007StatutMembreDernière intervention 1 novembre 2007
-
4 août 2007 à 04:01
gregorybts
Messages postés30Date d'inscriptiondimanche 10 juin 2007StatutMembreDernière intervention 1 novembre 2007
-
4 août 2007 à 21:27
Bonsoir,
cela fait 2 jours que je planche sur un problème et je ne m'en sors pas alors je viens chercher de l'aide.
En fait, j'ai fais une sorte de messagerie en php. Je m'explique. En ce moment, j'écris au moyen d'animation flash à quelqu'un et je veux que la personne ne puisse lire l'animation qu'une seule fois. J'ai donc ma page qui controle si l'IP a déjà lu ce message ou pas (je sais que se baser juste sur l'ip est une erreur mais le destinataire est noob). Je communique donc un mot au destinataire et en le rentrant il est redirigé.
En même temps, plusieurs choses viennent compliquer l'affaire. En ajoutant "admin_" devant le mot que j'ai communiqué, on passe au travers de tous les filtres (je m'en sers pour tester). Autre complication, je retiens dans la bdd (ip + mot entré) toutes les tentatives d'accès (réussie ou pas).
J'ai fais énormément de test et il y a donc des echo partout pour tracer les données.
En entrant le mot "test" qui ne correspond à aucun message, il s'affiche ceci "
27Non, non, faut pas rentrer n'importe quoi"
Et oui 2 enregistrements et c'est bien sa qui me fait perdre la boule.
Bon maintenant que je pense avoir bien expliquer voici le code surnaturel.
Merci d'avance aux courageux qui me répondront.
<?php
//Connexion
mysql_connect("localhost", "root", "") or die("erreur de connexion au serveur");
mysql_select_db("correspondance") or die("erreur de connexion a la base de donnees");
//Déclaration de variables
$mot=$_POST['mdp'];
$visiteur=$_SERVER['REMOTE_ADDR'];
$buffer=substr($mot, 0, 6);
if ($buffer=="admin_")
{
echo "1";
$mot=substr($mot, 6, strlen($mot));
$reponse = mysql_query("SELECT cle FROM lettres WHERE mot='".$mot."'") or die ("oups erreur de prog");
$donnees = mysql_fetch_array($reponse) or die ("LOL, c'est pas parce que tu connais la manip qu'il faut essayer tous les mots, c'est pas un dico le truc");
?>
<?php /*?><script language="javascript">
document.location.href="<?php echo 'cle/'.$donnees['cle'].'.html';?>";
</script><?php */?>
<?
}
else
{
echo "2";
$deja_visite=0;
$existe=0;
$reponse = mysql_query("SELECT * FROM lettres WHERE lettres.mot='".$mot."'") or die ("ERREUR requete 1");
if(mysql_num_rows($reponse))
{
echo "3";
$existe=1;
$donnees = mysql_fetch_array($reponse, MYSQL_ASSOC);
$reponse2 = mysql_query("SELECT * FROM vu WHERE vu.lettre='".$mot."'") or die ("ERREUR requete 2");
if(mysql_num_rows($reponse2))
{
echo "4";
while ($donnees2 = mysql_fetch_array($reponse2, MYSQL_ASSOC))
{
echo "5";
if ($donnees2['user']==$visiteur)
{
echo "6";
$deja_visite=1;
echo "Non, non, toutes les bonnes choses ont une fin.";
mysql_query("INSERT INTO vu VALUES('', '".$visiteur."', '".$mot."')") or die ("ERREUR à l'ajout");
}
}
}
}
else
{
echo "7";
echo "Non, non, faut pas rentrer n'importe quoi";
mysql_query("INSERT INTO vu VALUES('', '".$visiteur."', '".$mot."')") or die ("ERREUR à l'ajout");
echo mysql_info();
}
if (($deja_visite==0)&&($existe==1))
{
echo "8";
mysql_query("INSERT INTO vu VALUES('', '".$visiteur."', '".$mot."')") or die ("ERREUR à l'ajout");
gregorybts
Messages postés30Date d'inscriptiondimanche 10 juin 2007StatutMembreDernière intervention 1 novembre 2007 4 août 2007 à 17:27
c'est bien ce que je pensais, alors là j'ai un gros soucis parce qu'au dessus de ce bout de code c'est le css et le header html, au dessous rien du tout. Et je n'ai que 4 fichiers, dont seulement 2 fichiers php donc je peux te dire que cela ne peut pas venir d'autre chose.
Sa me fait halluciner ce truc.
Vous n’avez pas trouvé la réponse que vous recherchez ?
gregorybts
Messages postés30Date d'inscriptiondimanche 10 juin 2007StatutMembreDernière intervention 1 novembre 2007 4 août 2007 à 17:47
j'ai trouvé lol. Accrochez vous
sans toucher à la requete insert incriminé,
si dans ma base id de la table vu est en autoincrement => ajout de 2 enregistrements
si il est pas en auto increment = > ajout de 1.
Alors là, j'hallucine parce que c'est la première fois que cela m'arrive surtout que j'utilise tout le temps les auto increment.
Du coup, je suis un peu perdu niveau code. Je cherche à récupérer l'id que je devrais mettre dans mon insert. En fait, c'est "id la plus haute+1" mais n'y a t'il pas un autre moyen que de faire un select pour chopper la MAX(id) ?
Mmmh... le meilleur conseil dans ces cas-là c'est de refaire les tests en reprenant à 0.
Vide ta table à chaque test et mets les requêtes en commentaires une par une jusqu'à ce que tu trouves d'où ça vient.
à+
gregorybts
Messages postés30Date d'inscriptiondimanche 10 juin 2007StatutMembreDernière intervention 1 novembre 2007 4 août 2007 à 18:13
Il y a 3 possibilités de passer par un insert into dans ce code, soit :
<li>le mot ne correspond aucun message</li><li>le mot correspond à un message qui n'a pas été lu par cette ip</li><li>le mot correspond à un message qui a déjà été lu par cette ip</li>J'ai testé les 3 cas possibles. Les résultats sur la base ont mis en évidence que le problème venait de celle ci :
else
{
echo "7";
echo "Non, non, faut pas rentrer n'importe quoi";
mysql_query("INSERT INTO vu VALUES('', '".$visiteur."', '".$mot."')") or die ("ERREUR à l'ajout");
}
Moi je ne vois pas ou est le problème. Donc si je mets cet insert en commentaire et que je fais le jeu de test suivant : bon_mot, bon_mot, mauvais_mot
gregorybts
Messages postés30Date d'inscriptiondimanche 10 juin 2007StatutMembreDernière intervention 1 novembre 2007 4 août 2007 à 18:38
comme je le disais, j'ai 2 fichiers php et bien voici le deuxième qui lui aussi me fait de la double insertion.
<?
//Connexion
mysql_connect("localhost", "root", "") or die("erreur de connexion au serveur");
mysql_select_db("correspondance") or die("erreur de connexion a la base de donnees");
Normalement quand tu mets un auto-increment, c'est pour que tu n'aies plus jamais à t'occuper toi-même de la valeur à mettre dans ce champ. Donc soit tu enlèves l'auto-increment, soit tu n'essaies pas de mettre toi-même certaines valeurs, ça devrait régler ton pb non ? Je ne peux pas dire gd-chose de plus sur ton problème, je ne connais pas assez ton code et ce que tu veux faire.