2017-09-18 51 views
0

我的問題是update.php只獲取發佈的表單數據(post_edit)。通過AJAX早些時候發佈的變量不經過如何將AJAX調用與通過表單發佈數據到同一文件的php文件同步?

Notice: Undefined index: id_to_edit in ...\update.php on line 5 

Notice: Undefined index: column_to_edit in ...\update.php on line 6 

我想要做的事:

我有痕跡鼠標放在桌子上的身體位置的回調函數。這樣做是爲了檢測用戶想要編輯的單元格的列和id - id整數和列字符串通過AJAX發佈到一個php文件中,並在SQL查詢中使用這兩個值(對於座標)在頂部用戶想要更新的數據(通過表單發佈,稍後更多)。

編輯按照這種方式完成:當用戶將鼠標放在單元格上時,表單將在內部創建,並填充該表單應該發佈數據以更新SQL表中的對應條目(通過使用座標回調函數)。移出將刪除表單。

套用有點

如何發佈座標和表單數據的PHP文件,使所有這些值可以在SQL查詢中使用?如果我一直在做的是從根本上打破了,那麼還有另一種方法嗎?

$(function(){ 

    $("td") 
    .hoverIntent(
     function(e){    
     var id_of_edit = $(e.target).siblings('th').text(); 
     var $clicked_column_i = $(e.target).index() + 1; 
     var column_of_edit = $("#tableheader").children("th:nth-child(" + $clicked_column_i + ")").text(); 

     $.ajax({ 
      type: 'POST', 
      dataType: 'text', 
      url: 'update.php', 
      data: { 
       'id_of_edit': id_of_edit, 
       'column_of_edit': column_of_edit 
       }, 

     }); 

     var $edit_button = $('<form action="update.php" method="post"><input type="text" name="post_edit"/></form>'); 

     $(e.target).append($edit_button); 

     console.log(e.target.innerText + " was clicked"); 
     console.log(id_of_edit + " is the ID"); 
     console.log(column_of_edit + " is the column name");  
     //just to check the tracer function is working correctly 
     }, 

     function(e){    
     $id_of_edit = $(e.target).siblings('th').text(); 
     $clicked_column_i = $(e.target).index() + 1; 
     $column_of_edit = $("#tableheader").children("th:nth-child(" + $clicked_column_i + ")").text(); 

     $(e.target).children('form').remove(); 
     }); 

}); 

update.php:

<?php 

include 'config.php'; 

echo $_POST['id_to_edit']; 
echo $_POST['column_to_edit']; 
echo $_POST['post_edit']; 


$stmt = $pdo->prepare('UPDATE food SET :column = :edit WHERE id = :id'); 
$stmt->execute([ 
    'id' => $_POST['id_to_edit'], 
    'column' => $_POST['column_to_edit'], 
    'edit' => $_POST['post_edit'] 
]); 

?> 
+0

代碼中也有拼寫錯誤:** _編輯的id _ **與id _ **到** _edit(其他變量對中的同一個拼寫錯誤) – Shadow

回答

0

AJAX請求並使用標準的回發一個表單提交是兩個單獨的 HTTP請求。您的「update.php」腳本將執行兩次 - 對於每個單獨的請求都會執行一次,並且每個請求將根據您在該請求上發送的內容設置單獨的POST變量集。變量不會在請求之間持續存在 - 僅僅因爲您將它們發送到同一個端點腳本並不重要。

總結:HTTP請求是無狀態 - 它們是孤立存在的,任何給定的請求對先前或將來的請求都一無所知。每一個都會導致命名的PHP腳本從頭到尾運行,就好像它從未運行過一樣,並且可能永遠不會再運行。它不會記住過去,也不會對未來一無所知,除非你明確地做了些什麼。

如果您希望值在請求之間持續存在,您必須自己存儲它們 - 在數據庫,會話,Cookie中,無論如何(取決於您) - 然後在需要時再檢索它們。


說了這麼多,看你的服務器代碼,目前還不清楚爲什麼你會想要兩個單獨的請求無論如何 - 你在SQL做一個UPDATE語句,所以它會更有意義使用一個HTTP請求將所有數據傳輸到服務器,然後執行運行UPDATE的腳本。除非UI中存在某些原因,否則無法完成,在這種情況下,您需要在請求之間的某處保留值。從您的描述中,您可能會將單元格/列ID捕獲到您生成的表單內的隱藏字段,而不是通過ajax立即將它們發送到服務器。當提交主表單時,隱藏的字段值將與用戶生成的值一起發佈到服務器。另外,如果你真的使用鼠標的位置來確定單元格,這聽起來很不可靠 - 瀏覽器窗口可以調整大小。當然,將一個ID放在單元格的HTML標記中(例如作爲一個數據屬性),當單擊單元格/單擊時可以讀取該標識符會更可靠嗎?

相關問題