PHP запустить один раз и вставить дважды в базе данных MySQL - PullRequest
5 голосов
/ 20 февраля 2011

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

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

Iгуглил целый день и изо всех сил пытался решить эту проблему.Тем не менее, я не смог понять, что не так с этим кодом.Код отлично работает на локальном хосте, но после его перемещения на сервер возникает проблема.Кто-нибудь сталкивался с чем-то подобным раньше?Как решить эту проблему?

ПОЛНЫЙ КОД :

<?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

Ответы [ 14 ]

14 голосов
/ 11 января 2012

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

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

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

2 голосов
/ 21 июля 2016

Вы видите это

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

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

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

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

$result = $db->query($query);
if ($result === TRUE) {    /* do stuff */
1 голос
/ 03 марта 2016

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

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

Перезагрузите сервер Все еще не

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

Это будет работать.Я попробовал ваш код, он работает в моей системе.

1 голос
/ 02 марта 2016

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

или

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

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

1 голос
/ 20 февраля 2011

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

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

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

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

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

0 голосов
/ 10 июля 2019

Попробуйте это решение в заголовке html.

<base href="/">
0 голосов
/ 18 мая 2019

Решение Энди Джасми сработало для меня.Вот как я отредактировал мой файл .htaccess.


    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /site2/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /site2/ [L]
    </IfModule>

    # END WordPress

ранее он был похож на


    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /site2/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /site2/index.php [L]
    </IfModule>

    # END WordPress

0 голосов
/ 03 марта 2016

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


Если вы используете 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 вместо.

0 голосов
/ 03 марта 2016

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

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

0 голосов
/ 01 марта 2016

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

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

Если вы используете среду Linux;Ваш код:

error_log(print_r($_SERVER,true));

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...