Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.12.2015, 23:30
Профессор
Отправить личное сообщение для hoax Посмотреть профиль Найти все сообщения от hoax
 
Регистрация: 20.09.2012
Сообщений: 151

Преобразование JSON в AJAX'е возможно только с "чистыми" php-файлами?
Добрый день. Когда совершал передачу данных по ajax (подзагрузка контента) заметил такую проблему. Полученные данные с серверного файла (в виде json) js преобразует их в объект (JSON.parse) на стороне клиента лишь в том случае, если данные, которые прислал php, получены только с файла, c отсутствующими выражениями include, require_once и т.д.

В случае с имеющимися include в серверном файле, js возвращает строку - json_encode, с которой ничего поделать нельзя.

Скажите, в порядке ли это вещей такое поведение и можно ли как-то использовать include ?
Ответить с цитированием
  #2 (permalink)  
Старый 25.12.2015, 00:22
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от hoax
js преобразует их в объект (JSON.parse) на стороне клиента лишь в том случае, если данные, которые прислал php, получены только с файла, c отсутствующими выражениями include, require_once и т.д.

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

Так что ищите ошибки на сервере, и свои, а не в конструкциях РНР.
Ответить с цитированием
  #3 (permalink)  
Старый 25.12.2015, 01:34
Профессор
Отправить личное сообщение для hoax Посмотреть профиль Найти все сообщения от hoax
 
Регистрация: 20.09.2012
Сообщений: 151

В том-то и дело, что переменная не пустая, если возвращать результат ответа json_encode, без преобразования JSON.parse, то echo вернет строку вида : '{one:"one",...}', но к сожалению с ней ничего сделать не получается.


Специально создал два новых файла, без включений :

<html>
<body>

<div id="id01">er</div>

<script>
var xmlhttp = new XMLHttpRequest();
var url = "testphp.php";

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var myArr = JSON.parse(xmlhttp.responseText);
        myFunction(myArr);
    }
};
xmlhttp.open("GET", url, true);
xmlhttp.send();

function myFunction(arr) {
    var out = "";
    var i;
    for(i = 0; i < arr.length; i++) {
        out += arr[i].id;
    }
    document.getElementById("id01").innerHTML = out;
}
</script>

</body>
</html>


header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");



$conn = new mysqli('localhost', 'root', '', 'cms');

$result = $conn->query("SELECT* FROM materials");

$o = null;
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    $o[] = $rs;
}


$conn->close();

echo json_encode($o);


При таком раскладе, все ок, результат json можно разобрать и преобразовать в объект-сущности. Результат данного скрипта - 1234567...номера ID столбцов вообщем.

Но как только в серверном файле указать include 'test.php' в котором ничего кроме 'echo 'простого текста';' нету, ajax отказывается возвращать предыдущий результат и возвращает echo включенного файла.
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2015, 05:37
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

hoax,
Ну а ежли строку включение кодирнуть через encodeURIcomponent и добавить к объекту как текстовую переменную ?
Типа {..... тут что-то уже есть, echo:"echo%20'%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE %D0%B3%D0%BE%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B 0'%3B" }

Дайте ссылку на получение сгенерированный json oтвета,
Вставляете полную ссылку json (Aякс) запроса в окно браузера, и смотрите чо там у Вас на странице с ответом творится
Наверняка нарушена структура передаваемого объекта

Последний раз редактировалось Deff, 25.12.2015 в 05:49.
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2015, 06:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Deff
а ежли строку включение кодирнуть через encodeURIcomponent

Нет в РНР encodeURIcomponent, есть rawurlencode, да и оно тут не при чем. Скорее всего, если речь идет о "предыдущем", при подключении, то пытаются скрестить некие данные с json, что в итоге не будет уже json, которые ожидает клиент.
Ответить с цитированием
  #6 (permalink)  
Старый 25.12.2015, 06:15
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

laimas,
Ну типично вставляешь код запроса сконкантинированного с параметрами в окно браузера и смотришь: Что серв отдаёт ...
Мон по формату объекта понять чо смудрили

Последний раз редактировалось Deff, 25.12.2015 в 06:19.
Ответить с цитированием
  #7 (permalink)  
