2011-03-25 110 views
1

爲什麼會收到以下警告:foreach循環中的警告?

[週五3月25日19時19分21秒2011] [錯誤] [客戶端127.0.0.1] PHP的警告:對提供的foreach 無效 參數()中/var/www/register.php上 線60,引用者: http://localhost/register.php

運行下面的腳本時:

<?php 
    error_reporting(E_ALL); 
?> 

<html> 
    <head> 
     <title></title> 
     <link rel="icon" type="image/png" href="favicon.ico"> 

     <?php 
      if($_SERVER['REQUEST_METHOD']=='POST') { 
       $err = array(); 

       if(empty($_POST['display_name'])) $err[] = "display name field is required"; 
       if(empty($_POST['email'])) $err[] = "email field is required"; 
       if(empty($_POST['password'])) $err[] = "password field is required"; 

       if(!$err) { 
        try { 
         $DBH = new PDO("mysql:host=localhost;dbname=database1", "user", "pass"); 
         $DBH -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

         $STH = $DBH -> prepare("insert into table1 (display_name, email, password) values (:display_name, :email, :password)"); 

         $STH -> bindParam(':display_name', $_POST['display_name'], PDO::PARAM_STR, 100); 
         $STH -> bindParam(':email', $_POST['email'], PDO::PARAM_STR, 100); 
         $STH -> bindParam(':password', $_POST['password'], PDO::PARAM_STR, 100); 

         $STH -> execute(); 

         $STH = $DBH -> prepare("insert into table2 (username, status, users_id) values (:username, :status, :users_id)"); 

         $strStatus = 1; 

         $STH -> bindParam(':username', $_POST['display_name'], PDO::PARAM_STR, 100); 
         $STH -> bindParam(':status', $strStatus, PDO::PARAM_INT, 1); 
         $STH -> bindParam(':users_id', $_POST['referer'], PDO::PARAM_INT, 1); 

         $STH -> execute(); 

         $DBH = null; 
        } catch(PDOException $e) { 
         echo $e -> getMessage(); 
        } 

        header("Location: ".$_SERVER['PHP_SELF']); 
        exit; 
       } else { 
        foreach($_POST as $key => $val) { 
         $form[$key] = htmlspecialchars($val); 
        } 
       } 
      } else { 
       $form['display_name'] = $form['email'] = $form['password'] = ''; 
      } 
     ?> 
    </head> 

    <body> 
     <?php foreach($err as $line) { ?> 
     <div style="error"><?php echo $line; ?></div> 
     <?php } ?> 

     <h1>register</h1> 

     <form method="post"> 
      referers id:<br /> 
      <input type="text" name="referer" /><br /><br /> 

      name:<br /> 
      <input type="text" name="display_name" value="<?php echo $form['display_name']; ?>" /><br /><br /> 

      email:<br /> 
      <input type="text" name="email" value="<?php echo $form['email']; ?>" /><br /><br /> 

      password:<br /> 
      <input type="text" name="password" value="<?php echo $form['password']; ?>" /><br /><br /> 

      <input type="submit" value="register" /> 
     </form> 
    </body> 
</html> 

回答

2

由於您試圖訪問在某些情況下不存在的變量,因此您正在收到錯誤。如果您的頁面表單未提交,則$err變量將不存在。

您可以通過在您的if聲明之外放置$err = array();來解決此問題。變化:

if($_SERVER['REQUEST_METHOD']=='POST') { 
    $err = array(); 

到:當參數不是數組

$err = array(); 
if($_SERVER['REQUEST_METHOD']=='POST') { 
0

即錯誤發生。您應該在foreach之前/附近放置if(is_array($_POST))以確保它沒有提供空值。

0

我覺得你的會議並不總是初始化,以便你,因爲它不存在

0

這是一種警告你當你嘗試遍歷的東西是不是一個數組的得到一個無效的參數。

以下行之前:

foreach($err as $line) { 

確保$err確實是一個數組。


兩種解決方案:

  • 初始化$err較早,條件是檢測是否$_SERVER['REQUEST_METHOD']=='POST'之外,因此它至少包含一個空數組
  • 還是不要嘗試遍歷$err如果沒有設置 - 使用isset()來測試那個