Ниже приведен простой код. После того, как он запускается один раз, он дважды вводит результаты в базу данных 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
.