Проблема:
Неопределенные переменные POST после отправки формы.
Исследования и устранение неполадок:
В этот момент я проиграл. Данные просто отказываются публиковать, все возвращается неопределенно. Ниже приведены HTML, PHP и два скриншота, показывающие проблему.
Я использую встроенный сервер PHPStorm в Windows.
signup.html
<div class="text-center col-md-4 col-md-offset-4"> <form id="user_signup" class="form-horizontal signInFields" action="../php/register.php" method="POST"> <input type="text" id="first_name" name="first_name" placeholder="First Name"> <input type="text" id="last_name" name="last_name" placeholder="Last Name"> <input type="email" id="user_email" name="user_email" placeholder="Email"> <input type="text" id="user_id" name="user_id" placeholder="User ID"> <input type="password" id="user_password" name="user_password" placeholder="Password"> <input type="password" id="confirm_password" name="confirm_password" placeholder="Confirm Password"> <button id="btn_signup" type="submit" name="signup_button">Sign Me Up!</button> </form>
register.php
// Variables from the sign-up form POST action $first_name = $_POST["first_name"]; $last_name = $_POST["last_name"]; $user_email = $_POST["user_email"]; $user_id = $_POST["user_id"]; $user_password = $_POST["user_password"]; $confirm_password = $_POST["confirm_password"]; // Add a new user to the database $conn = new mysqli($servername, $username, $password); $testQuery = mysql_insert($first_name,$last_name,$user_email,$user_id,$user_password); if($conn->query($testQuery) === TRUE){ echo "New Record Created Successfully!"; } else { echo "Error: " . $testQuery . "<br>" . $conn->error; } $conn->close();
Форма с заполненными полями
Результат после представления:
На данный момент я озадачен. Насколько я могу судить по W3Schools, PHP.net и различным вопросам здесь, я правильно настроил его. Однако что-то явно не работает. Любая помощь будет очень признательна.
Редактировать:
Вы используете встроенный веб-сервер PHPStorm , который имеет некоторые проблемы прямо сейчас, особенно с запросами POST, например WEB-17317 . Вы также можете обратиться к этому ответу в этом отношении.
И это может быть причиной того, что вы не смогли обработать свою форму.
http://localhost/signup.html
должен быть доступен через браузер. http://localhost/signup.html
.
<a>
или action="register.php"
в формах, будут автоматически подаваться с локальным сервером.
Теперь вы можете использовать зеленую кнопку в PHPStorm для запуска ваших файлов HTML / PHP, и она откроет эти файлы в вашем браузере с URL-адресом, который вы настроили на шаге 1. И вы должны иметь возможность обрабатывать ваши формы без каких-либо проблем.
echo $_SERVER["REQUEST_METHOD"] == "POST"
печатает 1
при записи в файле register.php, что означает, что ваша форма отправляется успешно. post_max_size
в вашем php.ini устанавливается в формате #M , например 10M
, любой другой формат, такой как 10MB
, недействителен. Обратитесь к php.net . echo file_get_contents("php://input");
отображает данные в формате: first_name=John&last_name=Doe ....
Обратитесь к php.net . var_dump($_POST)
отображает данные формы в массиве. Надеюсь, это поможет вам. Не стесняйтесь комментировать.
Попробуй это
register.php
<?php $errors = []; $fields = [ 'first_name', 'last_name', 'user_email', 'user_id', 'user_password', 'confirm_password', ]; $data = []; if( !empty( $_POST ) ) { foreach ($fields as $field) { if( isset( $_POST[$field] ) ) { $data[$field] = $_POST[$field]; } else { //empty field handling $errors[$field] = $field.' required!'; } } } if( empty($errors) ) { // Add a new user to the database $conn = new mysqli($servername, $username, $password); $testQuery = mysql_insert ( $data['first_name'], $data['last_name'], $data['user_email'], $data['user_id'], $data['user_password'] ); if($conn->query($testQuery) === TRUE) { echo "New Record Created Successfully!"; } else { echo "Error: " . $testQuery . "<br>" . $conn->error; } $conn->close(); }
signup.php
<?php require('path/to/register.php'); ?> <form id="user_signup" class="form-horizontal signInFields" action="" method="post"> <input type="text" id="first_name" name="first_name" placeholder="First Name"> <input type="text" id="last_name" name="last_name" placeholder="Last Name"> <input type="email" id="user_email" name="user_email" placeholder="Email"> <input type="text" id="user_id" name="user_id" placeholder="User ID"> <input type="password" id="user_password" name="user_password" placeholder="Password"> <input type="password" id="confirm_password" name="confirm_password" placeholder="Confirm Password"> <button id="btn_signup" type="submit" name="signup_button">Sign Me Up!</button> </form>
ПРИМЕЧАНИЕ СТОРОНЫ (если вы новичок)
Используйте метод = «post» вместо метода = «POST» (только стандарты)
Вы не проверяете поля ввода (опасные)
Вы можете использовать кнопку типа ввода вместо кнопки, которую вы используете, в этом случае вы можете отправлять данные с помощью ajax.
Я скопировал вашу форму и (часть) вашего файла register.php
и не имел никаких проблем. Данные опубликованы как ожидалось. Я боролся с чем-то подобным раньше, и это оказалось странной проблемой переадресации, поэтому мои данные POST были потеряны к моменту, когда они попали на мой контроллер. К сожалению, я могу предложить только несколько предложений по его отладке.
Я хотел бы упомянуть, что как только вы выясните свою проблему POST, вам нужно будет посмотреть на материал взаимодействия с базой данных … вы создаете объект mysqli
, но вызываете функцию mysql_insert
(функцию, которую я никогда не видел и не могу " t найти на php.net, поэтому я склонен думать, что ничего не собирается делать). Быстрый поиск приведет вас ко многим подробным руководствам и пошаговым инструкциям о том, как использовать mysqli
, поэтому я буду откладывать их, а не пытаться объяснить все здесь (так как вы все равно пытаетесь решить проблему POST).
1] Вам не нужно использовать PDO; mysqli является прекрасным и полностью приемлемым, если вы используете его правильно ( вот некоторые сведения об обоих из php.net напрямую ).
2] Я никогда не видел стандарта, который указывает использование строчной «почты» вместо «POST» в <form>
, но хотел бы иметь ссылку на него!
3] <input type="submit" value="text">
и <button type="submit">text</button>
функционально такие же, как и в, обе будут отправлять форму без проблем. Есть некоторые различия между ними (возможность динамически устанавливать «значение» вместо того, что-то вроде «innerHTML» для текста , например, но это еще одна проблема.
Что касается дальнейших усилий по отладке … В register.php
, как упоминалось в «Орионах», мне любопытно, что возвращает отчет $_SERVER['REQUEST_METHOD']
. В начале этого файла попробуйте die($_SERVER['REQUEST_METHOD'])
и посмотрите, что он говорит. Если он говорит «POST», вы на правильном пути. Если вы выполните var_dump($_POST);
в начале этого файла, со смертью / выходом после этого, что вы видите?
Было 2 экземпляра, где перенаправление лишало меня моих переменных POST, вызванных mod_rewrites, как я помню. Один из них перенаправлял запросы от mydomain.com
на www.mydomain.com
, и поскольку action
моей формы было явно mydomain.com
, все было потеряно. Другой проблемой был mod_rewrite, который был либо добавлением, либо снятием трейлинга /
с запросов (я не помню, какой), но это также имело тот же базовый результат. Если у вас есть файл .htaccess
, проверьте, чтобы убедиться, что ничего гнусного или не получено.
Другие вещи для проверки:
a] В вашем php.ini
убедитесь, что variables_order
имеет «P» в ней где-то ( ссылка )
b] Также в вашем php.ini убедитесь, что post_max_size
– это что-то разумное; Я сомневаюсь, что это проблема, поскольку вы не загружаете файл, но если он был настроен на что-то очень маленькое, я могу себе представить, что это может быть проблема
c] Если вы отправляете с http
страницы на страницу https
, иногда это будет лишать данные POST (это может быть специфично для сервера, поскольку я чувствую, что видел эту работу иногда, а не другие)
d] Вы получили file_get_contents("php://input");
как было предложено в другом месте? Он содержал ваши данные (будет выглядеть примерно так: key1=value1&key2=value2
) или он был слишком пустым?
e] Если вы создаете другую форму на другой странице и отправляете ее в другой файл, заполняется ли массив $ _POST?