2013-12-10 4 views
-1

Я совершенно новый для мира AJAX. У меня есть база данных Mysql, содержащая столбец с URL-адресами. Моя конечная цель состоит в том, чтобы нагрузка по клику загружала iframe с уникальным URL-адресом из базы данных. Если у кого-то есть лучшая методология, пожалуйста, дайте мне знать.Что не так с моим кодом AJAX

Сейчас я просто пытаюсь выяснить, как работает AJAX, пытаясь получить URL-адреса. Я прикрепил свой код Javascript и свой PHP-код.

Код PHP выводит кодированную json копию данных. Однако javascript сообщает, что переменный результат не определен. Я думаю, что это может иметь отношение к «асинхронной» стороне AJAX, но я следовал этому руководству, чтобы попытаться правильно работать с кодом. Я ценю любую помощь, которая может быть предоставлена.

How do I return the response from an asynchronous call?

Вот мой код Javascript код он записывает результаты неопределен и «Я сделал это» в консоли

function retrieve_callback(result) { 
    console.log (result); 
    console.log("I made it!"); 
    }; 

function retrieveURL (retrieve_callback) { 
    $.getJSON({ 
     url: './fetch.php', 
     dataType: 'json', 
     success: retrieve_callback 
    }); 
} 

//Runs when our document initializes 
$(document).ready(function() { 
    retrieveURL(retrieve_callback()); 
}); 

Вот мой PHP код он выводит массив JSON из URL,

<?php 
//-------------------------------------------------------------------------- 
// Connect to mysql database (I've removed the info from this example but it works) 
//-------------------------------------------------------------------------- 

$db = new mysqli($DB_HOST, $DB_USER, $DB_PASSWORD, $DB_NAME); 

if($db->connect_errno > 0){ 
    die('Unable to connect to database [' . $db->connect_error . ']'); 
} 

//-------------------------------------------------------------------------- 
// Query mysql database 
//-------------------------------------------------------------------------- 

$links = array(); 

//SQl query 
$sql = <<<SQL 
    SELECT `Gnews_url` 
    FROM `Gnews_RSS` 
SQL; 

if(!$result = $db->query($sql)){ 
    die('There was an error running the query [' . $db->error . ']'); 
} 

while($row = $result->fetch_assoc()){ 
    array_push($links, $row); 
} 

echo json_encode($links); 

ответ

3

retrieveURL(retrieve_callback()); является неправильным.

retrieveURL ожидает, что вы передадите ссылку на функцию, чтобы выполнить ее после завершения запроса. Вместо этого вы выполняете retrieve_callback и передаете результат этого (undefined) на retrieveURL, поэтому он никогда ничего не делает, когда запрос завершается. Не только это, но вы выполняете обратный вызов, прежде чем выполнять запрос.

Вы должны пройти это нравится:

retrieveURL(retrieve_callback);

+0

Спасибо йо u, это, однако, открывает новую проблему.Мой запрос не вызывает функцию успеха. Я добавил ошибку, чтобы отладить ее, но также не выводил никакой информации. Похоже, что запрос висит. Еще раз спасибо за помощь. – Jesse

+0

Возможно, ваш PHP что-то испортил, я не слишком знаком с ним. Добавьте «сбой: retrieve_callback» после успеха и посмотрите, запускается ли это. –

+0

Я добавил функцию сбоя, чтобы просто предупредить («Я испортил») и console.log («Я испортил»). Все еще нет выхода из функции успеха, ошибки или сбоя. – Jesse

0

Эта:

$(document).ready(function() { 
    retrieveURL(retrieve_callback()); 
}); 

Вы звоните retrieveURL с результатами вызова retrieve_callback(). Сделайте это вместо того, чтобы:

$(document).ready(function() { 
    retrieveURL(retrieve_callback); 
}); 
0
retrieveURL(retrieve_callback); // no brackets for retrieve_callback 

В JavaScript, методы объектов тоже. В этом случае вы передаете метод retrieve_callback как объект в retrieveURL. retrieveURL, с другой стороны, присваивает метод retrieve_callback как члену «успех» анонимному объекту, который передается в $ .getJSON(). Это означает, что у объекта анонима теперь есть метод, называемый «успех», который работает как retrieve_callback.

После успешного запроса AJAX, JQuery использует объект аноним и называет его успех-метод как это:

blaObject.success(ajaxResult); 

Мы знаем, что «успех» является копией «retrieve_callback», так что follwing будет :

// instead of blaObject.success(ajaxResult); 
retrieve_callback(ajaxResult); 

Поясним это в короткий путь (см С.Е. использование скобок):

// Get the result of a call of retrieve_callback() and pass it to retrieveURL. 
retrieveURL(retrieve_callback()); 

// Pass the method retrieve_callback itself retrieveURL. 
retrieveURL(retrieve_callback); 
Смежные вопросы