JQuery AJAX вызов из JavaScript в PHP - PullRequest
2 голосов
/ 24 июля 2011

Кажется, есть проблема с кодом, который у меня есть для вызова php из javascript с помощью jquery ajax.Вызов ajax кажется успешным, но я не получаю правильную информацию, возвращаемую функцией php.

В функции php я создаю SQL-запрос.Я отправляю запрос как ответ, чтобы отладить его перед выполнением запроса на удаление.Вот HTML-код для div, чтобы показать запрос.

 <div id="thenode" style="position: absolute; top: 30px; left: 0px; width: 150px; background-color: white; z-index: 9999;">&nbsp;</div>

Вот вызов ajax jquery.В функцию PHP отправляются две переменные: nodeid для удаляемого узла и опция delete для функции.

function deleteitem()
{

     //get selected node
     var selectnod = getCookie('pnodid'); 

     //define php info and make ajax call
     $.ajax({
         url: "uptree.php",
         type: "POST",
         data: { node: selectnod, option: "delete" },
         cache: false,
         success: function (response) {
             $('#thenode').html(response);
         }
     });

}

Вот функция PHP.

<?php

function uptree() {

  $node = $_POST['node'];
  $option = $_POST['option'];

  if($node == '' || $option == '') {
    return '';
  }

  $dbco = mysql_connect('localhost', 'root', 'mmowebdb');
  if (!$dbco)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("pagelinks", $dbco);

  $sql = "DELETE FROM dtree_table WHERE nid='$node'";

  return $sql;
}

?>

Следуетбыть простым, но этот вызов ajax возвращает пустую строку и приводит к исчезновению div в HTML.Это первый раз, когда я использую ajax в реальном проекте.Эту проблему легко найти человеку, который знает, что на самом деле делает ajax.Можете рассказать о проблемах?

Ответы [ 4 ]

11 голосов
/ 25 июля 2011

Я нашел ответ! Спасибо всем, у кого были предложения по поводу вызова SQL. Но вот реальный ответ на мой вопрос.

Существует четыре шага в создании ajax Javascript для вызова PHP. Первые два шага происходят в Javascript. Два других шага происходят в PHP.

Шаг 1. В Javascript определите, какие переменные нужны в функции PHP, получите их.

Шаг 2. Сделайте ajax-вызов функции PHP. В jquery есть удобный способ передачи значений в PHP. У вас есть массив пар имя-значение, подобных этому, в элементе данных для вызова ajax.

 data: { node: selectnod, option: "delete" },

Шаг 3. Подготовьте функцию PHP в файле PHP. Напишите функцию следующим образом.

function updatetree($node, $option) {

Шаг 4. Отобразите вызов функции php в этом файле PHP.

С этими четырьмя шагами вы должны успешно вызвать PHP и иметь возможность возвращать информацию в javascript из функции PHP.

Вот функция JavaScript.

function deleteitem()
{

     //Get selected node to send to PHP function
     var selectnod = getCookie('pnodid'); 

     //Define php info, specify name of PHP file NOT PHP function
     //Note that by loading the PHP file you will probably execute any code in that file
     //that does not require a function call
     //Send PHP variables in the data item, and make ajax call
     //On success perform any action that you want, such as load a div here called thenode
     $.ajax({
         url: "uptree.php",
         type: "POST",
         data: { node: selectnod, option: "delete" },
         cache: false,
         success: function (response) {
             $('#thenode').html(response);
         }
     });

}

Вот файл PHP uptree.PHP . У него есть определенная функция, которая называется updatetree . Он также имеет оператор echo для вызова этой функции. Это просто способ заставить функцию работать. Сам Ajax не вызывает функцию.

<?php

//Function defined here
//The variables will come from the ajax data statement
function updatetree($node, $option) {

  if($node == '' || $option == '') {
    return 'Select an item in the tree.';
  }

  $dbco = mysql_connect('localhost', 'root', 'mmowebdb');
  if (!$dbco)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("pagelinks", $dbco);

  $sql = '';
  switch($option) {
     case 'delete':
        $sql = "DELETE FROM dtree_table WHERE nid='$node'";
        break;
     case 'add':
        list($pagename, $address) = explode(",", $page);
        $pagename = trim($pagename);
        $address = trim($address);
        $sql = "INSERT INTO dtree_table (nid, pid, name, url) values (NULL, ".$node.", '".$pagename."', '".$address."')";
        break;
     case 'update':
        break;
  }

  if (!empty($sql)) return $sql;
}

//echo statement to run function, variables sent by ajax are retrieved with $_REQUEST
//they could have also been retrieved with $_GET or $_POST
echo updatetree(trim($_REQUEST['node']),trim($_REQUEST['option']),trim($_REQUEST['page']));

?>

Итак, подведем итоги. Javascript получает переменные, делает ajax-вызов PHP-файла. Ajax загружает файл PHP, который содержит оператор echo, который запускает функцию PHP. Эта функция PHP определена в том же файле. Оператор возврата функции отправляет информацию обратно в javascript через ajax. Javascript что-то делает с этой информацией, например, загрузите его в div на странице HTML.

0 голосов
/ 24 июля 2011

На самом деле вам нужно выполнить созданный вами запрос:

  $sql = "DELETE FROM dtree_table WHERE nid='$node'";

  $result = mysql_query($sql);

  return $sql;

Тогда результат будет содержать логическое состояние успеха.

Также, когда вы передадите его обратно вызову javascript, вынужно установить соответствующий заголовок страницы в виде обычного текста или json (если вы решите использовать json)

Я настоятельно рекомендую использовать такой инструмент, как Firebug, для просмотра каждого запроса ajax.Затем вы можете просмотреть опубликованные данные, данные ответов и заголовки, чтобы помочь вам в дальнейшей диагностике проблемы.В настоящее время только Firefox (AFAIK) полностью поддерживает расширение Firebug, но Firebug Lite также доступен для других браузеров.

0 голосов
/ 24 июля 2011

Я отправляю запрос как ответ, чтобы отладить его перед выполнением Удалить запрос.

...

этот вызов ajax возвращает пустую строку и вызывает div в HTML исчезнуть.

Полагаю, вы хотите, чтобы запрос отображался внутри вашего div. Вам нужно эхо ($ sql); или эхо (uptree ()); или эквивалент где-нибудь в вашей программе. Вы также можете создать HTML-форму, которая отправляет те же данные, что и ваш AJAX, чтобы увидеть, что возвращает PHP.

0 голосов
/ 24 июля 2011

Вы не передали $sql в mysql_query();

$sql = "DELETE FROM dtree_table WHERE nid='$node'";

mysql_query($sql);
// -------^^^^^^^^
return $sql;

Ваш код уязвим для внедрения SQL, так как он проверяет только пустое значение $node.Как конечный пользователь, я могу удалить любой идентификатор в базе данных, которую я хочу, или все они, если я запускаю код в цикле.Вам понадобится что-то, чтобы проверить, что пользователь, выполняющий код, имеет разрешение на удаление узла, а также вызовет mysql_real_escape_string() на $node.

$node = mysql_real_escape_string($node);
$sql = "DELETE FROM dtree_table WHERE nid='$node'";
$result = mysql_query($sql);

// Check for success...
if ($result) {
  // return success codes to ajax caller
}
else {
  // return error codes to ajax caller
}

ADDENDUM

Мы не видим код, по которому вы вызываете upTree() в PHP.Вы на самом деле вызываете функцию?Если вы не вызываете его, и это весь ваш PHP-скрипт, он будет выполняться, ничего не делать и возвращать пустой HTTP-ответ на вашу функцию вызова Ajax с успешным кодом ответа 200.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...