web-dev-qa-db-ja.com

PHP error:Notice:Undefined index:

私はPHPでショッピングカートに取り組んでおり、あらゆる種類の場所でこのエラー "Notice:Undefined index:"を受け取っているようです。このエラーは、たとえば、ユーザーが購読を決定した月のパッケージ価格を計算するコーディングの一部があり、エラーが参照する次の変数があります。

    $month = $_POST['month'];
    $op = $_POST['op'];

$ month変数は、ユーザーがフォームに入力する番号です。$ op変数は、ユーザーがフォーム上のラジオボタンから選択する変数に値が格納されるさまざまなパッケージです。

それが何らかの形で明らかになることを願っています。

ありがとうございました

編集:申し訳ありませんが、ユーザーがデータを送信すると消えてしまうことを忘れてしまいました。しかし、最初にページにアクセスすると、このエラーが表示されます。それを表示しないようにどのように取り除くことができますか?

-

これはコードです:

<?php
    $pack_1 = 3;
    $pack_2 = 6;
    $pack_3 = 9;
    $pack_4 = 12;
    $month = $_POST['month'];
    $op = $_POST['op'];
    $action = $_GET['action'];

    if ( $op == "Adopter" ) {
       $answer = $pack_1 * $month;
    }

    if ( $op == "Defender" ) {
      $answer = $pack_2 * $month;
    }

    if ( $op == "Protector" ) {
      $answer = $pack_3 * $month;
    }

    if ( $op == "Guardian" ) {
      $answer = $pack_4 * $month;
    }

    switch($action) {   
        case "adds":
            $_SESSION['cart'][$answer][$op];
            break;
    }
?>  
10
PHPNOOB

設定されていない配列内のインデックスにアクセスしようとしています。これにより通知が発生します。

Php.iniにerror_reportingが含まれるように設定されたE_NOTICEのあるサーバーにコードが移動したため、ほとんどの場合、これに気付いています。 error_reportingをE_ALL & ~E_NOTICE(推奨されません)に設定して通知を抑制するか、アクセスする前にインデックスが存在することを確認します。

$month = array_key_exists('month', $_POST) ? $_POST['month'] : null;
27
meagar

フォームと同じスクリプトにフォームプロセッサを入れていますか?その場合、ポスト値が設定される前に処理が試行されます(すべてが実行されます)。

フォームが送信されたかどうかをチェックする条件ですべての処理コードをラップします。

if(isset($_POST) && array_key_exists('name_of_your_submit_input',$_POST)){
//process form!
}else{
//show form, don't process yet!  You can break out of php here and render your form
}

手続き的にプログラミングする場合、スクリプトは上から下に実行されます。フォームが送信されていない場合、プログラムが処理ロジックを無視することを確認する必要があります。同様に、処理後、次のような成功ページにリダイレクトする必要があります

header('Location:http://www.yourdomainhere.com/formsuccess.php');

通知やエラーを抑制する習慣にはなりません。

これらの問題があり、ショッピングカートを作成しようとしている場合、代わりにMagentoやOsCommerceなどの成熟したeコマースソリューションを利用することを提案する場合は、怒らないでください。ショッピングカートは高度なセキュリティを必要とするインターフェイスであり、これらの種類のPOSTの問題に苦労している場合、後で頭痛に悩まされることを保証できます。多くの安定したリリースがあります。 、一部は単なるオブジェクトモデルと同じくらい簡単で、ダウンロードできます。

13
DeaconDesperado

明らかに$ _POST ['month']は設定されていません。 HTMLフォームの定義に間違いがあるか、他の何かが原因である可能性があります。原因が何であれ、使用する前に変数が存在するかどうかを常に確認する必要があります。

if(isset($_POST['month'])) {
   $month = $_POST['month'];
} else {
   //month is not set, do something about it, raise an error, throw an exception, orwahtever
}
3
Mchl

それを表示しないようにどのように取り除くことができますか?

ここの人々は、それが専門家ではない(そしてそうである)ことをあなたに伝えようとしていますが、あなたの場合、あなたはあなたのアプリケーションの始めに以下を追加するだけです:

 error_reporting(E_ERROR|E_WARNING);

これにより、E_NOTICEレポートが無効になります。 E_NOTICESはエラーではなく、名前が示すように通知です。このようなものをチェックアウトして、未定義の変数がエラーにつながらないことを証明した方がよいでしょう。しかし、一般的なケースは、それらが単に非公式であり、PHPでフォーム入力を処理するために完全に正常であるということです。

また、次回Googleが最初にエラーメッセージを表示します。

2
mario

これは単なるphp通知メッセージです。php.iniの構成はvtiger標準に準拠していないようです。エラーレポートE_ALL&〜E_NOTICE inに設定すると、このメッセージを無効にできます。 php.iniたとえば、error_reporting(E_ALL&~E_NOTICE)に続いてApacheを再起動変更を反映します。

2
mohammad

これを試して:

$month = ( isset($_POST['month']) ) ? $_POST['month'] : '';

$op = ( isset($_POST['op']) ) ? $_POST['op'] : '';
1
helderk

