2013-04-28 95 views
-1

当我测试我的PHP联系表单时,我不断收到“警告:为第102行的foreach()提供的无效参数”消息。我最近重建了我的网站,但我使用的是我在旧网站上使用的完全相同的PHP联系人表单代码,而旧网站的表单仍能正常工作。我已复制&一字不差,所以我不知道为什么我得到这个错误。任何帮助真的会被赞赏。PHP表单中的参数无效 - foreach()

这里是我得到的(线102)假定错误的行:

foreach($errors as $value) { 

这里是整个表格的脚本(误差线正好处于底部):

<?php 

// 
if(isset($_POST["submit"])) 
{ 

    //This is checking if the string length in the firstname field was greater than 1 character 
    if(strlen($_POST["firstname"]) > 1) 
    { 

     $firstname = $_POST["firstname"]; 
     //echo $firstname; 
    } 

    else 
    { 
     //echo "You did not type in first name"; 
     $errors["firstname"] = "<span class=\"error\">You did not type in a first name.</span>"; 
    } 


    if(strlen($_POST["lastname"]) > 1) 
    { 

     $lastname = $_POST["lastname"]; 
    } 

    else 
    { 
     $errors["lastname"] = "<span class=\"error\">You did not type in a last name.</span>"; 
    } 


    if(strlen($_POST["email"]) > 1) 
    { 

     $email = $_POST["email"]; 

     if(filter_var($email, FILTER_VALIDATE_EMAIL)) { 
      $email = $email; 
     } 

     else { 
      $errors["email"] = "<span class=\"error\">Email is invalid.</span>"; 
     } 
    } 

    else 
    { 
     $errors["email"] = "<span class=\"error\">You did not type in an email address.</span>"; 
    } 

    //This is checking if the string length in the message field was greater than 1 character 
    if(strlen($_POST["message"]) > 1) 
    { 

     $message = $_POST["message"]; 
     //echo $firstname; 
    } 

    else 
    { 

     $errors["message"] = "<span class=\"error\">You did not type in a message.</span>"; 
    } 


    // Code to tell form NOT to send form if there are any errors. 
    if($errors < 1) 
    { 
      $to = "[email protected]"; 
      $from = $email; 
      // headers makes sure you have a reply-to address 
      $headers = "From: {$from}" . "\r\n"; 
      $headers .= 'MIME-Version: 1.0' . "\r\n"; 
      $headers .= 'Content-type: text/html; charset=iso-8859-1'; 

      $subject = 
       "From: ($from)" . "<br />" . 
       "First name: ($firstname)" . "<br />" . 
       "Last name: ($lastname)" . "<br />" . 
       "Email: ($email)" . "<br />" . 
       "Message: ($message)"; 

      if(mail($to, $from, $subject, $headers)) 
      { 
       $finalMsg = "<p class=\"success\">Thank you! Your email was sent.</p>"; 
      } 

      else { 
       $finalMsg = "<p class=\"error\">Your email was NOT sent. Please try again.</p>"; 
      } 

} 

?> 

<?php 

//each error is displayed 

foreach($errors as $value) { 

echo "<span>$value</span><br />"; 

} 
    } 
?> 
+1

警告信息的措词不够清楚吗? “foreach”期望有一些数组,但它没有得到一个。您可能没有将'$ errors'初始化为空数组,并且在没有验证错误时未定义它。 (另外,'$ errors <1'将不起作用...) – DCoder 2013-04-28 07:28:10

+0

在顶部添加'$ errors = array();'也许?你在多个地方操作'$ errors',但不要告诉PHP它是一个数组。 – 2013-04-28 07:28:33

+0

由于您是新手,请接受解决问题的答案(打勾)。向上(向上箭头)提供您的信息或帮助您的答案。向下投票(向下箭头)假的答案。 – Techie 2013-04-28 07:30:55

回答

0

你正在做一个不是数组的事情的foreach。你应该检查你所传递给foreach是使用is_array功能

数组如果你不知道这将是一个数组,你可以随时查询使用下面的PHP代码示例:

if (is_array($errors)) { 

    foreach ($errors as $error) { 
    //do something 
    } 
} 

foreach构造提供了一种简单的方法来遍历阵列。 foreach仅适用于数组和对象,并且当您尝试在具有不同数据类型的变量或 未初始化的变量上使用它时,会发出错误。

0

您的变量$errors没有在手之前设置,这会导致尝试迭代的错误。正如其他人一样,在我的同一时间建议,事先声明$errors应该解决这个特定的问题。

类似$errors = array();之前你的第一个if-statement会做的伎俩。否则也类似于其他人的建议,做issetis_array(稍微好一点,因为它检查它是否是一个数组)会有所帮助。

PHP foreach Documentation

+1

不知道为什么这被否决了,如果$ _POST ['submit']'被设置,并且他检查的所有其他变量都是正确的,'$ errors'对象在代码中从不设置**,这会导致这个问题。 – Turnerj 2013-04-28 07:32:14

2
<?php 

$errors = array(); 
if(isset($_POST["submit"])) 
{ 
    ... 

你必须定义所有变量。 你在做$firstname吗?所以你应该有$errors

另外,定义错误时不要添加格式,请在输出处添加它。它会为你节省很多打字。