Основная концепция моей программы:
Страница загружается -> Пользователь нажимает категорию -> Новая боковая панель загружается с сообщениями из выбранной категории -> Пользователь нажимает на публикацию -> Пользователь перенаправляется на URL-адрес публикации
У меня есть сценарий jQuery, который слушает, когда пользователь щелкает категорию. Когда они это делают, он передает это имя категории в PHP, и мой PHP-скрипт запрашивает базу данных.
Скрипт PHP «выводит» два массива: «ID» и «Заголовки». Идея состоит в том, что jQuery затем извлечет оба этих массива, чтобы я мог использовать их дальше в jQuery (для создания нового элемента, содержащего сообщения из выбранной категории), однако я действительно изо всех сил пытаюсь передать два массива в jQuery из моего Скрипт PHP.
Я прикрепил код ниже:
jQuery в index.php
<script>
// jQuery
$(function() { // Ensures content is loaded before jQuery
$('.categories').on('click', function () { //When a user clicks on a category hyperlink
category = this.id; // Set category based on link ID eg. "Cultural Development"
load("get_posts_from_category.php", { // Retrieve all posts in category from database
category: category // POST request information
});
var PHP_ids = <?php echo json_encode($post_ids); ?>; // Copy PHP array of post ID's into jQuery
var PHP_titles = <?php echo json_encode($titles); ?>; // Copy PHP array of post title's into jQuery
$.each(PHP_ids, function (post_id, title) {
$('#posts').innerHTML = "<ul id='>" + post_id + "<'>" + title + "</ul>";
});
});
});
</script>
PHP в get_posts_from_category.php
include 'functions.php';
db_connect(); // Connect to database
// prepare and bind
$stmt = $GLOBALS['mysqli']->prepare("
SELECT ID,post_title FROM wplg_2_posts WHERE post_type='post' AND post_status ='publish' AND ID IN (
SELECT object_id FROM wplg_2_term_relationships WHERE term_taxonomy_id IN (
SELECT term_taxonomy_id FROM wplg_2_term_taxonomy WHERE taxonomy ='category' AND term_id IN (
SELECT t.term_id FROM wplg_2_terms t WHERE t.name IN (?))))
");
$category = $_POST['category']; // Get category from jQuery
$stmt->bind_param("s", $category); // Prepare SQL query with user input
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($post_id,$title);
// Instantiate arrays
$post_ids = array();
$titles = array();
// set parameters and execute. Store output 'ID' and 'Title' in arrays
while ($stmt->fetch()) {
array_push($post_ids, $post_id);
array_push($titles, $title);
}
var_dump($post_ids);
var_dump($titles);
Я считаю, что ошибка находится в моем сценарии jQuery, где я просматриваю каждый идентификатор в массиве и в результате генерирую элемент списка. Однако, прочитав документацию по jQuery .each и многочисленные вопросы по StackOverflow, я растерялся.
Любая помощь будет принята с благодарностью.
Спасибо, @Taplar, я попробую. Не могли бы вы пояснить, что вы имеете в виду, когда расшифровываете их?
Для «декодирования» - JSON - это строка, ее необходимо преобразовать / декодировать обратно в объект.
Если запрос ajax ожидает возврата json, он может автоматически декодировать его за вас, то есть преобразовать его из текста в формате json в реальные объекты. Массивы в вашем случае. Если это не выполняется автоматически запросом ajax, это можно сделать с помощью JSON.parse(theResponseString).
@Taplar Спасибо за разъяснения. Попробовав ваше решение, я думаю, что обнаружил проблему, потенциально фундаментальное непонимание jQuery. Если я вызываю $.each(PHP_data, function (post_titles, post_ids) {, нужно ли передавать функции что-то другое?
$.each() может работать с массивом или объектом. Если вы дадите ему массив, он будет перебирать каждый элемент в массиве. Если вы дадите ему объект, он будет перебирать каждую пару значений ключа в объекте. Это зависит от того, что вам нужно / есть, для того, как вы используете это в данной ситуации.






Не возвращайте два массива. Верните один массив, содержащий оба этих массива в качестве дочерних, и json_encode внешний массив, чтобы конечная точка могла его получить, декодировать как json и соответствующим образом обработать дочерние массивы.