私が最初にチェックしたすべての変数を定義しました。 PHPでは必須ではないことは知っていますが、古い習慣は一生懸命死にます。次に、このような情報をサナタイズしました:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name1"])) {
    $name1Err = " First Name is a required field.";
  } else {
      $name1 = test_input($_POST["name1"]);
    // check if name only contains letters and whitespace
      if (!preg_match("/^[a-zA-Z ]*$/",$name1)) {
      $name1Err = "Only letters and white space allowed";

もちろんtest_inputは、トリム、ストライラッシュ、およびhtmlspecialcharsを実行する別の関数です。入力はかなり適切にサニタイズされていると思います。私がやったことを示すだけで失礼になろうとしない。メールについては、適切な形式であるかどうかも確認しました。本当の答えは、一部の変数がローカルで、一部がグローバルであるという事実にあると思います。私は今のところエラーなしで動作しているので、私は非常に忙しいですが、私は答えとしてエラーのシャットオフを受け入れます。心配する必要はありません。それは今のところ非常に重要ではないことがわかります!

0

データの送信元のフォームでmethod = "post"を使用したことを確認してください。

0
sanjay mundhra
<?php
if ($_POST['parse_var'] == "contactform"){


        $emailTitle = 'New Email From KumbhAqua';
        $yourEmail = '[email protected]';

        $emailField = $_POST['email'];
        $nameField = $_POST['name'];
        $numberField = $_POST['number'];
        $messageField = $_POST['message'];  

        $body = <<<EOD
<br><hr><br>
    Email: $emailField <br /> 
    Name:  $nameField <br />
    Message: $messageField <br />


EOD;

    $headers = "from: $emailField\r\n";
    $headers .= "Content-type: text/htmml\r\n";
    $success =  mail("$yourEmail", "$emailTitle", "$body", "$headers");

    $sent ="Thank You ! Your Message Has Been sent.";

}

?>


 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>:: KumbhAqua ::</title>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <link rel="stylesheet" href="style1.css" type="text/css">

</head>

<body>
    <div class="container">
        <div class="mainHeader">
            <div class="transbox">

              <p><font color="red" face="Matura MT Script Capitals" size="+5">Kumbh</font><font face="Matura MT Script Capitals" size="+5" color=                                                                           "skyblue">Aqua</font><font color="skyblue"> Solution</font></p>
              <p ><font color="skyblue">Your First Destination for Healthier Life.</font></p>
                    <nav><ul>
                        <li> <a href="KumbhAqua.html">Home</a></li>
                        <li> <a href="aboutus.html">KumbhAqua</a></li>
                        <li> <a href="services.html">Products</a></li>
                        <li  class="active"> <a href="contactus.php">ContactUs</a></li>

                    </ul></nav>
                </div>
            </div>
        </div>
                    <div class="main">
                        <div class="mainContent">
                            <h1 style="font-size:28px; letter-spacing: 16px; padding-top: 20px; text-align:center; text-transform: uppercase; color:                                    #a7a7a7"><font color="red">Kumbh</font><font color="skyblue">Aqua</font> Symbol of purity</h1>
                                <div class="contactForm">
                                    <form name="contactform" id="contactform" method="POST" action="contactus.php" >
                                        Name :<br />
                                        <input type="text" id="name" name="name" maxlength="30" size="30" value="<?php echo "nameField"; ?>" /><br />
                                         E-mail :<br />
                                        <input type="text" id="email" name="email" maxlength="50" size="50" value="<?php echo "emailField"; ?>" /><br />
                                         Phone Number :<br />
                                        <input type="text" id="number" name="number" value="<?php echo "numberField"; ?>"/><br />
                                         Message :<br />
                                        <textarea id="message" name="message" rows="10" cols="20" value="<?php echo "messageField"; ?>" >Some Text...                                        </textarea>
                                        <input type="reset" name="reset" id="reset" value="Reset">
                                        <input type="hidden" name="parse_var" id="parse_var" value="contactform" />
                                        <input type="submit" name="submit" id="submit" value="Submit"> <br />

                                        <?php  echo "$sent"; ?>

                                    </form>
                                        </div>  
                            <div class="contactFormAdd">

                                    <img src="Images/k1.JPG" width="200" height="200" title="Contactus" />
                                    <h1>KumbhAqua Solution,</h1>
                                    <strong><p>Saraswati Vihar Colony,<br />
                                    New Cantt Allahabad, 211001
                                    </p></strong>
                                    <b>DEEPAK SINGH &nbsp;&nbsp;&nbsp; RISHIRAJ SINGH<br />
                                    8687263459 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;8115120821 </b>

                            </div>
                        </div>
                    </div>

                            <footer class="mainFooter">
                            <nav>
                            <ul>
                                <li> <a href="KumbhAqua.html"> Home </a></li>
                                <li> <a href="aboutus.html"> KumbhAqua </a></li>
                                <li> <a href="services.html"> Products</a></li>
                                <li class="active"> <a href="contactus.php"> ContactUs </a></li>
                            </ul>
                                <div class="r_footer">


          Copyright &copy; 2015 <a href="#" Title="KumbhAqua">KumbhAqua.in</a> &nbsp;&nbsp;&nbsp;&nbsp; Created and Maintained By-   <a title="Randheer                                                                                                                                                                                                                             Pratap Singh "href="#">RandheerSingh</a>                                                                            </div>  
                            </nav>
                            </footer>
    </body>
</html> 

    enter code here
0

「month」または「op」という名前のフォーム要素は存在しないと思います。 (送信時にエラーが発生するページの)HTMLソースに、上記の名前のHTML要素があるかどうかを確認できますか

0
Chandu

未定義のインデックスは、配列キーが設定されていないことを意味し、エラーをスローする行の前にvar_dump($_POST);die();を実行し、存在しない配列キーを取得しようとしていることを確認します。

0
Poelinca Dorin

配列(この場合は$ _POST)に、エラーで未定義の要素が含まれていないことを意味します。 PHP WARNING of FATAL ERRORの代わりにNOTICEを発行します。

Php.iniを編集することにより、より少ないイベントを記録するか、isset()を使用してアイテムが実際に初期化されているかどうかを最初にチェックすることで対処できます。

0
digitalfoo