2014-02-17 33 views
0

我有一個數組被傳遞給foreach,即使我已經使用foreach的數百次前,我無法弄清楚爲什麼這是給我該錯誤,Warning: Invalid argument supplied for foreach()警告:爲foreach()提供的無效參數,儘管一切看起來不錯

switch($searchby){ 
    case 0: // Name 
     print_r($data); 
     foreach($data as $key => $i){ 
      if($key % 2 == 0 && $i == $searchfor){ 
       $success = TRUE; 
       $matches[] = array('name' => $i, 'value' => $data[$key+1]); 
      } 
     } 
     break; 
} 

print_r打印正常陣列,例如(一個實際的例子):

Array 
(
    [0] => Username 
    [1] => 4567 
    [2] => Password 
    [3] => 4567 
    [4] => Name 
    [5] => 4567 
    [6] => Age 
    [7] => 4567 
    [8] => Country 
    [9] => 4567 
    [10] => Type 
    [11] => Register 
) 

----由於顯然它的工作原理,這裏是與標記棧中的整個調用堆棧與<------: ----

/// Main.js /// 
$("form#Register").submit(function() { 
    event.preventDefault(); 
    $.post("php/proc.php",{'Command':'registerUser','Data':$(this).serialize()},function (data) { // <---- Original call 
     console.log(data); 
    }); 
    return false; 
}); 


// proc.php // 

echo json_encode($MainLib->registerUser($db, $data)); // <--------- #1 

class MainLib 
{ 
    public function registerUser($db, $data){ 
     $pword = $this->hashpword($db, $result1[0]['value'], $result2[0]['value'], 'Register'); // <---------------- #2 
    } 

    public function hashpword($db, $data){ 
     $uname = $this->searchData(0,'Username',$data); // <----------- #3 
     $pword = $this->searchData(0,'Password',$data); 
     $type = $this->searchData(0,'Type',$data); 
     switch($type){ 
      case 'Register': 
       $salt = uniqid(rand(0,99999999),TRUE); 
       $db->query("UPDATE `Users` SET `salt`='" . $salt . "' WHERE `Username`='" . $uname . "'"); 
       echo "UPDATE `Users` SET `salt`='" . $salt . "' WHERE `Username`='" . $uname . "'"; 
       break; 

      $result = $db->query("SELECT * FROM `Users` WHERE `Username`='" . $uname . "'"); 

      while($row = $result->fetch_assoc()){ 
       $salt = $row['salt']; 
      } 
     } 
     $salt = base_convert($salt, 26, 10); 
     $pword = base_convert($pword, 26, 10); 
     $new_pword = $pword * $salt; 
     $new_pword = base_convert($new_pword, 10, 17); 
     $pword = hash('sha512',$new_pword); 
     return $pword; 
    } 


    public function searchData($searchby, $searchfor, $data){ 
     $success = FALSE; 

     switch($searchby){ 
      case 0: // Name 
      print_r($data); 
       foreach($data as $key => $i){ // <--------- ERROR 
        if($key % 2 == 0 && $i == $searchfor){ 
         $success = TRUE; 
         $matches[] = array('name' => $i, 'value' => $data[$key+1]); 
        } 
       } 
       break; 
      case 1: // Value 
       foreach($data as $key => $i){ 
        if($key % 2 == 0 && $data[$key+1] == $searchfor){ 
         $success = TRUE; 
         $matches[] = array('name' => $i, 'value' => $data[$key+1]); 
        } 
       } 
       break; 
     } 

     if($success) return $matches; 
     return FALSE; 

    } 
} 
+0

您確定該錯誤與該特定行相關嗎? –

+0

只要確保數據是數組,然後在foreach中使用它。 – Rikesh

+2

該錯誤必須由您未發佈的某些代碼引起。我複製了你的代碼並重新創建了你的數組,並且我沒有在'foreach()'上收到任何錯誤。 –

回答

0

這可能不是正確的答案,我只是想知道這是否會取消錯誤:

switch($searchby){ 
case 0: // Name 
    if(is_array($data)) { //--> add this validation 
     print_r($data); 
     foreach($data as $key => $i){ 
      if($key % 2 == 0 && $i == $searchfor){ 
       $success = TRUE; 
       $matches[] = array('name' => $i, 'value' => $data[$key+1]); 
      } 
     } 
    } else { 
     die('Invalid Array!'); 
    } 
    break; 
} 

嘗試添加is_array條件,如果它仍然可以打印值$data並且能夠繼續您的腳本。

+0

'is_array()'返回一個'1',但該函數被跳過。我在'if(is_array($ data)){'之前運行'print_r(is_array($ data));'它返回了'1' – JVE999

相關問題