Script qui tourne pas rond [ Double insertion dans bdd ]

gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Dernière intervention 1 novembre 2007 - 4 août 2007 à 04:01
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Derniè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"

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

Utilisateur anonyme
4 août 2007 à 12:11
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.
à+
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Dernière intervention 1 novembre 2007
4 août 2007 à 17:18
que veux tu dire par là je ne comprends pas dsl.
0
Utilisateur anonyme
4 août 2007 à 17:24
L'erreur ne vient pas probablement pas du bout de code que tu nous montres, cherche ailleurs.
à+
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Derniè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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Derniè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) ?

merci d'avance pour vos réponses
0
Utilisateur anonyme
4 août 2007 à 17:48
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.
à+
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Dernière intervention 1 novembre 2007
4 août 2007 à 17:53
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.
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Dernière intervention 1 novembre 2007
4 août 2007 à 17:58
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.
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Derniè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

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 ?
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Derniè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");

//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 !!!
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Dernière intervention 1 novembre 2007
4 août 2007 à 18:59
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 ...
0
Utilisateur anonyme
4 août 2007 à 20:36
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.
0
gregorybts Messages postés 30 Date d'inscription dimanche 10 juin 2007 Statut Membre Dernière intervention 1 novembre 2007
4 août 2007 à 21:27
non mais sa j'ai bien compris pour l'auto increment. mais le problème reste le même : double insertion.
0
Rejoignez-nous