Хорошо, давайте начнем с того, почему это происходит.
Параметр action
HTML сообщает браузеру, какой URL-адрес отправить запрос POST с данными формы. В вашем случае это $_SERVER['PHP_SELF']
, который является текущим PHP скриптом. Вы используете одно и то же для обеих форм.
Когда отправляется одна из форм, вызывается ваш скрипт PHP, и все PHP в скрипте выполняются. Первая часть (та, что после первой формы) проверяет if ($_SERVER["REQUEST_METHOD"] == "POST")
, решает, что да, это был запрос POST, и пытается продолжить. После этого вторая часть (та, что после второй формы), использует точно такую же проверку, решает, что да, это был запрос POST, и пытается выполнить тоже.
В идеале, было бы чище иметь две разные страницы для обработки двух разных форм; но если вы предпочитаете хранить все на одной и той же странице, у вас есть несколько разных опций, чтобы различать guish между двумя.
1) Используйте разные параметры запроса в атрибуте действия для каждого форма, предложенная @ sauhardn c. Формы будут выглядеть так:
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?form=form1">
...
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?form=form2">
, тогда как сторона PHP будет делать что-то вроде
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($_GET['form'] == 'form1') {
// code for form1
} else {
// code for form2
}
}
2) Использовать разные входные данные в каждой форме. Формы будут выглядеть так:
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
...
<input type="hidden" name="form" value="form1">
</form>
...
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
...
<input type="hidden" name="form" value="form2">
</form>
, а сторона PHP будет делать что-то вроде
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($_REQUEST['form'] == 'form1') {
// code for form1
} else {
// code for form2
}
}