Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Unexpected end of JSON input (https://javascript.ru/forum/events/72015-unexpected-end-json-input.html)

mazahaler 29.12.2017 18:07

Unexpected end of JSON input
 
Здравствуйте, я пытаюсь получить данные с бд с помощью ajax.
Вот jquery:
$(function(){
   
    $("#docslistp").one("click",function(){
            $('#ajaxsuccessdoc').find('.doctext1').each(function(i, elem) {
               
                
                $( '#ajaxsuccessdoc' ).on('click','#updlistd'.concat(i),function() {
                    var ldocname=$('#ldocname'.concat(i)).text();
                    var ldocdesc=$('#ldocdesc'.concat(i)).text();
                    var id=i+1;
                    $.ajax({
                        type:"POST",
                        url: "UPDDOCLIST.php",
                        data:{  ldocname:ldocname,
                                ldocdesc:ldocdesc,
                                id:id},
                        success:function(data){
 
                            var newData = jQuery.parseJSON(data);
                            $('#namel'.concat(i)).val(newData.name);
                            $('#descl'.concat(i)).val(newData.desc);
                            
                        }
                    });
 
                  $( "#flist".concat(i) ).toggle( "slow", function() {
                    
                });
            });
        });
        });
   
    });

Вот UPDDOCLIST.php
<?php
require_once '../connection.php';
 
if (isset($_POST['ldocname'])&& !empty($_POST['ldocname']) && isset($_POST['ldocdesc'])&& !empty($_POST['ldocdesc'])&& isset($_POST['id'])&& !empty($_POST['id'])){
 
    $Name=strval($_POST['ldocname']);
    $Desc=strval($_POST['ldocdesc']);
    $ID=intval($_POST['id']);
    /* echo $Name; */
 
    $query =$db->query("SELECT * FROM `docarcitem` WHERE `String2`='$Name' AND `String7`='$Desc' AND `ID`=$ID");
 
    while ($row = $query->fetch()) {
        $array = array(
            
            'name'=>$row->String2,
            'desc'=>$row->String7
 
        );
        echo json_encode($array);
 
 
    }
 
}else{
    echo "Параметры не переданы";
}
?>

Скрипт выполняется, но ничего не возвращает. Также в консоли я получаю ошибку "Unexpected end of JSON input". Ошибка указывает на строку:var newData = jQuery.parseJSON(data);

Как я могу это исправить?

laimas 29.12.2017 18:44

Цитата:

Сообщение от mazahaler
`String2`='$Name' AND `String7`='$Desc' AND `ID`=$ID"

Так нельзя делать, это опасно!
А ошибка в том, что сервер отдает не JSON, а "кучи json строк". Сперва нужно получить данные запроса, которые в JSON и отдавать.

mazahaler 29.12.2017 19:12

Цитата:

Сообщение от laimas (Сообщение 474011)
Сперва нужно получить данные запроса, которые в JSON и отдавать.

Спасибо, можете пожалуйста написать пример?

laimas 29.12.2017 21:23

Вместо строк 13 - 23 получайте сразу весь набор как $query->fetchAll(), который и отдавайте как JSON.

exit(json_encode($query->fetchAll()));


Если предполагается диалог либо JSON, либо текст, то каким образом клиент поймет что ему пришло, если ему не сообщаться это? Либо передавайте заголовки сообщающие тип данных и разбирайтесь. Либо всегда отдавайте json и заголовок для него, в этом случае на клиенте при получении массива будет объект, а при получении "Параметры не переданы", будет строка.

Данные полученные извне подставлять в запрос не фильтруя ни в коем случае нельзя! Либо сами обрабатывайте их, либо используйте подготовленные запросы драйвера SQL.

mazahaler 29.12.2017 21:46

laimas,
Спасибо!

mazahaler 30.12.2017 00:05

laimas,
еще вопрос. Вот допустим в переменной я получил массив вида:
[{"ID":"8","MainID_Ref":"3510","ParentType":"60","ObjectType":"117","String1":null,"String2":"222","String3":null,"String4":null,"String5":null,"String6":null,"String7":"222","String8":null,"String9":null,"String10":null,"LongInt1":null,"Double1":null,"Double2":null,"Memo1":null,"Memo2":null}]

Как теперь можно обратится к конкретному элементу? Например я хочу вывести только String2

рони 30.12.2017 00:14

mazahaler,
var data = [{
    "ID": "8",
    "MainID_Ref": "3510",
    "ParentType": "60",
    "ObjectType": "117",
    "String1": null,
    "String2": "222",
    "String3": null,
    "String4": null,
    "String5": null,
    "String6": null,
    "String7": "222",
    "String8": null,
    "String9": null,
    "String10": null,
    "LongInt1": null,
    "Double1": null,
    "Double2": null,
    "Memo1": null,
    "Memo2": null
}]
alert(data[0].String2);

mazahaler 30.12.2017 00:30

рони,
Большое спасибо!

laimas 30.12.2017 08:07

mazahaler,
судя по объекту, вы запрашиваете одну запись из БД, а значит ни каких ни while, ни fetchAll, а так:

exit(json_encode($query->fetch()));


и клиент получит не массив объектов, а объект, получить в котором свойство так:

data.String2


Часовой пояс GMT +3, время: 07:37.