insertion en double

yablif
Invité n'ayant pas de compte PHPfrance

07 août 2010, 23:06

Je n'arrive pas à comprendre pourquoi lorsque j'exécute la page suivante, le record est inséré 2 fois dans la database.
Quelqu'un voudrait-t'il me signaler mon erreur ?
Merci.
<html>
<head>
<title>Forum</title>
<meta http-equiv="Content-Type" content="text/html; charset=charset=iso-8859-1">
<style>
p {padding:0.5em; background-color:lightblue;}
</style>
</head>
<body>
<?php
echo "<h3>Insertion dans la table $forum</h3>\n";

include "../vars.inc.php";
$link = mysql_connect($HOST,$USER,$PASS) or 
	die("Impossible de se connecter: ".mysql_error());
if (!mysql_select_db($DB, $link)) {
	die('Sélection de base de données impossible');
}

echo "<p>\n";
$sql = "SELECT * FROM `Forum_attente` WHERE `num` = '$no'";
echo "$sql<br>\n";
$result = mysql_query($sql, $link);
if (!$result)
	die ('ERREUR lors de la lecture du record $no de la table Forum_attente !<br>\n');
$row = mysql_fetch_array($result);
echo "</p>\n";

echo "<p>\n";
$sql = "INSERT INTO `$forum` (`date`,`type`,`sujet`,`message`,`coordonnees`,`mail`,`ip`)
	VALUES ('".$row['date']."', '".$row['type']."', '".$row['sujet']."', '".$row['message']."', '".$row['coordonnees']."', '".$row['mail']."', '".$row['ip']."')";
echo "$sql<br>\n";
$result = mysql_query($sql, $link);
printf("Lignes affect&eacute;es : %d<br>\n", mysql_affected_rows());
if ($result==FALSE)
	echo "ERREUR lors de l'insertion dans la table $forum !<br>\n";
else
	echo "Insertion dans la table $forum: OK<br>\n";
echo "</p>\n";
?>
<br>
<a href="index.php">Retour forum attente</a><br>
<a href="../../forum.php">Retour forum principal</a><br>
</body>
</html>


Mammouth du PHP | 881 Messages

08 août 2010, 04:31

Quand tu fais ta vérification ( if ($result==FALSE) ) tu demandes un nouvel enregistrement.

Il vaudrait mieux faire
if (mysql_query($sql, $link) )  {
        echo "Insertion dans la table $forum: OK<br>\n";
} else {
        echo "ERREUR lors de l'insertion dans la table $forum !<br>\n";
}
Soyez artisans de paix

3S48L
Invité n'ayant pas de compte PHPfrance

08 août 2010, 10:16

Je te remercie vivement de ta réponse.
J'ai changé le code comme tu le suggères, mais malheureusement le problème n'est pas résolu !
Une aute idée ?

Mammouth du PHP | 881 Messages

08 août 2010, 13:50

Force est de croire que ton code est lu deux fois ... ta page ou ton segment est appelé deux fois.

Quel résultat te donne ta ligne de contrôle ( 1 ou 2 ) ?
printf("Lignes affect&eacute;es : %d<br>\n", mysql_affected_rows());

Aussi, lisant ceci
$sql = "SELECT * FROM `Forum_attente` WHERE `num` = '$no'";
...
$sql = "INSERT INTO `$forum` (`date`,`type`,`sujet`,`message`,`coordonnees`,`mail`,`ip`)  VALUES ('".$row['date']."', '".$row['type']."', '".$row['sujet']."', '".$row['message']."', '".$row['coordonnees']."', '".$row['mail']."', '".$row['ip']."')";
Je comprends que tu fais un INSERT dans Forum_attente ailleurs (autre code, autre page) ... est-ce que tu ne ferais pas l'INSERT semblable dans le $forum en même temps dans cette autre page (ailleurs)

Autrement, vois dans tes autres pages si tu n'appellerais pas deux fois le code que tu nous présentes ici.
Soyez artisans de paix

yablif
Invité n'ayant pas de compte PHPfrance

08 août 2010, 17:07

J'essaye de copier un record (num=$no) depuis la table Forum_attente dans la table Forum ($forum). Les 2 tables ont la même structure:

Code : Tout sélectionner

CREATE TABLE `Forum_attente` ( `num` int(4) NOT NULL auto_increment, `date` datetime NOT NULL default '0000-00-00 00:00:00', `type` varchar(10) NOT NULL default '0', `sujet` varchar(50) NOT NULL default '', `message` longtext NOT NULL, `coordonnees` varchar(30) NOT NULL default '0', `mail` varchar(50) NOT NULL default '', `ip` varchar(50) NOT NULL default '', `fichier` varchar(35) NOT NULL default '', `mac` text NOT NULL, PRIMARY KEY (`num`) ) TYPE=MyISAM AUTO_INCREMENT=2 ;
Le mysql_affected_rows retourne toujours 1.

Si j'appelle ma page comme suit,
http://www.monsite.web/monscript.php?forum=Forum&no=3
le problème se présente aussi, le record est inséré deux fois.

yablif
Invité n'ayant pas de compte PHPfrance

10 août 2010, 19:16

J'ai ajouté une trace (écriture dans un fichier de log), et je constate qu'en fait, c'est toute la page web qui est exécutée deux fois.
Bizarre ...

Mammouth du PHP | 881 Messages

12 août 2010, 00:01

C'est bien ce que je soupçonnais. Analyse bien ton log et cherche surtout dans les sous-routines appelées par plusieurs pages, souvent se trouvent là les appels en double qu'on ne soupçonne pas. Autrement, tu peux encore faire une index "UNIQUE" à ta table de données pour que MySQL empêche les doublons.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

13 août 2010, 03:24

Je n'arrive pas à comprendre pourquoi lorsque j'exécute ... la page suivante, le record est inséré 2 fois dans la database.
As-tu fait les vérifications que yablif fait ou a faites ?
Si oui, donne-nous ton code, ta structure de base que nous puissions regarder cela.
Soyez artisans de paix

ViPHP
ViPHP | 5462 Messages

13 août 2010, 03:28

Je n'arrive pas à comprendre pourquoi lorsque j'exécute ... la page suivante, le record est inséré 2 fois dans la database.
As-tu fait les vérifications que yablif fait ou a faites ?
Si oui, donne-nous ton code, ta structure de base que nous puissions regarder cela.
c'est un spam :(