2011-07-24 57 views
2

似乎有一個問題,我用JavaScript調用jQuery的Ajax調用PHP的代碼。 ajax調用似乎很成功,但我沒有從php函數返回正確的信息。從javascript到PHP的jquery ajax調用

在php函數中,我創建了一個SQL查詢。我發回查詢作爲響應,在執行刪除查詢之前對其進行調試。這是div顯示查詢的HTML。

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

這裏是jquery ajax調用。有兩個變量被髮送到PHP函數:nodeid用於刪除節點,以及用於刪除該函數的選項。

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調用返回一個空字符串並導致HTML中的div消失。這是我第一次在實際項目中使用ajax。這個問題一定很容易找到知道阿賈克斯真正做什麼的人。你能說出問題嗎?

+0

我只是想知道爲什麼你必須通過cookie獲取選定的節點。你確定cookie是在您發送ajax請求時寫入的嗎? (如果你需要這個cookie,爲什麼你不讀取通過PHP?) – Rufinus

回答

9

我找到了答案!感謝所有對SQL調用提出建議的人。但這是我的問題的實際答案。

製作ajax Javascript到PHP調用有四個步驟。前兩個步驟發生在Javascript中。其他兩個步驟發生在PHP中。

第1步在Javascript中,決定PHP函數需要哪些變量,檢索它們。

第2步。對PHP函數進行ajax調用。 jquery具有將值傳遞給PHP的便捷方式。在ajax調用的數據項中有一個像這樣的名稱 - 值對數組。

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

第3步。準備PHP函數在PHP文件中。寫這樣的功能。

function updatetree($node, $option) { 

第4步。在該PHP文件中響應對php函數的調用。

有了這四個步驟,你應該有一個成功的PHP調用,並能夠從PHP函數返回信息到JavaScript。

這裏是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。它具有定義的功能,稱爲更新樹。它也有一個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獲取變量,對PHP文件進行ajax調用。 Ajax加載PHP文件,其中包含導致PHP函數運行的echo語句。該PHP函數是在同一個文件中定義的。函數return語句通過ajax將信息發送回javascript。 Javascript會用這些信息做一些事情,例如將其加載到HTML頁面上的div中。

0

您沒有通過$sqlmysql_query();

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

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

你的代碼是容易受到SQL注入,因爲它僅檢查空$node。作爲最終用戶,我可以刪除數據庫中的任何id,如果我在循環中運行代碼,則可以全部刪除它們。您需要檢查運行代碼的用戶是否有權刪除節點,並且還需要撥打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 
} 

附錄

我們沒有看到代碼,你在PHP中調用upTree()。你真的在調用這個函數嗎?如果您不調用它,那就是您的整個PHP腳本,那麼它將執行,什麼都不做,並且返回一個空的HTTP響應到您的Ajax調用函數,並且成功返回200個響應代碼。

+0

這不是問題。我以前註釋掉了對mysql_query的調用。 – user823527

+0

@ user823527參見附錄。發佈更多PHP代碼,如果還有更多需要發佈的話。如果沒有,那是因爲你沒有調用你的函數,整個PHP頁面只是運行,什麼也不做,並且什麼也不返回給你的ajax調用者。 –

0

實際上,你需要執行創建查詢:

$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

其實Chrome默認支持什麼螢火蟲呢 – dynamic

+0

你是對的,Chrome確實有一些內置的控制檯界面。不過,我個人覺得它很難使用。 – Brombomb

0

我發回查詢作爲響應調試它,然後再執行 刪除查詢。

...

此ajax調用返回一個空字符串並導致HTML 中的div消失。

我假設你希望查詢顯示在你的div內。你需要echo($ sql);或echo(uptree());或者在您的程序的某個地方等同。您也可以創建一個HTML表單,用於發佈與您的AJAX相同的數據以查看PHP返回的內容。