2017-06-19 193 views
0

我正在使用jquery可排序並試圖將這些項目的位置保存到名爲「位置」的mysql表的行中。我似乎無法讓他們保存/更新正確。一切工作正常jQuery的一面,只是PHP的更新功能。現在它將位置行保存爲3,這是我得到的原因。我似乎無法圍繞如何正確做到這一點。MYSQL更新根據一定的順序從jquery排序

下面是我對PHP:

$id = $_POST['id']; 
$arr = $_POST['positions']; 

foreach($arr as $r) { 
    $sql = " UPDATE items 
      SET position = '$r' 
      WHERE groupId = '$id' "; 
} 

表結構/所需的輸出:

id | groupId | position 
---------------------------- 
3 10  0 
6 8  - 
8 10  3 
10 5  - 
15 10  2 
18 10  1 

jQuery的文件:

$("#items").sortable({ 
     update: function() { 
     var invId = $("input[name='deleteId']").val(); 
     var post = $(this).sortable('serialize'); 

     $.ajax({ 
      type: 'POST', 
      url: 'file.php', 
      data: { positions: post, id: invId }, 
      dataType: 'JSON', 
      cache: false, 
      success: function(output) { 
       console.log('success'); 
      }, 
      error: function(output) { 
       console.log('fail '); 
      } 
     }); 
     } 
    }); 

感謝。

+0

那'$ arr'不是數組雖然 – Qirel

回答

0

如果有人在這裏出現類似的問題,這對我來說是有效的。

UPDATE PHP文件:

$isNum = false; 

foreach($_POST['sort'] as $key => $value) { 
    if (ctype_digit($value)) { 
     $isNum = true; 
    } else { 
     $isNum = false; 
    } 
} 

if(isset($_POST) && $isNum == true){ 
    require_once('con.php'); 
    $orderArr = $_POST['sort']; 
    $order = 0; 
    if ($stmt = $db->prepare(" UPDATE items SET position = ? WHERE id=? ")) { 
     foreach ($orderArr as $item) { 
      $stmt->bind_param("ii", $order, $item); 
      $stmt->execute(); 
      $order++; 
     } 
     $stmt->close(); 
    } 
    echo json_encode( $orderArr); 
    $db->close(); 
} 

JQUERY排序FILE:

var sortable = $('#items'); 
    sortable.sortable({ 
     opacity: 0.325, 
     tolerance: 'pointer', 
     cursor: 'move', 
     update: function(event, ui) { 
     var post_data = sortable.sortable('serialize'); 

     $.ajax({ 
      type: 'POST', 
      url: 'save.php', 
      data: post_data, 
      dataType: 'json', 
      cache: false, 
      success: function(output) { 
       console.log('success -> ' + output); 
      }, 
      error: function(output) { 
       console.log('fail -> ' + output); 
      } 
     }); 

     } 
    }); 
    sortable.disableSelection(); 
0

您的查詢更新全部行與groupId = 10每次通過循環,所以最後他們都將包含數組的最後一個元素的值。

您需要編寫一個查詢,獲取表中每個匹配行的行號,然後只更新該行。您可以使用用戶定義的變量來增加行號。

UPDATE items AS i1 
JOIN (SELECT id, @rownum := rownum + 1 AS rownum 
     FROM (SELECT id 
      FROM items 
      WHERE groupId = '$id' 
      ORDER BY id) AS i 
     CROSS JOIN (SELECT @rownum := 0) AS var) AS i2 
ON i1.id = i2.id 
JOIN (SELECT 1 AS target, 0 AS val 
     UNION ALL 
     SELECT 2, 3 
     UNION ALL 
     SELECT 3, 2 
     UNION 
     SELECT 4, 1) AS newpos 
ON newpos.target = i2.rownum 
SET i1.position = newpos.val 
0

我認爲這可能是我缺少的東西,但也許你應該更新基於與特定組ID相匹配的ID的項目表。這樣的事情:

$id = 10; 
$arr = ('0', '3', '2', '1'); 

$searchId = "SELECT id FROM items WHERE groupId = '$id'"; 
$result = $db->query($searchId); 

foreach($arr as $r) { 
    $row = $result->fetch_assoc(); 
    $sql = " UPDATE items 
      SET position = '$r' 
      WHERE id = '{$row['id']}' "; 
} 

我假設你使用mysqli連接到你的數據庫。

+1

不是我所期待的。更像是更新項目['$ r']如果這是有意義的...對於項目[0] SET位置= [0],項目[1] SET位置= [3]等等 – Sergio

+0

如果我理解正確,@ RubenVincenten解決了你的問題。 – oniramarf

0

jQuery Sortable應該已經發布數據,其中的值是行ID和鍵的順序。這樣,你可以做一個foreach循環。假設以下數據:

//$_POST (use chrome inspector to see what post data is being sent) 
//positions[] = 3 
//positions[] = 18 
//positions[] = 15 
//positions[] = 8 

// note: use a prepared statement, this is just to demonstrate the query. 
foreach($_POST['positions'] as $i => $id) { 
    $db->query('update table set position = ? where id = ? ',array($i, $id)); 
} 
+0

我剝離/替換所有的行id到jquery中的數字。所以我向PHP發送一個包含逗號分隔的ID數組的JSON對象。這就是我例子中的var $ arr會存儲的內容 - 例如$ arr = $ _POST ['positions'];我可以看到發送到PHP文件和從PHP文件發送的數據,並且它保持正確的順序。在PHP方面,我無法弄清楚如何以期望的順序/地點存儲它們。 – Sergio

+0

你爲什麼要剝離身份證?如果一個有效的理由,你爲什麼省略剝離它們的代碼? PHP可能會收到一個訂單,但它如何知道綁定到哪個行的位置? –

+0

我只是認爲它會更容易在PHP中使用一組數字,而不是使用序列化方法的輸出 - sort [] = 0,sort [] = 1等等。 – Sergio