Старый 26.12.2015, 14:09
Профессор
Отправить личное сообщение для hoax Посмотреть профиль Найти все сообщения от hoax
 
Регистрация: 20.09.2012
Сообщений: 151

Я не передаю никаких параметров, просто получаю файл (в данном случае). Но даже сейчас я упростил задачу, указав в серверном файле не включение другого файла (как ранее), а простой вывод (echo 'text'), в данном случае ajax возвращает этот самый ECHO, а результат json_encode($o); игнорирует.

Может быть, это связано с тем, что ajax в манипуляциях с json, может возвращать либо JSON-формат, либо ЛЮБОЙ другой результат, как в случае с echo. Простой пример :

1. При таком раскладе все работает.

<!DOCTYPE html>


<html>
<body>

<div id="id01"></div>

<script>
var xmlhttp = new XMLHttpRequest();
var url = "testphp.php";

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var myArr = JSON.parse(xmlhttp.responseText);
        myFunction(myArr);
    }
};
xmlhttp.open("GET", url, true);
xmlhttp.send();

function myFunction(arr) {
    var out = "";
    var i;
    for(i = 0; i < arr.length; i++) {
        out += arr[i].small;
    }
    document.getElementById("id01").innerHTML = out;
}
</script>

</body>
</html>


$conn = new mysqli('localhost', 'root', '', 'cms');

$result = $conn->query("SELECT* FROM materials");

$o = null;
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    $o[] = $rs;
}


$conn->close();

echo json_encode($o); // возвращает  то, что нужно


однако стоит изменить серверный файл вот так

echo json_encode($o);
echo 'text';


все отказывается работать. Результат - не возвращает ничего.

НО. если возвращать данные не в json-формате - все ОК

<html>
<body>

<div id="id01"></div>

<script>
var xmlhttp = new XMLHttpRequest();
var url = "testphp.php";

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        document.getElementById("id01").innerHTML = xmlhttp.responseText;
        //myFunction(myArr);
    }
};
xmlhttp.open("GET", url, true);
xmlhttp.send();

function myFunction(arr) {
    var out = "";
    var i;
    for(i = 0; i < arr.length; i++) {
        out += arr[i].small;
    }
    document.getElementById("id01").innerHTML = out;
}
</script>

</body>
</html>


$conn = new mysqli('localhost', 'root', '', 'cms');

$result = $conn->query("SELECT* FROM materials");

$o = null;
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    $o[] = $rs;
}


$conn->close();

print_r($o); // array
echo 'text'; // выводит

Последний раз редактировалось hoax, 26.12.2015 в 14:12.
Ответить с цитированием
  #8 (permalink)  
Старый 26.12.2015, 14:11
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

hoax,
Cделайте скриншот того, что серв при этом отдаёт в браузер(см как посмотреть) Тады мон понять, чего портиться
Ответить с цитированием
  #9 (permalink)  
Старый 26.12.2015, 14:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от hoax
print_r($o); // array
echo 'text'; // выводит
То есть по вашему это и есть ответ в формате JSON?

Заменить var myArr = JSON.parse(xmlhttp.responseText); на

try {
    var myArr = JSON.parse(xmlhttp.responseText);
} catch (e) {
    alert(e)
}


Смотрим результат при валидном json и смеси.
Ответить с цитированием
  #10 (permalink)  
Старый 26.12.2015, 14:44
Профессор
Отправить личное сообщение для hoax Посмотреть профиль Найти все сообщения от hoax
 
Регистрация: 20.09.2012
Сообщений: 151

Всем спасибо, разобрался.

Дело было в следующем. AJAX возвращает любой вариант, который был получен, хоть json, хоть php-строку. Когда функция принимала значение ответа (какой бы он не был), он шел в преобразование JSON.parse, но если ответ не является json-форматом, были проблему преобразования на стороне клиента.

В итоге сделал следующее. Проверил на стороне клиента, является ли полученный ответ json-объектом? Если да, то перебрать его через цикл и опубликовать,если же это строка (например) (echo 'string'), то просто опубликовать полученный response.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсылаются только цифры: JSON через AJAX xaocbozzz AJAX и COMET 19 27.11.2012 10:53