2016-04-12 3 views
1

Я долгое время программировал PHP и никогда не видел ничего подобного. Недавно я изменил веб-хосты и начал видеть, что некоторые из моих сценариев работают два или три раза, когда они должны запускаться только один раз. Но, похоже, это происходит только при наличии перенаправления заголовка (Location).Сервер, кажется, работает PHP-скрипт несколько раз

Если я прокомментирую перенаправление, сценарий будет запускаться один раз, как следует, но если я останусь в перенаправлении, он будет запускаться два или три раза перед перенаправлением.

Как я знаю, это то, что сценарий вставляет информацию в базу данных SQL и вставляет два или три дубликата информации.

Я создал простой тест на него www.realitychurchweb.net/test1.php

Сценарий для этой страницы является:

require_once("handlers/connection.php"); 

mysql_query("INSERT INTO AA_GENERIC (name, value)VALUES('testing', '123')"); 

header("Location: test2.php"); 

Сценарий test2.php является:

require_once("handlers/connection.php"); 

$q = mysql_query("SELECT * FROM AA_GENERIC WHERE name = 'testing'"); 

$num = mysql_num_rows($q); 

echo "There are now $num rows<br /><br />"; 

Если я набираю URL-адрес браузера (Safari), он будет вводить 1, 2 или 3 строки перед перенаправлением на test2, что затем показывает, сколько строк сейчас существует.

Я говорил с технической поддержкой веб-хостинга, и они не помогли. Я действительно в недоумении с этим.

+2

У меня проблемы. Когда я вызываю ваш тестовый скрипт, я получаю одну строку. Когда я снова назову это, это ожидаемые две строки, затем три и так далее. Почему вы думаете, что это выполняется несколько раз? – Gordon

+0

Несколько вещей: 1) ваш тест не воспроизводится 2) Не делайте ничего с GET-запросом, используйте POST 3) Вы, скорее всего, несколько раз вызываете свой тестовый скрипт, не осознавая, что это обычная причина для таких (плохой) идеи), которые должны вызываться несколько раз, т. е. с разбивкой изображений, ссылок css или js. Запишите текущий url, когда вы вставляете в db 4) Кто этот вопрос ... – AD7six

+0

Вы правы, что больше этого не делают. Я ничего не изменил. Единственное, что я могу думать, это то, что сервер это делал. Спасибо, что проверили его. – Whitwoda

ответ

1

Вы уже пробовали exit; после вашего header() позвонить в скрипт test1.php?

Невозможно, чтобы код выполнялся несколько раз, так что сценарий вызывается несколько раз (например, боты, cronjob и т. Д.) Или какой-то другой код (возможно, после перенаправления?), Который приводит к созданию нескольких баз данных строк.

+0

Я думаю, вы имеете в виду 'exit();' – Black

+2

@EdwardBlack: Поскольку 'exit' является конструкцией языка PHP, а не функцией, вы также можете просто использовать' exit; '. См .: http://php.net/manual/en/function.exit.php – Andreas

+0

Тогда почему это можно назвать его функцией? – Black

Смежные вопросы