2014-11-24 2 views
-1

У меня есть окно поиска, в котором пользователь вводит номер ISBN, когда он отправляется . Div отображает информацию из API Google Книги. Эта информация извлекается из файла JSON в стандартном формате. Я могу отображать заголовок, субтитры, автор и описание в div без проблем.JSON Google Books и Ajax

я тогда иметь «Добавить в библиотеку» кнопку, которая должна направить всю эту информацию в базу данных, моя проблема заключается в том, что все поля отправить обособленно от авторов. Вместо отправки имен авторов в базу данных отправляется слово 'Array'.

Единственный способ получить имя автора для отправки - это добавить [0] в конец моего объекта данных Ajax, однако это отправляет только имя первого автора (если есть 3 автора, то два будут оставлены вне).

Обновление - Кажется, что это связано с JSON, если я изменяю данные Ajax на все, кроме «авторов», «отраслевые идентификаторы» или «категории», это работает. Это потому, что они содержат список и не являются одиночными строками?

JS

$(document).ready(function() { 

    $('#submit').click(function(ev) { 
     ev.preventDefault(); 
     var isbn = $('#isbn_search').val(); //get isbn direct from input, no need for php 
     var url='https://www.googleapis.com/books/v1/volumes?q='+isbn; 
     $.getJSON(url,function(data){ 
      $('.result').empty(); 
      $.each(data.items, function(entryIndex, entry){ 
       var html = '<div class="results well">';      
       html += '<h3>' + entry.volumeInfo.title + '</h3>';     
       html += '<h5>' + entry.volumeInfo.subtitle + '</h5>'; 
       html += '<p>' + entry.volumeInfo.authors + '</p>';    
       html += '<p>' + entry.volumeInfo.description + '</p>'; 
       $('.result').append(html); 
      });       
     }); 
    }); 
}); 

AJAX

$.ajax({ 
    type: 'POST', 
    url: 'addIsbnScript.php', 
    data: { 
     'isbn' : isbn, 
     'title' : entry.volumeInfo.title, 
     'subtitle' : entry.volumeInfo.subtitle, 
     'authors' : JSON.stringify(entry.volumeInfo.authors), 
     'description' : entry.volumeInfo.description 
    }, 
    success: function() { 
    $("#add").prop('disabled', true); 
    } 
}); 

PHP

$isbn = $_POST['isbn']; 
$title = $_POST['title']; 
$subtitle = $_POST['subtitle']; 
$authors = $_POST['authors']; 
$decoded_authors = json_decode($authors); 
print_r($decoded_authors); 
$description = $_POST['description']; 

$query = $conn->prepare("INSERT INTO `isbn` (isbn_num,title,subtitle,authors,description) VALUES (?,?,?,?,?)"); 

$query->bind_param('issss', 

$isbn, 
$title, 
$subtitle,  
$decoded_authors, 
$description   
     ); 

JSON

"volumeInfo":{ 
"title":string, 
"subtitle":string, 
"authors":[ 
string 
], 
"publisher":string, 
"publishedDate":string, 
"description":string, 
"industryIdentifiers":[ 
{ 
"type":string, 
"identifier":string 
} 
], 
"pageCount":integer, 
"dimensions":{ 
"height":string, 
"width":string, 
"thickness":string 
}, 
"printType":string, 
"mainCategory":string, 
"categories":[ 
string 
], 
"averageRating":double, 
"ratingsCount":integer, 
"contentVersion":string, 
"imageLinks":{ 
"smallThumbnail":string, 
"thumbnail":string, 
"small":string, 
"medium":string, 
"large":string, 
"extraLarge":string 
}, 
"language":string, 
"previewLink":string, 
"infoLink":string, 
"canonicalVolumeLink":string 
}, 

Пожалуйста, простите код, если это очень любитель, как я новичок в JS, и это только для личного развития.

+1

Как насчет '' authors ': JSON.stringify (entry.volumeInfo.authors), '? Затем проанализируйте его на стороне сервера и продолжите? –

+0

FYI: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

+1

Благодаря @Rory теперь он отправляет значения в следующем формате ["Chris Cleave", " «Филиппа Грегори», «Сара Пекканен», поэтому я посмотрю на разбор серверной части JSON. Я скоро обновлю. –

ответ

1

Вам нужно будет декодировать его на стороне клиента, чтобы передать массив на сервер. Что-то вроде:

$.ajax({ 
    type: 'POST', 
    url: 'addIsbnScript.php', 
    data: { 
     'isbn' : isbn, 
     'title' : entry.volumeInfo.title, 
     'subtitle' : entry.volumeInfo.subtitle, 
     'authors' : JSON.stringify(entry.volumeInfo.authors), 
     'description' : entry.volumeInfo.description 
    }, 
    success: function() { 
    $("#add").prop('disabled', true); 
    } 
}); 

Тогда в вашем PHP файл (addIsbnScript.php)

<?php 
    $authors = $_POST['authors'];//'["Chris Cleave","Philippa Gregory","Sarah Pekkanen"]' 
    $decoded_authors = json_decode($authors); 
    print_r($decoded_authors);// Array ([0] => Chris Cleave [1] => Philippa Gregory [2] => Sarah Pekkanen) 
?> 

Надеется, что это помогает. Cheers

+1

Спасибо @Rory, теперь у меня есть понимание того, что я должен делать. Хотя, когда я следую вашему коду, он по-прежнему отправляет авторов в формате [«Chris Cleave», «Philippa Gregory», Сара Пекканен - ​​я почти добираюсь туда! –

+0

Да и на стороне сервера вы можете использовать 'json_decode', чтобы вернуть массив и использовать его в соответствии с вашими потребностями. –

+0

Спасибо за совет, однако, когда я использую обновленный код (см. Оригинальный вопрос), слово «Array» отправляется в базу данных?Это проблема с моим запросом? –

Смежные вопросы