Version complète: sur le forum Webmaster Hub : Pb à l'insertion de données et champ session
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
cktoon
Bonjour à tous,
je suis depuis un moment à essayer de comprendre ce qui se passe lorsque j'envoie une commande d'insertion en bdd et que je me retrouve avec des insertions doublées.
Voilà mon code:
CODE
il s'agit d'ajouter des pdts en BDD dans la table panier_temp, qui contient les champs suivants :
id indexé avec autoincrement
session
ref
prix
soustotal

Si je fais ça :
if(isset($_GET['ajouter'])) {
    $req = mysql_query("SELECT id,ref,prix FROM produits WHERE id='".$_GET['ajouter']."'");
    if(mysql_num_rows($req)) {
        $pdt = mysql_fetch_object($req);
        $req = mysql_query("INSERT INTO panier_temp SET pdt='".$pdt->id."', ref='".$pdt->ref."', prix='".$pdt->prix."', soustotal='".$pdt->prix."'");
    }
}
tout est nickel

Mais j'ai besoin de conserver également l'identifiant de session dans la table, et si je fais ça :
if(isset($_GET['ajouter'])) {
    [b]$session = session_id();[/b]
    $req = mysql_query("SELECT id,ref,prix FROM produits WHERE id='".$_GET['ajouter']."'");
    if(mysql_num_rows($req)) {
        $pdt = mysql_fetch_object($req);
        $req = mysql_query("INSERT INTO panier_temp SET [b]session='".$session."'[/b], pdt='".$pdt->id."', ref='".$pdt->ref."', prix='".$pdt->prix."', soustotal='".$pdt->prix."'");
    }
}
eh bien je me retrouve avec 2 enregistrements identiques en BDD  :wacko:

J'ai vraiment tourné et retourné tout ça pour essayer de comprendre pourquoi mon insertion se doublait....
Vraiment je ne comprends pas....

En mettant un champ date de type timestamp dans la table, je vois apparaitre une seule différence entre les 2 lignes : un écart d'une seconde entre le premier et le deuxième.

Mais qu'est-ce qui se passe ??????
Portekoi
Bonjour,

Un Insert ne peux insérer qu'une seule ligne dans ton cas. il est impossible d'insérer deux lignes en une seule fois (sauf requête imbriquée).

Donc, tu dois appeler deux fois ta page, ou ton script.

Fais un exit; juste après ta requete et vois si tu en as deux.

Si tu en as deux, un script doit faire la même chose smile.gif


Portekoi
cktoon
C'est ce que je croyais : mais dans ce cas, et si l'appel se faisait ailleurs aussi, alors je devrais avoir 2 enregistrements en BDD avec ou sans l'identifiant de session...
Or là je n'en ai 2 que lorsque je met ce paramètre.
Je vais devenir maboule je crois bien sick.gif
Portekoi
Essaie de faire ce que t'ai dis : Mais un exit() juste après.

Si tu en as 2, c'est que sois tu as réinventer le moteur de Mysql, sois tu es dans une boucle sois tu appelles deux fois ta page.

Pas d'autres solutions
.
cktoon
J'ai isolé ma fonction... seule un seul enregistrement.
Je remets le reste du code, j'en ai à nouveau 2.
Mais la fonction n'est pas appellée dans ce reste de code.
Je continue la traque....
cktoon
Apparemment, j'ai vraiment trouvé le truc qui fout la merde.... mais ça reste toujours incompréhensible pour moi là....
J'ai cru que je me mélangeais dans mes objets, vérifié tout...
mais en fait à l'affichage, j'utilise une image et pour l'instant je ne me suis pas occupée de son url.

Dans mes scripts, j'avais donc une balise image avec src="" vide

Et c'est ça qui fout la m.... Mais comment est-ce que ça peut doubler une commande INSERT ???????

en mettant src="#", même phénomène

en mettant src="nimportequoi" problème corrigé

Je ne comprends pas ! nonono.gif

J'y ai passé ma journée sur ce foutu truc, alors si vous avez un début d'explication, je prends unsure.gif sinon je crois que je vais faire comme si ça ne m'étais pas arrivé tellement c'est hallucinant.
Portekoi
La quote ferme un autre code? Je sais pas mais en tout cas, cela ne pouvais pas provenir de ta requete smile.gif
cktoon
Non non, pas d'autre code appelé, rien que du html...
et cette image qui faisait apparemment "relancer la page" ???
Truc de fou, je te l'accorde...
Portekoi
Bonjour,

Un truc très étrange :

Créé une page sur tu vas appeler "index.asp" dans un nouveau répertoire.

Dedans, tu mets ceci :
CITATION
<?
$_SESSION["test"] = "test";
?>


Ensuite, tu créées une autre page que tu vas appeler "test.php" et dedans tu mets ceci :

CITATION
<img src="" />
<?
ech $_SESSION["test"];
?>


Appele ensuite la page test.asp directement. Au première affichage rien d'anormal mais quand on actualise, le mot "test" apparait à l'écran.

Il va chercher la page index par défaut.... Bizarre comme truc. Je n'étais jamais tombé sur ce bug...


Portekoi
cktoon
Salut,
je n'ai pas la possibilité de tester en .asp, mais c'est bien le même phénomène que j'ai rencontré ...
Tu me "rassures" quelque part : le bug existe, je ne suis pas seule à l'avoir vu tongue.gif
Avis à la populace : quand vous testez vos scripts, préférez <img src="nimportequoi" /> à <img src="" />
ou risquez de perdre les pédales.
On vous aura prévenus rolleyes.gif

/edit/ Euh du coup, ce post aurait peut-être plus sa place sur une section php...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.