J'ai un simple code ci-dessous. Après sa course une fois, il insère des résultats deux fois dans la base de données MySQL.
S'il exécute deux fois ou demande deux fois de base sur 1 Actualiser sur la page, pourquoi la sortie est juste 1 résultat? P>
J'ai été googling pendant toute la journée et lutte pour résoudre ce problème. Cependant, j'ai échoué à comprendre ce qui ne va pas avec ce code. Le code fonctionne parfaitement sur localhost, mais après son déplacement sur le serveur, le problème apparaît. Quelqu'un a-t-il fait face à quelque chose comme ça avant? Comment ce problème peut-il être résolu? P>
code complet em> stry>: p> mais dans la base de données forte>:
Résultat = 1
1 - Test - 1298185509 P>
test_id, valeur, insertion_time
1, Test, 1298185509
2, test, 1298185511 p> p>
15 Réponses :
Comme vous avez mentionné le problème ne se produit pas lorsque vous testez localement, ne se produit que lorsque vous déployez dans le serveur --- Je suppose que vous avez Google AdSense dans votre page. Dans ce cas, AdSense Crawler rampe votre page (envoyant la deuxième requête HTTP à l'URL)
Pour éviter cela, ajoutez-le après le début de votre fichier PHP: P>
if(strpos($_SERVER['HTTP_USER_AGENT'],'Mediapartners-Google') !== false) { exit(); }
Si vous n'avez pas d'Adsense, cette solution n'est pas requise pour vous. Mais si vous aviez analysé le journal d'accès au serveur, vous avez déjà trouvé le problème déjà.
Je change la valeur d'insertion "Test" à $ _Server ['http_user_agent'] et le résultat, toujours 2 rangées a été insérée, mais les deux valeurs sont différentes! Est-ce que cela signifie que le navigateur demande réellement deux fois et causer le problème? Valeurs comme suit: Mozilla / 5.0 (Windows; U; Windows NT 6.0; EN-US) ApplewebKit / 534.13 (KHTML, comme Gecko) Chrome / 9.0.59, Mozilla / 4.0 (Compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3)
Journal: $ _Server ['Remote_addr']
$result=mysql_query($sql); echo "result=".$result; It's because you run mysql_query($sql) twice. Try it without echo the $result.
$ Résultat stocke la sortie (ressource sur le succès, False On Error) de la méthode MySQL_Query, pas une référence à l'exécution réellement, comme votre réponse suggère.
Je suis confronté au même problème que vous, le problème de l'occus que lorsque j'utilise Opera ou Chrome. p>
Pour mon cas, j'ai un .htaccess code> pour pointer tout ce qui est au fichier d'index. Naturellement, le navigateur demandera le script deux fois, une fois pour le script lui-même, l'autre est pour le Favicon. P>
.htaccess code> pour empêcher la redirection du fichier d'index lorsque le navigateur demande pour
favicon.ico code> p> p>
Endy Jasmi, c'est votre seule réponse et vous n'avez pas été revenus sur ce site depuis plus de 3 ans, mais je tire mes cheveux sur ce bogue et que vous l'avez résolu. Merci.
Ce serait génial si vous pouviez ajouter les lignes que vous avez ajoutées à votre fichier hACCESS
OK, je sais que cela n'a aucun sens, mais j'ai résolu la suppression de $. Ajax ({async: vrai}); code>
de mon fichier JS. p>
J'ai eu le même problème sur mon site. Après avoir débogué, j'ai trouvé la cause fondamentale. C'est la bibliothèque Yandex Metrica JS. Il appelle une demande Ajax à la même page pour calculer le temps de chargement et d'autres paramètres. P>
Utilisez-vous? Si ce n'est pas ouvert un panneau de développement Chrome et examinez la demande HTTP. Peut-être que c'est la demande de Favicon ou etc. P>
Il y a de nombreuses raisons de le faire, alors je vous suggérerais d'utiliser la meilleure pratique:
Si vous créez un nouvel enregistrement dans votre DB, vous devriez introduire la logique avec if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// â¦
}
@nicng laissez-moi savoir si cela ne peut pas corriger
Il n'y a pas de problème avec votre code.Firebug ou des outils similaires peuvent parfois faire une double demande parfois. Les scripts métriques (Yandex Metrica, TTBETTY, ETC) dans votre page, vous pouvez faire le même comportement. Vous devriez inspecter ces situations.
Pour déboguer, vous pouvez enregistrer des demandes d'insertion et vous pouvez l'inspecter pour trouver ce qui est faux. p>
Si vous utilisez Linux Environment; P>
Ajoutez une ligne de journalisation à votre CODE: P>
tail -f /var/log/apache/error.log
Ce problème peut également être soulevé pour que vous puissiez mélanger le ou p>
Vous avez peut-être téléchargé un modèle en ligne téléchargé qui peut faire un appel AJAX de fond avant que la page soit soumise. P>
Veuillez jeter un coup d'œil et si vous trouvez une solution ou s'il y a un autre problème, faites-nous savoir. P> Obtenir code> et
POST CODE> P>
Je suppose que ce code de index.php qui est un contrôleur frontal pour toutes les demandes.
Lorsque le navigateur récupère la page, il tente généralement d'obtenir Favicon.ico aussi. Et si Favicon est manquant, la deuxième demande est traitée à nouveau votre fichier PHP. Vous pouvez examiner cela
supposition en écrivant $ _Session ['demande_uri'] à dB. p>
Je recommande de ne pas modifier les données dans Obtenir des demandes et des recherches sur le journal d'accès au serveur Web de temps à autre. P>
Votre code semble bien, et il devrait être probablement dû à des plugins externes que vous utilisez, qui envoient une deuxième demande à chaque fois.
Si vous utilisez Google Chrome, il serait probablement due à Ce bug, https://bugs.chromium.org/p/chromium/ Problèmes / détail? ID = 123121 . Ce bogue provoque CHROME redirige chaque demande dans index.php, de sorte que le script php fonctionnera deux fois. P>
Ceci peut être corrigé à l'aide du code suivant, comme selon le site Web. P>
RewriteBase / RewriteCond %{REQUEST_FILENAME} !favicon.ico RewriteRule .* index.php [L]
code va bien. P>
Essayez de changer de navigateur. Si toujours pas travaillé. P>
Server Redémarrer Toujours pas p>
Essayez d'écrire dans un autre fichier en dehors du projet en tant que script unique. P>
Cela fonctionnera. P>
J'ai essayé votre code son travail sur mon système. P>
Voyez-vous cette et la ligne suivante: p> Cela signifie que vous exécutez votre requête deux fois. Supprimer l'un des $ db-> Query Code>, E.G.: P>
$result = $db->query($query);
if ($result === TRUE) { /* do stuff */
Ne copiez pas de contenu d'ailleurs sans attribution claire. Il est considéré comme un plagiat. Voir Stackoverflow.com/help/referencing ( Stackoverflow.com/a/34581103/444991 ).
Entendu! Aidez-moi à économiser des tonnes de temps de débogage en regardant simplement la requête!
La solution par ENDY JIMI a travaillé pour moi. Voici comment j'ai édité mon fichier .htaccess. plus tôt, c'était comme p>
Essayez cette solution dans votre en-tête HTML.
<base href="/">
J'ai eu cette question sur le navigateur chrome et j'ai trouvé 2 façons de le résoudre;
Cliquez pour Informations CAPTCHA P>
Créez un contrôle de session en démarrant une session sur votre page de formulaire; p>
et dans votre page postale utilisez une instruction "si" avant votre insertion; p> Cela l'empêchera de réinsérer. p> p> $ _ session ['formzt'] = 0; code> p> li>
ol>
Avez-vous examiné votre journal HTTP pour vous assurer qu'il ne s'agit vraiment d'une fois? Le navigateur peut soumettre plus de demandes que prévu. Ceci est particulièrement vrai si votre page n'émet pas de manière significative HTML (que je ne vois pas ce qui précède. En général, vous ne pouvez pas compter sur le nombre de fois qu'un navigateur soumet une demande d'obtention; ils devraient être répétables sans aucun effet secondaire (idempotent)
Avez-vous essayé de changer de valeurs à la valeur et au nom de champ,
valeur code> à
valeur code>
Soyez particulièrement méfiant des outils de débogage du navigateur telles que Firebug, qui peut émettre une demande plus d'une fois
La différence de temps de deux secondes est plutôt un signe qu'il existe en fait deux demandes HTTP.
Mais..-tu effacer la base de données après chaque page de page? Parce que dans SELECT Vous avez une boucle de temps, donc: 1ère charge: vous insérez un enregistrement, puis récupérez tous les enregistrements de DB (sans une condition physique) - il n'y a qu'un seul enregistrement. 2e charge: vous insérez un enregistrement et récupérez 2 enregistrements de Thre Thre. 3ème charge: vous insérez un enregistrement, vous récupérez 3 maintenant. Et ainsi de suite..vous n'hésitez pas à insérer deux fois parce que "insérer =" écho une fois, d'après ce que je vois dans votre code
Je pense que Damien Pirsy est Rite, j'ai apporté des changements ci-dessus, je le réalise d'abord de générer le premier résultat (qui est le résultat que je veux), mais il insère deux fois dans la base de données.
@nicng: Quel type d'accès avez-vous sur le serveur? Je veux dire, ftp, shell, cpanel (liste toutes). Ensuite, nous pouvons vous dire comment afficher le journal d'accès. (ou vous pouvez même google)
J'utilise cPanel. Comment activer le journal d'accès?
OMG @MarkR Vous venez de me sauver des heures! J'étais coincé avec un processus d'arrière-plan qui a dirigé un ancien fichier PHP qui faisait la même chose et je l'ai rendu à nouveau sans tuer l'ancien et que votre commentaire a suscité que j'ai peut-être deux pages faisant des inserts et d'enfuser c'était le cas! Merci!
@Markr - Postez votre commentaire comme une réponse. Alon / Nicng / Vixed - Fermez le fil afin que les intervenants ne perdent pas de temps sur "Erreur utilisateur".
Stackoverflow.com/Questtions/6268772/mysql-query-runs-twice < / a>