2011-09-08 46 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

相关问题