Я разрабатываю небольшое приложение для обучения.
Для этого приложения у меня есть база данных Mysql, где каждая строка является "задачей". Каждая задача имеет одно поле "статус", в том числе id_task. Когда я нажимаю кнопку, вызов AJAX отправляет запрос в файл PHP, где статус обновляется и результаты извлекаются.
Возможные значения статуса: NULL (по умолчанию) "DONE" и "REMOVE".
Я использую его для создания списка со всеми задачами, и в зависимости от состояния текст будет отображаться зеленым цветом ("DONE"), черным цветом по умолчанию ("NULL") или не появится ("REMOVE").
Да, я мог бы просто удалить "удаленные" задачи, но я предпочитаю поддерживать их в базе данных, если я хочу, чтобы пользователь смог их восстановить
Все работает отлично, когда функция php, которую я создал для этого, имеет этот sql-запрос:
public function retrieveDataByID($p_id_task)
{
$result="";
$arraySubjects=array();
$this->openConnection();
$sql="SELECT * FROM tareas where id_task=".$p_id_task;
$result=mysqli_query($this->connection, $sql);
if($result !=null)
{
while($fila=mysqli_fetch_assoc($result))
{
$arrayEditedSubjects[]=$fila;
}
}else{
//echo "no results";
}
$this->closeConnection();
return $arrayEditedSubjects;
}
Но когда я хочу отфильтровать запрос, чтобы строки со статусом "REMOVE" не отображались, список не генерируется, и вызов AJAX вызывает эту ошибку:
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
Я не знаю, что может пойти не так. Вот код с проблемным запросом:
public function retrieveDataByID($p_id_task)
{
$result="";
$arraySubjects=array();
$this->openConnection();
$sql="SELECT * FROM tareas where (id_task=".$p_id_task.") AND (status <> 'REMOVE')";
$result=mysqli_query($this->connection, $sql);
if($result !=null)
{
while($fila=mysqli_fetch_assoc($result))
{
$arrayEditedSubjects[]=$fila;
}
}else{
//echo "no results";
}
$this->closeConnection();
return $arrayEditedSubjects;
}
Вот вызов AJAX, который выдает ошибку, в случае, если это может вам помочь:
$.ajax({
method:"post",
data:{'day_and_month':cellIDValue},
url:"assets/php/retrieve.php",
success:function(result){
let parsedResult=JSON.parse(result);
buildList("#subjectDiv",parsedResult);
},
error: function(xhr){
alert(xhr.status);
}
});
И вот файл retrieve.php, называемый функцией AJAX
<?php
require_once('models/Connect.php');/*this is where the retrieveDataByID function is defined*/
$arrayJSONresults=array();
$objConexion=new Connection;
$arrayJSONresults= $objConexion->retrieveData($_POST['day_and_month']);
echo json_encode($arrayJSONresults);
?>
Я исправил его, выполнив следующий запрос:
$sql="SELECT * FROM tareas where (id_task=".$p_id_task.") AND ((status IS NULL) OR (status <> 'REMOVE'))";
Поскольку статус по умолчанию NULL, мне пришлось сначала оценить, если статус IS NULL (в другом случае я прочитал, что SQL-движок не может его правильно оценить).
Затем, если это NULL или отличается от "REMOVE" (это означает, что NULL или "DONE"), он будет показан в списке.
Может быть, я делаю этот статус по умолчанию, это что-то отличное от NULL, чтобы этого избежать, но теперь я узнал что-то новое.
echo "no results";
не является json, и если он получит вывод перед json, тогда весь ответ будет недействительным. Ответ JSON должен содержать только одно эхоconsole.log(result);
просмотреть ответ в консоли браузера для отладки