2011-09-08 97 views
1

我知道這個問題之前已經被問過,但是這些解決方案並沒有爲我工作。我正在嘗試將新的項目順序保存到數據庫。JQuery UI保存排序列表

我非常相當簡化它,但這是它的基本思想。我有一個嵌入了可排序列表的表單。

<form id="itemlist"> 
    <ul id="itemsort"> 
     <li id="Item_1">Item<input type="hidden" name="itemid[]" value="itemsRowID01"/></li> 
     <li id="Item_2">Item<input type="hidden" name="itemid[]" value="itemsRowID02"/></li> 
     <li id="Item_3">Item<input type="hidden" name="itemid[]" value="itemsRowID03"/></li> 
     <li id="Item_4">Item<input type="hidden" name="itemid[]" value="itemsRowID04"/></li> 
    </ul> 
</form> 

我有jQuery和JQuery用戶界面加載和下面的代碼使排序列表功能和崗位項ID和新的排序順序PHP腳本。 「編輯器」變量是一個公共變量,它在加載時可以正常工作。排序工作正常,但是當我重新排列列表時,帖子的neworder值似乎沒有改變。

//sorting feature 
    $("#itemsort").live('hover', function() { 
     $("#itemsort").sortable({ 
      opacity:.5, 
      update : function() {   

       var neworder = $('#itemsort').sortable('serialize'); 
       var inputs = serializePost('#itemlist'); 

       $.post("core/actions.php",{ 
        'order': editor, 
        'inputs': inputs, 
        'neworder': neworder},function(){ 

         alert("Order saved.", 1); 

       }); 
      } 
     }); 
    }); 

在actions.php ...

if(isset($_POST['order'])){ 

      //set a variable for each post 
      $batchid = $_POST['inputs']['itemid']; 

      parse_str($_POST['neworder'], $neworder); 

      //count the number of entries to be ordered 
      $count = count($batchid);   

      //use the count to create an incremental loop for each item to be updated. 
      $i=0; 
      while ($i <= $count) { 

    $query ="UPDATE {$_POST['order']} SET order=$neworder[item][$i] WHERE id=$batchid[$i]"; 
       ++$i; 
      } 
     } 

我不知道爲什麼我得到每個項目的順序不會改變。

任何想法?

-L

+6

Holy SQL注入漏洞,蝙蝠俠! '$ query =「UPDATE {$ _POST ['order']} SET order = $ neworder [item] [$ i] WHERE id = $ batchid [$ i]」;'您的原始問題放在一邊,這段代碼是非常危險的。在將它們傳遞給查詢之前,您需要確保清理輸入變量,否則當有人惡意設置$ _POST ['inputs'] ['itemid']時,您可能會發現自己處於一個受到傷害的世界中'10或1 = 1'或類似的。 –

+5

是的,我知道對不起,這只是我想要做的最簡單的例子。實際上,我使用類和抽象層來保護我的注入方法。我不想嘗試和解釋所有的類和父類等。希望它仍然有足夠的意義來調試我的actions.php腳本中的邏輯。 – Laurence

回答

11
$("#list").live('hover', function() { 
     $("#list").sortable({ 

      update : function() { 

       var neworder = new Array(); 

       $('#list li').each(function() {  

        //get the id 
        var id = $(this).attr("id"); 
        //create an object 
        var obj = {}; 
        //insert the id into the object 
        obj[] = id; 
        //push the object into the array 
        neworder.push(obj); 

       }); 

       $.post("pagewhereyouuselist.php",{'neworder': neworder},function(data){}); 

      } 
     }); 
    }); 

然後在你的PHP文件,或在這個例子中 「pagewhereyouuselist.php」

$neworderarray = $_POST['neworder']; 
//loop through the list of ids and update your db 
foreach($neworderarray as $order=>$id){  
    //you prob jave a connection already i just added this as an example 
    $con = mysql_connect("host","username","password"); 

    if (!$con){ 
     die('Could not connect: ' . mysql_error()); 
    } 

    mysql_select_db("my_db", $con); 

    mysql_query("UPDATE table SET order = {$order} WHERE id = {$id}"); 
    mysql_close($con); 

} 

應該這樣做 我沒有測試它,因爲它是一個示例連接。我實際使用的實際腳本更具體到我的程序這是一個簡化的版本,以顯示概念

7

試試這個:

你的HTML領域

<form id="itemlist" method="POST"> 
    <ul id="itemsort"> 
     <li id="Item_1">Item 1<input type="hidden" name="itemid[]" value="itemsRowID01"/></li> 
     <li id="Item_2">Item 2<input type="hidden" name="itemid[]" value="itemsRowID02"/></li> 
     <li id="Item_3">Item 3<input type="hidden" name="itemid[]" value="itemsRowID03"/></li> 
     <li id="Item_4">Item 4<input type="hidden" name="itemid[]" value="itemsRowID04"/></li> 
    </ul> 
</form> 

JS發送訂單:

$("#itemsort").live('hover', function() { 
    $("#itemsort").sortable({ 
     update: function() {   
      var inputs = $('#itemlist').serialize(); 
      $.post("./jq-ui-test.php", inputs, alert("Order saved.")); 
     } 
    }); 
}); 

保存順序:

if(isset($_POST['itemid']) && is_array($_POST['itemid'])) { 
    foreach($_POST['itemid'] as $order => $item) { 
     $order = intval($order); 
     $item_esc = mysql_real_escape_string($item); 
     $sql_query = "UPDATE {$_POST['order']} SET order={$order} WHERE id = '{$item_esc}'"; 
    } 
} 

另外,如果你想要的啓動順序從1開始(而不是從0)變化$order = intval($order);$order = intval($order) + 1;

+0

所以這只是試圖使用行id的itemid數組中的項目位置,所以設置其在數據庫中的位置?我似乎無法得到它的工作。當你的序列化itemlist它使用原始的HTML佈局或新的調整通過javascript? – Laurence

+0

它似乎使用原始HTML的順序,而不是排序的順序......也許序列化像之前的排序項目呢? – Laurence

+0

我還是無法啓動它。序列化表單ID的順序不反映通過拖放來改變順序。我現在拉着我的頭髮.... – Laurence