Отправка формы PHP - синтаксические ошибки - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть довольно простая форма HTML:

HTML:

<form method="POST" id="form-1" name="form-1">
   <p>     
      <input type="text" name="fm1q1">
      <input type="number" name="fm1q1-score">
   </p>
   <p>     
      <input type="text" name="fm1q2">
      <input type="number" name="fm1q2-score">
   </p>
   <p>     
      <input type="text" name="fm1q3">
      <input type="number" name="fm1q3-score">
   </p>
   <p>     
      <input type="text" name="fm1q4">
      <input type="number" name="fm1q4-score">
   </p>
   <p>     
      <input type="text" name="fm1q5">
      <input type="number" name="fm1q5-score">
   </p>
   <button type="submit" name="submit">SUBMIT</button>
</form>

Я использую простой вызов Ajax:

$('#form-1').on('submit', function(e){
    e.preventDefault();
    $.ajax({
        type:   'POST',
        url:    'submitForm.php',
        data:   $(this).serialize(),
        success: function(data){
            console.log(data);
        },
        error: function(xhr, ajaxOptions, thownError){
            console.log(xhr.status);
            console.log(thrownError);
        }
    });
});

PHP, который вставляет данные формы в таблицу БД MySQL, выглядит следующим образом:

require "config.php"; // Contains all my connection information 
$answers = array($_POST['fm1q1'], $_POST['fm1q2'], $_POST['fm1q3'], $_POST['fm1q4'], $_POST['fm1q5']);
$scores = array($_POST['fm1q1-score'], $_POST['fm1q2-score'], $_POST['fm1q3-score'], $_POST['fm1q4-score'], $_POST['fm1q5-score']);

for ($i = 0; $i < 5; $i++) { 
   $sql = "INSERT INTO table_1 (answer, score) VALUES ('$answers[$i]', '$scores[$i]')";
   $result = mysqli_query($conn, $sql);
   if (!$conn->query($result) === TRUE) {
      echo "Error: " . $sql . "--" . $conn->error. "\n";
   }
 }

$conn->close();

Проблема, с которой я сталкиваюсь, состоит в том, что мои Инструменты разработчика говорят, что у меня есть ошибка синтаксиса в $sql= строка, но я не вижу, что не так.

Error: INSERT INTO table_1 (answer, score) VALUES ('test', '123')--You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1' at line 1

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы пытаетесь выполнить запрос дважды.Однажды здесь:

mysqli_query($conn, $sql)

и однажды здесь:

$conn->query($result)

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

Что вас смутило, так это то, что вы выводите свой первый запроспосле проверки, не прошел ли ваш второй запрос.Таким образом, вы вводите себя в заблуждение при отладке.

Просто удалите вторую попытку запроса.У вас уже есть результаты первого:

$result = mysqli_query($conn, $sql);
if ($result !== TRUE) {
    echo "Error: " . $sql . "--" . mysqli_error($conn) . "\n";
}

Вы определенно должны сделать выбор: использовать функцию нотации функции или нотацию объекта с mysqli и оставаться в соответствии с вашим выбором.Попытка смешать эти два может работать в некоторых случаях, но в конечном итоге это может привести к путанице, как это.

Также и это важно ... Ваш код широко открыт * от 1025 * до SQL-инъекция .PHP предоставляет значительную информацию о том, что это означает здесь этот является отличной отправной точкой для исправления.Независимо от того, как вы подходите к этому, суть в том, что вы никогда не должны помещать изменяемые пользователем данные непосредственно в запрос , как если бы он был частью кода .Это позволяет пользователю ввести фактический код в ваш запрос.

0 голосов
/ 05 февраля 2019

Не вся проблема в вашем коде - но первоначальное сообщение об ошибке вызвано тем, что имя таблицы имеет подчеркивание.

Обновите ваш SQL-запрос так:

"INSERT INTO `table_1` (answer, score) VALUES ('$answers[$i]', '$scores[$i]')";

Это должно решитьошибка mysql, которую вы видели.

Однако - вам также нужно изучить вопрос, чтобы улучшить ваш запрос.Посмотрите на экранирование значений (никогда не доверяйте опубликованным данным, которыми можно манипулировать, чтобы просто записать в вашу базу данных), или в идеале используйте подготовленные операторы.

...