php запускается один раз и дважды вставляет в базу данных mysql

Ниже приведен простой код. После того, как он запускается один раз, он дважды вводит результаты в базу данных mysql.

если он запускается дважды или запрашивает дважды базу с 1 обновлением на странице, почему вывод – всего лишь 1 результат?

Я работаю в течение всего дня и изо всех сил пытаюсь решить эту проблему. Однако мне не удалось выяснить, что не так с этим кодом. Код работает отлично на localhost, но после его перемещения на сервер проблема возникает. Кто-нибудь сталкивался с чем-то подобным раньше? Как решить эту проблему?

ПОЛНЫЙ КОД :

<?php $db=mysql_connect('localhost','zzzzzzz','xxxxxx') or die('Unable to connect.'.mysql_error()); mysql_select_db('test',$db) or die(mysql_error($db)); $sql="INSERT INTO test_table(value,insert_time) VALUES ('testing','".time()."')"; $result=mysql_query($sql); echo "result=".$result; $select="select * from test_table"; $rs=mysql_query($select); while($row=mysql_fetch_array($rs)){ echo $row["test_id"]." -- ".$row["value"]." -- ".$row["insert_time"]."<br />"; } ?> 

РЕЗУЛЬТАТ :
Результат = 1
1 – тестирование – 1298185509

НО В БАЗЕ ДАННЫХ :
test_id, значение, insert_time
1, тестирование, 1298185509
2, тестирование, 1298185511

Я столкнулся с той же проблемой, что и вы, проблема только occus, когда я использую Opera или chrome.

Для моего случая у меня есть .htaccess чтобы указать каждую вещь в индексный файл. Естественно, браузер будет запрашивать сценарий дважды, один раз для скрипта, а другой – для значка.

Исправление: попробуйте изменить .htaccess чтобы предотвратить перенаправление в индексный файл, когда браузер запрашивает favicon.ico

Вы видите это

 $result = $db->query($query); 

И следующая строка:

 if ($db->query($query) === TRUE) { 

Это означает, что вы дважды запускаете запрос. Удалите один из $db->query , например:

 $result = $db->query($query); if ($result === TRUE) { /* do stuff */ 

Как вы упомянули, проблема не возникает, когда вы тестируете локально, возникает только при развертывании на сервере. Я полагаю, у вас есть Google Adsense на вашей странице. В этом случае искатель adsense сканирует вашу страницу (отправляет второй http-запрос на URL-адрес)

Чтобы этого избежать, добавьте следующее в начало вашего php-файла:

 if(strpos($_SERVER['HTTP_USER_AGENT'],'Mediapartners-Google') !== false) { exit(); } 

Я столкнулся с подобной проблемой в скрипте, который отправляет электронные письма. Я получал двойные электронные письма за действие 🙁

Затем я исследовал журнал доступа к серверу и обнаружил второй запрос за действие от этого пользовательского агента …

Эта проблема также может возникнуть из-за того, что вы можете смешивать GET и POST

Или

вы можете загрузить онлайн-шаблон, который, возможно, создает фоновый вызов ajax перед отправкой страницы.

Пожалуйста, посмотрите и если вы найдете решение или если есть какая-либо другая проблема, сообщите нам об этом.

Код в порядке.

Попробуйте изменить браузер. Если все еще не сработало.

Перезапустить сервер

Попробуйте написать в другом файле вне проекта как один скрипт.

Это будет работать.

Я попробовал свой код, работая над моей системой.

Хорошо, я знаю, что это не имеет никакого смысла, но я решил удалить $.ajax({async:true}); из моего js-файла.

У меня была такая же проблема на моем сайте. После отладки я нашел основную причину. Это библиотека Yandex Metrica js. Он вызывает запрос ajax на ту же страницу, чтобы рассчитать время загрузки и некоторые другие параметры.

Вы используете его? Если не открыть панель chrome dev и посмотреть http-запрос. Может быть, это запрос на значок или т. Д.

Для этого есть много причин, поэтому я предлагаю вам использовать наилучшую практику:

Если вы создаете новую запись в своей БД, вы должны запустить логику с помощью запроса POST .

 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // … } 

Теперь проблемы без кода необходимо легко избежать: .htaccess, вещь Firebug, отслеживание объявлений …

У вас нет проблем с вашим кодом. Firebug или подобные инструменты иногда могут делать двойной запрос. Также метрические скрипты (yandex metrica, chartbeat и т. Д.) На вашей странице могут выполнять одно и то же поведение. Вы должны проверить эти ситуации.

Чтобы отладить его, вы можете регистрировать запросы на вставку, и вы можете проверить его, чтобы узнать, что не так.

Если вы используете среду linux;

Добавьте в свой код строку журнала:

 error_log(print_r($_SERVER,true)); 

Откройте окно консоли и введите (каталог журнала зависит от конфигурации вашего сервера)

 tail -f /var/log/apache/error.log 

И затем вы можете позвонить в свою страницу вставки. По каждому запросу вы можете видеть, что происходит.

Я предполагаю, что этот код из index.php является фронт-контроллером для всех запросов.
Когда браузер выбирает страницу, он обычно пытается получить favicon.ico тоже. И если favicon отсутствует, второй запрос обрабатывает ваш php-файл снова. Вы можете изучить это предположение, написав $ DBSESSION ['REQUEST_URI'] в DB.

Я рекомендую время от времени не изменять данные в запросах GET и журнале доступа к веб-серверу.

Ваш код кажется прекрасным, и это должно быть, вероятно, из-за использования внешних плагинов, которые отправляют 2-й запрос каждый раз.


Если вы используете Google Chrome, скорее всего, это связано с этой ошибкой, https://bugs.chromium.org/p/chromium/issues/detail?id=123121 . Эта ошибка заставляет Chrome перенаправлять каждый запрос в index.php, поэтому скрипт PHP будет работать дважды.

Это можно исправить, используя следующий код, как указано на веб-сайте.

 RewriteBase / RewriteCond %{REQUEST_FILENAME} !favicon.ico RewriteRule .* index.php [L] 

Вы также можете отлаживать использование debug_print_backtrace : http://php.net/debug_print_backtrace .

debug_print_backtrace () печатает обратную трассировку PHP. Он печатает вызовы функций, включенные / требуемые файлы и элементы eval () ed.


Кроме того, вы можете использовать SQL UNIQUE Constraint чтобы предотвратить вставку повторяющихся строк. Узнайте больше на http://www.w3schools.com/sql/sql_unique.asp .


Просто примечание : mysql() устарели, вместо этого используйте MySQLi .

 $result=mysql_query($sql); echo "result=".$result; 

Это связано с тем, что вы mysql_query($sql) запускаете mysql_query($sql) . Попробуйте это без эха $result .