PHP isset('submit') всегда возвращает FALSE

Я использую внешний php-файл в поле «действие» моей HTML-формы, чтобы действия, упомянутые в php-файле, выполнялись при нажатии кнопки «Отправить».

Для этого я использовал функцию isset() в файле php.

Однако я обнаружил, что функция isset всегда возвращает FALSE, что приводит к выполнению оператора else (как видно из журнала консоли).

Если я уберу функцию isset() (и, следовательно, операторы if-else), код заработает прекрасно.

Не могли бы вы проверить проблему в моем коде?

Также я видел в других сообщениях, что мне нужно использовать какой-то другой аргумент вместе с isset(), например,

if(isset($_POST['submit']) && !empty($_POST["xyz"]))

это вообще обязательно?

P.S.: Я все еще нахожусь на начальном этапе разработки страницы, и поэтому я прошу вас игнорировать проблемы безопасности моего кода, существование которых я подтверждаю. :)

Мои субкоды:

Моя HTML-форма:

<form id="info-form" method="POST" action="form-submit.php">
    <label for="Name">What is your Name? </label> 
    <input required type="text" name="name" placeholder="Enter your full name here." />

    <label for="Email">What is your email ID? </label>
    <input required type="email" name="email" placeholder="[email protected]" />

    <label for="mobile">What is your 10-Digit Mobile Number? </label>
    <input required type="text" name="mobile" maxlength="10" />

    <button name="submit-form" type="submit" class="btn btn-lg btn-success"><i class="fa fa-paper-plane" aria-hidden="true"></i>
        Submit
    </button>
    <button type="reset" class="btn btn-lg btn-warning"><i class="fa fa-undo" aria-hidden="true"></i>
        Reset
    </button>
</form>

Мой файл form-submit.php:

<?php
    if(isset($_POST['submit-form']))
    {
        require("database-connect.php");

        $name = $_POST['name'];
        $email = $_POST['email'];
        $mobile = $_POST['mobile'];

        $sql = "INSERT INTO tbl_details ".
               "(name,email_id,mobile_number) ".
               "VALUES ".
               "('$name','$email','$mobile')";

        mysql_select_db('db_info');
        $return = mysql_query( $sql, $connect );

        if(! $return )
        {
            die('Could not enter data: ' . mysql_error());
        }

        echo "Entered data successfully\n";
        mysql_close($connect);
    }

    else
    {
        echo "Not Set\n";
    }
?>

person ABor    schedule 15.09.2016    source источник
comment
submit != submit-form (название вашей кнопки отправки). Итак, вы хотите использовать isset($_POST['submit'-form']) в своем заявлении.   -  person Qirel    schedule 15.09.2016
comment
См. stackoverflow.com/q/4559925/476.   -  person deceze♦    schedule 15.09.2016
comment
Кроме того, примечание о стандартах безопасности и программирования: mysql_* функции устарели, начиная с PHP 5.5 (и полностью удалены в PHP 7), и вам следует прекратите их использовать, если можете. Вам следует выбрать другой API, который позволяет использовать подготовленные операторы (что вам действительно следует при работе с пользовательским вводом), например mysqli_* или PDO — см. выбор API. По сути, вы широко открыты для SQL-внедрения - прочитайте Как я могу предотвратить SQL-внедрение в PHP?   -  person Qirel    schedule 15.09.2016
comment
прежде всего проверьте имя кнопки в isset, если она все еще не работает, попробуйте ввести тип = 'отправить', потому что тип кнопки отправки не работает везде   -  person Vishnu Bhadoriya    schedule 15.09.2016
comment
Что вы видите, если вы var_dump($_POST);? isset($_POST['submit-form']) должно нормально работать с вашей формой. Не проверяйте !empty($_POST['submit-form']), так как в настоящее время оно передается как пустое значение.   -  person Rocket Hazmat    schedule 15.09.2016
comment
Помимо зияющей SQL-инъекции, я не вижу причин, по которым вы должны проверять наличие переменных POST, потому что форма не выполняет обратную передачу самой себе.   -  person x13    schedule 15.09.2016
comment
@ThisName Вам лучше расширить аргументацию здесь, потому что я не понимаю…   -  person deceze♦    schedule 15.09.2016
comment
@deceze Страница, которая публикуется в form-submit.php, не является той же страницей, что и form-submit.php, поэтому, если пользователь не вводит URL-адрес вручную (в этом случае вам нужно проверить наличие значений формы, а не кнопку отправки) можно с уверенностью предположить, что запрос поступил из формы, содержащей эту кнопку.   -  person x13    schedule 15.09.2016
comment
@ThisName Не совсем так. Пользователи могут повторно вызвать URL-адрес из истории своего браузера как запрос GET, или поисковые системы могут наткнуться на него. Утверждение правильного метода HTTP — хорошая идея для конечной точки HTTP.   -  person deceze♦    schedule 15.09.2016
comment
@RocketHazmat var_dump($_POST) предоставляет вывод: array(3) { [name]=›string(6) dajkfs [email]=›string(20) [email protected] [mobile]=›string(10) 1234786234 }   -  person ABor    schedule 15.09.2016
comment
@ABor: Какой браузер вы использовали? Странно, что submit-form отсутствует. Оно должно быть представлено как пустое значение. (Это IE, не так ли?)   -  person Rocket Hazmat    schedule 15.09.2016
comment
@RocketHazmat Firefox   -  person ABor    schedule 15.09.2016
comment
Странный! Firefox должен был отправить submit-form, что я и сделал...   -  person Rocket Hazmat    schedule 15.09.2016
comment
я не знаю, в чем ошибка, но решение, предоставленное deceze, сработало для меня...   -  person ABor    schedule 15.09.2016


Ответы (3)


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

Что вы действительно хотите проверить на сервере, так это то, был ли запрос POST-запросом, или установлены ли значения, с которыми вы хотите работать, или и то, и другое:

if ($_SERVER['REQUEST_METHOD'] == 'POST') …
if (isset($_POST['name'], $_POST['email'], $_POST['mobile'])) …

Самым разумным было бы:

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    header('HTTP/1.0 405 Method Not Allowed');
    exit;
}

or:

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    header('Location: myform.html');
    exit;
}

