Запрос Mysql вызывает проблемы с JSON.parse в PHP

avatar
FranP
7 апреля 2018 в 22:20
47
1
0

Я разрабатываю небольшое приложение для обучения.

Для этого приложения у меня есть база данных Mysql, где каждая строка является «задачей». У каждой задачи есть одно поле «статус», например id_task. Когда я нажимаю кнопку, вызов AJAX отправляет запрос в файл PHP, где обновляется статус и извлекаются результаты.

Возможные значения состояния: NULL (по умолчанию), "DONE" и "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;

}

Но когда я хочу отфильтровать запрос, чтобы строки со статусом "УДАЛИТЬ" не отображались, список не создается, и вызов 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);



?>
Источник
charlietfl
7 апреля 2018 в 22:26
2

echo "no results"; не является json, и если он выводится перед json, то весь ответ недействителен. Ответ json должен содержать только одно эхо

mcv
7 апреля 2018 в 22:31
2

попробуйте console.log(result); просмотреть ответ в консоли браузера в целях отладки

FranP
7 апреля 2018 в 22:32
0

@charlietfl исправил это, но у меня все еще та же проблема.

charlietfl
7 апреля 2018 в 22:36
1

Посмотрите, что на самом деле отправляется с сервера, проверив запрос в сети инструментов разработчика браузера. Вы можете посмотреть там тело ответа и скопировать его в валидатор json и/или понять, почему он не работает.

Raymond Nijland
7 апреля 2018 в 22:55
1

Не по теме: $arrayJSONresults=""; разве вы не должны определять $arrayJSONresults = array(); или $arrayJSONresults = []; вместо этого для лучшей читабельности. Как вы сделали со своим $arraySubjects=array();

FranP
7 апреля 2018 в 23:08
0

@RaymondNijland Правда, я этого не заметил!

Ответы (1)

avatar
FranP
7 апреля 2018 в 22:50
0

Я исправил это, выполнив следующий запрос:

$sql="SELECT * FROM tareas where (id_task=".$p_id_task.") AND ((status IS NULL) OR (status <> 'REMOVE'))";

Поскольку статус по умолчанию равен NULL, я должен был сначала оценить, является ли статус NULL (в другом случае, я прочитал, что механизм SQL не может правильно его оценить).

Тогда, если оно НУЛЕВОЕ или отличается от "УДАЛИТЬ" (это означает, НУЛЕВОЕ или "ГОТОВО"), оно будет показано в списке.

Возможно, я делаю, что статус по умолчанию отличается от NULL, чтобы избежать этого, но сейчас я узнал кое-что новое.