AJAX запрос ответ на JSON

336
29 декабря 2017, 01:31

Нужно работать с полученными данными как с объектом или массивом, но не могу.
Нужно парсить ответ в responseText от сервера, но у меня не получается.
Покажите, где я сделал ошибку?!
jQuery не учил, поэтому ответы дайте на чистом JavaScript.

index.php:

<?php
require 'rb.php';
R::setup( 'mysql:host=127.0.0.1;dbname=test111','root', '' );
?>
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 without BOM" >
<head>
<script type="text/javascript">
  function getXmlHttp() {
    var xmlhttp;
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
      xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
  }
  function summa() {
    var jsnReq = {
  "authorid": document.getElementById("a").value
  }
  var data = JSON.stringify( jsnReq );
    var httpReq = getXmlHttp(); 
    httpReq.open('POST', 'load.php', true); // Открываем асинхронное соединение
    httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Отправляем кодировку
    httpReq.send('id=' + data); // Отправляем POST-запрос
    httpReq.onreadystatechange = function() { // Ждём ответа от сервера
      if (httpReq.readyState == 4) { // Ответ пришёл
        if(httpReq.status == 200) { // Сервер вернул код 200        
          var baad = httpReq.responseText;
          data = JSON.parse(baad);// парсим полученую строку
           document.getElementById('xmls').innerHTML = data; // i nihrena ne rabotaet sukabliat'
        }
      }
    };
  }
</script>
<div>
  <fieldset name="set"> <legend>Выбираем автора!</legend>
<select id="a" name="author" size="1" onchange="summa()">
  <option>--</option>
<?php
$resulta = R::findAll('author', 'ORDER BY id');
foreach ($resulta as $result) {
echo '<option value='.$result->id.'>'.$result->author_name.'</option>';
}
?>
</select><br>
</fieldset>
 <fieldset name="set"> <legend>Выбираем какие книги он написал!</legend>
  <select id="b" name="book" size="1" >
  <option>--</option>
  </select>
<div id="summa"></div>
</fieldset>
 <fieldset name="set"> <legend>Описание книги!</legend>
<div id="xmls"></div>
<div id="xml"></div>
</fieldset>
</div>
</body>
</html>

load.php

<?php
require 'rb.php';
R::setup( 'mysql:host=127.0.0.1;dbname=test111','root', '' );
$data = $_POST;
$decode = json_decode($data['id']);
$resulta = R::load('author',1/*$decode->authorid*/);
$resultb = $resulta->sharedBook;
//$resultBook = array ( //заполняем массив
//  'authId'=>'"'.$resulta->id.'"',
//  'authorName'=>'"'.$resulta->author_name.'"',
//);

foreach ($resultb as $result) {
    $resultBook[] = array ( 'book' => array ( //заполняем массив в массиве (двумерный массив)
        'bookId'=>'"'.$result->id.'"',
        'bookName'=>'"'.$result->book_name.'"',
    )
);
}
echo json_encode($resultBook);
?>

а это результат в responseText.

[{"book":{"bookId":"\"1\"","bookName":"\"\u0425\u043e\u043b\u043e\u0434\u043d\u043e\u0435 \u043c\u043e\u043b\u043e\u043a\u043e\""}},{"book":{"bookId":"\"2\"","bookName":"\"\u0411\u0438\u0442\u0432\u0430 \u0431\u043e\u0431\u0440\u043e\u0432\""}},{"book":{"bookId":"\"3\"","bookName":"\"\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0448\u0438\u0431\u0430\u043d\u0443\u0442\u043e\u0433\u043e \u043c\u043e\u043b\u043d\u0438\u0435\u0439 \u043f\u0440\u0438\u0448\u0435\u043b\u044c\u0446\u0430\""}},{"book":{"bookId":"\"4\"","bookName":"\"\u0421\u0445\u0435\u043c\u0430 \u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u044f\""}},{"book":{"bookId":"\"5\"","bookName":"\"\u0425\u0438\u0442\u0440\u044b\u0439 \u0432\u043e\u043b\u043a\""}},{"book":{"bookId":"\"6\"","bookName":"\"\u0420\u044b\u0431\u0430 \u0442\u043e\u0436\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\""}}]

Спасибо за внимание.

Answer 1

var dataStr = '[{"book":{"bookId":"1","bookName":"\u0425\u043e\u043b\u043e\u0434\u043d\u043e\u0435 \u043c\u043e\u043b\u043e\u043a\u043e"}}]'; 
var data = JSON.parse(dataStr); 
console.log(data);

Вам надо убрать из данных, формируемых на сервере, лишние двойные кавычки. Попробуйте:

 'bookId'=>$result->id,
 'bookName'=>$result->book_name,

Update

var data = JSON.parse(baad);
for(var i = 0; i < data.length; i++) {
  var item = data[i];
  if (item.book) {
    var bookElement = document.createElement("option");
    bookElement.setAttribute("value", item.book.bookId);
    bookElement.innerText = item.book.bookName;
    document.getElementById('b').appendChild(bookElement);
  }
}
READ ALSO
Regexp для img (jpg, jpeg, png)

Regexp для img (jpg, jpeg, png)

Нужно регулярное выражение для проверки url картинки, те

246
Как поменять слова местами в переменной (PHP)

Как поменять слова местами в переменной (PHP)

Всегда содержит два слова temp1 temp2

266
База данных WordPress возвратила ошибку Server shutdown in progress

База данных WordPress возвратила ошибку Server shutdown in progress

Написан парсерПри вносе в базу данных чем больше она становится тем медленнее грузится

227
Регистрация и авторизация на сайте php

Регистрация и авторизация на сайте php

Пишу биржу телеграм, столкнулся с такой проблемой: для некоторых действий на сайте нужно сначала войти в системуКак сделать, чтобы при переходе...

278