
24.12.2015, 23:30
|
Профессор
|
|
Регистрация: 20.09.2012
Сообщений: 151
|
|
Преобразование JSON в AJAX'е возможно только с "чистыми" php-файлами?
Добрый день. Когда совершал передачу данных по ajax (подзагрузка контента) заметил такую проблему. Полученные данные с серверного файла (в виде json) js преобразует их в объект (JSON.parse) на стороне клиента лишь в том случае, если данные, которые прислал php, получены только с файла, c отсутствующими выражениями include, require_once и т.д.
В случае с имеющимися include в серверном файле, js возвращает строку - json_encode, с которой ничего поделать нельзя.
Скажите, в порядке ли это вещей такое поведение и можно ли как-то использовать include ?
|
|

25.12.2015, 00:22
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от hoax
|
js преобразует их в объект (JSON.parse) на стороне клиента лишь в том случае, если данные, которые прислал php, получены только с файла, c отсутствующими выражениями include, require_once и т.д.
|
Ответ сервера клиенту не зависит от включений, они практически всегда будут, а вот если подключение производится некорректно в результате чего переменная окажется пустой, а это может быть и данные для JSON, то и клиент не получит валидных данных.
Так что ищите ошибки на сервере, и свои, а не в конструкциях РНР.
|
|

25.12.2015, 01:34
|
Профессор
|
|
Регистрация: 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 включенного файла.
|
|

25.12.2015, 05:37
|
без статуса
|
|
Регистрация: 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.
|
|

25.12.2015, 06:03
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Deff
|
а ежли строку включение кодирнуть через encodeURIcomponent
|
Нет в РНР encodeURIcomponent, есть rawurlencode, да и оно тут не при чем. Скорее всего, если речь идет о "предыдущем", при подключении, то пытаются скрестить некие данные с json, что в итоге не будет уже json, которые ожидает клиент.
|
|

25.12.2015, 06:15
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
laimas,
Ну типично вставляешь код запроса сконкантинированного с параметрами в окно браузера и смотришь: Что серв отдаёт ...
Мон по формату объекта понять чо смудрили
Последний раз редактировалось Deff, 25.12.2015 в 06:19.
|
|

26.12.2015, 14:09
|
Профессор
|
|
Регистрация: 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.
|
|

26.12.2015, 14:11
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
hoax,
Cделайте скриншот того, что серв при этом отдаёт в браузер(см как посмотреть) Тады мон понять, чего портиться
|
|

26.12.2015, 14:34
|
Профессор
|
|
Регистрация: 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 и смеси.
|
|

26.12.2015, 14:44
|
Профессор
|
|
Регистрация: 20.09.2012
Сообщений: 151
|
|
Всем спасибо, разобрался.
Дело было в следующем. AJAX возвращает любой вариант, который был получен, хоть json, хоть php-строку. Когда функция принимала значение ответа (какой бы он не был), он шел в преобразование JSON.parse, но если ответ не является json-форматом, были проблему преобразования на стороне клиента.
В итоге сделал следующее. Проверил на стороне клиента, является ли полученный ответ json-объектом? Если да, то перебрать его через цикл и опубликовать,если же это строка (например) (echo 'string'), то просто опубликовать полученный response. 
|
|
|
|