Я вижу несколько разных вещей с вашим PHP-кодом:
- Вы не должны подключать / отключать MySQL в вашем цикле.Это ненужные накладные расходы.Вместо этого подключайтесь перед циклом и затем отключайте.
- Вам необходимо очистить любой пользовательский ввод, прежде чем использовать его в запросе.Ваш код уязвим для SQL-инъекций .
- Вы также должны переместить свою строку
header('Location:medical_question.php');
за пределы цикла и изменить ее на die(header('Location:medical_question.php'));
, чтобы остановить остальную частьваш сценарий от выполнения (при условии, что это то, что вы хотите, чтобы это произошло). Вам необходимо исправить одинарные кавычки в ваших запросах:
insert into permit (EID, PTYPE, STATUS) values ('$user,$cat, 'medical')
должно быть:
insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')
И то же самое для вашего другого запроса.
В конце ваш сценарий будет выглядеть более похожим наэто:
$conn = dbConnect();
if (!$conn)
die("Couldn't connect to MySQL");
$user = mysql_real_escape_string($_SESSION['eid']);
$class = $_POST['class'];
$cat_arr = $_POST['cat'];
foreach ($cat_arr as $cat)
{
$cat = mysql_real_escape_string($cat);
if ($med == 'no')
$query = "INSERT INTO permit (EID, PTYPE, STATUS) VALUES ('{$user}', '{$cat}', 'medical')";
else
$query = "INSERT INTO permit (EID, PTYPE) VALUES ('{$user}', '{$cat}')";
mysql_query($query);
}
dbDisconnect($conn);
if ($med == 'no')
$nextPage = "medical_question.php";
else
$nextPage = "next_page.php";
die(header("Location:{$nextPage}"));
Пример SQL-инъекции:
Предположим, ваш запрос выглядит следующим образом:
$user = $_GET["user"];
$cat = $_GET["cat"];
$query = "insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')";
Как бы выглядел ваш запрос, если бы я передал значение, подобное этому дляuser
:
`'); DROP TABLE permit; /*`
Это превратит ваш запрос в следующее:
insert into permit (EID, PTYPE, STATUS) values (''); DROP TABLE permit; /*', 'cat', 'medical')
Это определенно , а не то, что вы хотели.Когда вы дезинфицируете ввод с помощью mysql_real_escape_string
, он будет экранирован символом одинарных кавычек, и либо запрос не будет выполнен, либо вместо выполнения будет вставлена вся строка.
ОБНОВЛЕНИЕ:
Причину, по которой вы хотите переместить header
за пределы цикла, будет легче понять, если вы точно знаете, что делает функция:
Когда вывызовите функцию PHP header
, вы говорите PHP (на стороне сервера) отправить HTTP-заголовок в браузер (на стороне клиента).В случае header('Location:...')
вы отправляете заголовок HTTP, который заставляет браузер перенаправить на другую страницу и отключиться от текущего сценария PHP.
Итак, таков ход событий:
- Скрипт PHP отправляет заголовок HTTP, и в зависимости от задержки браузеру может потребоваться некоторое время для его получения.
- Браузер интерпретирует заголовок и перенаправляет в местоположение, которое выуказанный, который также отправляет сообщение о разъединении в текущий исполняемый скрипт PHP.
- Опять же, в зависимости от задержки, серверу может потребоваться некоторое время для получения сообщения о разъединении из браузера.
Между тем, когда скрипт PHP отправляет заголовок, а затем получает сообщение о разъединении, скрипт все еще выполняется.Невозможно определить, сколько кода выполнит сценарий до получения сообщения о разъединении, поэтому вы вообще не можете на это полагаться.Вот почему вы должны die
при отправке заголовка.
Зная, что именно так работает функция PHP header
, единственная причина, по которой вы, возможно, захотите поместить это в цикл, это если вы хотитетекущий скрипт, чтобы остановить выполнение в середине цикла в зависимости от некоторых определенных условий.Например:
foreach ($vars as $var)
{
if ($var == "stop")
die(header("Location:anotherPage.php"));
// do something as long as $var != "stop"
}
Это будет циклически проходить по массиву $var
, пока не достигнет значения "stop"
, после чего он отправит заголовок перенаправления клиенту и остановит выполнение.
Разница с вашим примером в том, что (до того, как вы его отредактировали) ваш цикл содержал один оператор if-else
, и в обоих if
и в else
у вас был вызов перенаправления заголовка.Поэтому, несмотря ни на что, оно будет отправлено на первой итерации цикла, что не имеет смысла.Если это действительно то, что вы хотели, вы бы не использовали цикл.Это будет выполнено только один раз, что противоречит цели цикла.
Приносим извинения за скучный ответ, но, надеюсь, теперь вы лучше понимаете, что на самом деле происходит в вашем коде.