Отправка массива дат из JS на страницу php

У меня есть массив JS «edit_date», содержащий несколько дат. Я хочу отправить массив на страницу php, которая будет храниться в базе данных.
Вместо использования JSON и jquery я использовал мои коды, как это:

var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          document.getElementById("a").innerHTML= this.responseText; 
       }
    };
    xhttp.open("GET", "page_name.php?a=" + edit_date , true);
    xhttp.send(); 

таким образом, данные поступают в php как строки. поэтому я разделяю строку на массив в php, как:

$data = $_REQUEST['a'];
$data2= $_REQUEST['b'];
$student_id= $_REQUEST['c'];
$array=(explode(",",$data));

и скрыл все элементы массива до формата даты и вставил его в базу данных, как:

foreach($array as $e)
{
 $date= date("d-m-Y", strtotime($e));
 $sql= "INSERT into student_connects_teacher_date (teacher_id,student_id,dates) values ('$data2','$student_id','$e')";
  if(!mysqli_query($con,$sql))
      {
            die("error". mysqli_connect_error());
      }
}

До сих пор все шло хорошо. Но я хочу знать, является ли это хорошим подходом? Я использовал это, так как использование json и jquery не сработало для меня. Будет ли этот подход давать какие-либо проблемы в будущем, если мне нужно использовать данные?
Если это не хороший подход, то в чем причина?

1 ответ

  1. Перед преобразованием даты в метку времени необходимо проверить, является ли дата в $e действительной. Я не знаю формат вашего ввода, но есть несколько способов сделать это. Например, класс DateTime PHP:

    if (DateTime::createFromFormat('Y-m-d H:i:s', $e) === false) {
        // invalid date, so skip
        continue;
    }
    

    Кроме того, вам действительно нужно использовать подготовленные и параметризованные операторы для ваших запросов, потому что прямо сейчас вы уязвимы для SQL-инъекции. Никогда не следует включать переменные в такие запросы.

    Вы контролируете значение значения даты и формата (после проверки), но вам также может понадобиться что-то вроде метода htmlspecialchars (), чтобы очистить материал в отношении XSS.

    Возможное решение для отсутствия уязвимости для SQL-инъекции:

    $stmt = mysqli_prepare($con, "INSERT into student_connects_teacher_date (teacher_id,student_id,dates) values (?, ?, ?)");
    mysqli_stmt_bind_param($stmt, 'sis', $data2, $student_id, $e);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
    

    Кроме того, создание и закрытие оператора может быть выполнено вне цикла foreach.

    Sidenote: если вы просто хотите развернуть строку, вам не нужна дополнительная скобка.

    $array=(explode(",",$data));
    

    Можно просто:

    $array = explode(",", $data);
    

    Оберточные выражения или что-либо в скобках могут возвращать разные результаты, поскольку PHP обрабатывает их по-разному.