Script qui tourne pas rond [ Double insertion dans bdd ]

Signaler
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007
-
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007
-
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"

Le chemin est donc parfait mais dans la base voici ce que je récupère :
<gras>http://127.0.0.1/..., http://127.0.0.1/..., 34, 127.0.0.1,  

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");
                
        ?>
        <?php /*?><script language="javascript">
        document.location.href="<?php echo 'cle/'.$donnees['cle'].'.html';?>";
        </script><?php */?>
        <?
    }
}
mysql_close();
?>

13 réponses

Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Hello, ce serait pas 'cle/'.$donnees['cle'].'.html qui te ferait la requête ? vu que ce morceau de code ne semble pas être fautif.
à+
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

que veux tu dire par là je ne comprends pas dsl.
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
L'erreur ne vient pas probablement pas du bout de code que tu nous montres, cherche ailleurs.
à+
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

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.
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

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) ?

merci d'avance pour vos réponses
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
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.
à+
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

non mais c'est bon, le problème est trouvé, c'est l'histoire de l'auto increment. Je pense que nos messages se sont croisés.
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

oups j'ai parlé trop vite, en fait il n'y a rien de règlé.

Cela marchait car quand j'enlevais l'autoincrement, defaut se mettait à 0 et du coup le doublon venait écrasé le premier.

Donc non, cela ne marche pas, j'y retourne. Je vais les commenter une à une mais je crois que je l'ai déjà fait.
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

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

Ce m'enregistre ceci :

<gras>http://127.0.0.1/..., http://127.0.0.1/..., 62, 127.0.0.1, bon_mot

Normal. Si je commente un autre insert et remet ce dernier en marche, je me retrouve avec 4 ou 5 résultats avec le même jeu d'essai.

Quelqu'un a la solution ?
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

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");

//Déclaration de variables
$mot=$_POST['mdp'];

$taille=10;
$nombres = '2536147098';
$lettres = 'efgdr';

$password = '';
$alt = time() % 2;
srand(time());
for ($i = 0; $i < $taille; $i++)
{
    if ($alt == 1)
    {
        $password .= $lettres[(rand() % strlen($lettres))];
        $alt = 0;
    }
    else
    {
        $password .= $nombres[(rand() % strlen($nombres))];
        $alt = 1;
    }
}
mysql_query("INSERT INTO lettres VALUES('".$mot."', '".$password."') ") or die ("ERREUR à l'ajout");

$fichier = "cle/".$mot.".html";
rename($fichier,"cle/".$password.".html");
?>
<script language="javascript">
        alert("fichier renomé en <?php echo $password.'.html';?>");
</script>

AU SECOURS !!!
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

re,

désespéré j'ai installé WAMP à la place d'Easy PHP et WAMP me sort sa :

Parse error: syntax error, unexpected $end in C:\wamp\www\correspondance\connexion.php on line 102

102 correspond à la fermeture de la balise html, c'est donc un problème d'accolade ou de ; manquants mais j'ai vérifié 3 fois et rien ne cloche !!!

Pleaz ...
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
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.
Messages postés
30
Date d'inscription
dimanche 10 juin 2007
Statut
Membre
Dernière intervention
1 novembre 2007

non mais sa j'ai bien compris pour l'auto increment. mais le problème reste le même : double insertion.