После того, как вы убедились, что имеете дело с правильным методом HTTP, обработайте свои данные:

$data = filter_input_array(INPUT_POST, [
    'name'   => FILTER_DEFAULT,
    'email'  => FILTER_VALIDATE_EMAIL,
    'mobile' => FILTER_DEFAULT
]);

Как видите, вам даже не нужно напрямую взаимодействовать с $_POST. См. http://php.net/filter_input_array.

person deceze♦    schedule 15.09.2016
comment
Спасибо @deceze. Я не могу тебя отблагодарить. Вы не только ответили на мой вопрос, но и предложили лучший способ ведения дел, что очень важно для такого новичка, как я. Вы преподали мне один важный урок - небольшие косметические изменения во внешнем интерфейсе... не должны иметь никаких последствий для внутреннего интерфейса. Большое спасибо. Кстати, если это непонятно для других новичков, таких как я, решение, представленное в этом ответе, сработало! Ваше здоровье. - person ABor; 15.09.2016
comment
Совет. Узнайте больше о протоколе HTTP и ознакомьтесь с принципами обработки HTTP-запросов на вашем сервере. Возьмите за привычку тестировать свой сервер, отправляя необработанные HTTP-запросы с помощью curl (или любого другого инструмента, который вы предпочитаете). Заставьте свой сервер вести себя как надлежащую конечную точку HTTP. Это сделает ваши приложения более разумными, чем мышление в терминах HTML-кнопок и форм. - person deceze♦; 15.09.2016
comment
Спасибо за совет. :) - person ABor; 15.09.2016

Измените тег кнопки следующим образом. Я надеюсь, что это поможет вам!

<input name="submit-form" value="Submit" type="submit" class="btn btn-lg btn-success">

Спасибо!

person Ragu Natarajan    schedule 15.09.2016
comment
Зачем ему менять <button> на <input>? Для меня это не имеет смысла. - person Rocket Hazmat; 15.09.2016
comment
Единственная цель кнопки отправки — отправить данные HTML-формы серверному сценарию, указанному в атрибуте ACTION формы. - person Ragu Natarajan; 15.09.2016
comment
Да... так почему это должно быть <input>? <button> тоже так могут. - person Rocket Hazmat; 15.09.2016
comment
Пожалуйста, перейдите по этой ссылке. Я надеюсь, что это поможет вам. stackoverflow.com/questions/4488317/ - person Ragu Natarajan; 15.09.2016
comment
Я вообще не понимаю, как эта ссылка помогает. Это было 6 лет назад и рассказывает о IE6. В любом современном браузере <button type="submit"> (или даже просто <button>) прекрасно работает для отправки формы. Я до сих пор не понимаю предложение перейти на <input>. - person Rocket Hazmat; 15.09.2016

Вы должны использовать элемент input вместо кнопки.

<button name="submit-form" type="submit" class="btn btn-lg btn-success">
<i class="fa fa-paper-plane" aria-hidden="true"></i>Submit
</button>

Должен быть заменен вводом, подобным этому:

<input name="submit-form" value="ButtonText" type="submit" class="btn btn-lg btn-success" />

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

Кроме того, в своем вопросе вы упоминаете isset('submit') и isset($_POST['submit']), в то время как другие правы, и это не существующее имя в вашем HTML-коде, ваш PHP-код действительно содержит правильное isset($_POST['submit-form']). Это вызывает небольшое замешательство у некоторых «быстрых» читателей...


Что касается дополнительных !empty($_POST["xyz"])), то для вашей цели (проверка формы на постбэк) это не нужно.

person x13    schedule 15.09.2016
comment
<button> элементы могут иметь value свойств. См.: developer.mozilla.org/en-US/docs/ Интернет/HTML/элемент/кнопка - person Rocket Hazmat; 15.09.2016
comment
Кроме того, value для <input> — это и отображаемый текст и отправленное значение. <button>s предлагают больше контроля, value — это то, что отправляется, но вы можете отображать другое значение (даже HTML-элементы) для пользователя. - person Rocket Hazmat; 15.09.2016