2017-01-14 28 views
1

AJAX:未定義,偏移和語法錯誤,但代碼被執行正確

... 
success: function(data){ 
     console.log(data); 
    } 

position.php

兩個陣列被轉移($ids$indexes和),與相等數目的元件。

extract($_POST); 

print_r($ids); 
print_r($indexes); 

for ($i = 0; $i <= count($ids); $i++) { 
    $stmt = $db->query("UPDATE " . $table . " SET inde = " . $indexes[$i] . " WHERE id = " . $ids[$i]); // this is line 10 
} 

的代碼正確執行,即按預期的方式更新了所有表數據,但控制檯(上市陣列之後)顯示了一些錯誤:

Array 
    (
     [0] => 25 
     [1] => 23 
     [2] => 18 
     [3] => 26 
     [4] => 21 
    ) 
    Array 
    (
     [0] => 0 
     [1] => 1 
     [2] => 2 
     [3] => 3 
     [4] => 4 
    ) 

<b>Notice</b>: Undefined offset: 5 in <b>D:\matria\s02\admin\position.php</b> on line <b>10</b><br /> 

<b>Fatal error</b>: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064... near 'WHERE id =' at line 1 in D:\matria\s02\admin\position.php:10 

任何幫助嗎?

回答

1

問題是與您的for週期:

for ($i = 0; $i <= count($ids); $i++) { 

count($ids)爲5時$i達到5,5 < = 5仍然是正確的。然而,索引從0開始,所以你可能指數是從0到4,更改您的for到:

for ($i = 0; $i < count($ids); $i++) { 

,然後它不會嘗試做的事情,當$i達到5

編輯:

原來的答案涉及您的有效的錯誤,但仍然有一些事情要重構/修復後好轉:

  • 你有一個ARR ay稱爲$indexes,它自己的索引也將索引存儲爲值。如果沒有反例的問題未盡,那麼這整個陣列是多餘的,你可以刪除$indexes,你可以使用的$i代替$indexes[$i]
  • $i < count($ids)中的循環將計算在每個迭代的$ids數量。這是更優雅到for之前,像$myCount = count($ids);只有一次計算,然後在你的for使用$i < $myCount

建議代碼來計算只有一次的事情:

extract($_POST); 

print_r($ids); 

$myCount = count($ids); 
for ($i = 0; $i < $myCount; $i++) { 
    $stmt = $db->query("UPDATE " . $table . " SET inde = " . $i . " WHERE id = " . $ids[$i]); // this is line 10 
} 
+0

你是魔術師。非常感謝。 – bonaca

+0

不客氣 –