-1

PHP コンタクト フォームをテストすると、「警告: 102 行目の foreach() に無効な引数が指定されました」というメッセージが表示され続けます。最近ウェブサイトを再構築しましたが、以前のウェブサイトで使用していたものとまったく同じ PHP コンタクト フォーム コードを使用しており、古いウェブサイトのフォームは引き続きエラーなく機能します。単語ごとにコピーして貼り付けたので、なぜこのエラーが発生するのかわかりません。どんな助けでも本当に感謝します。

これは、想定されるエラーが発生している行です (行 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 = "example@email.com";
            $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 />";

}
    }
?>
4

4 に答える 4

0

配列ではないものに対して foreach を実行しています。is_array関数foreachを使用して、渡しているものが配列であることを確認する必要があります

配列になるかどうかわからない場合は、次の PHP サンプル コードを使用していつでも確認できます。

if (is_array($errors)) {

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

ノート

foreach コンストラクトは、配列を反復処理する簡単な方法を提供します。foreach は配列とオブジェクトに対してのみ機能し、異なるデータ型の変数または初期化されていない変数に対して使用しようとするとエラーが発生します。

于 2013-04-28T07:26:34.060 に答える
0

if(is_array($errors))foreach ループ を追加してみてください。

PHP の error_reporting レベルを見てみましょう: http://php.net/manual/en/function.error-reporting.php

ほとんどの場合、古い Web サーバーには低いエラー報告レベルが設定されていました。

于 2013-04-28T07:26:45.703 に答える
0

変数$errorsは事前に設定されていないため、反復しようとするとエラーが発生します。他の人が私とほぼ同時に示唆したように、事前に宣言することで、$errorsこの特定の問題を解決する必要があります。

最初のトリックを行う$errors = array();前のようなもの。if-statementそれ以外の場合は、他の人の提案と同様に、issetor is_array(配列であるかどうかもチェックするため、少し良い)を行うと役立ちます。

PHP foreach ドキュメント

于 2013-04-28T07:26:56.767 に答える