PHP错误:注意:未定义的索引:

时间:2010-12-16 21:53:07

标签: php variables indexing undefined

我正在使用PHP购物车,我似乎在各种各样的地方收到此错误“注意:未定义的索引:”。错误指的是不同位置的类似编码位。例如,我有一段编码,用于计算用户决定订阅的月份的套餐价格。我有以下错误引用的变量:

    $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;
    }
?>  

15 个答案:

答案 0 :(得分:27)

您正在尝试访问未设置的数组中的标记。这引起了注意。

您现在很可能会注意到它,因为您的代码已移至php.ini已将error_reporting设置为包含E_NOTICE的服务器。通过将error_reporting设置为E_ALL & ~E_NOTICE(不推荐)来抑制通知,或者在尝试访问索引之前验证索引是否存在:

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

答案 1 :(得分:13)

您是否将表单处理器放在与表单相同的脚本中?如果是这样,它会在设置post值之前尝试处理(一切都在执行)。

将所有处理代码包装在条件中,以检查表单是否已被发送。

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这样的成熟电子商务解决方案,请不要冒犯。购物车是一个需要高度安全性的界面,如果您正在努力解决这些POST问题,我可以保证您以后会感到头疼。有许多非常好的稳定版本,有些像对象模型一样简单,可以下载。

答案 2 :(得分:3)

显然$ _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 :(得分:2)

  

我如何摆脱它以便它不显示它?

这里的人们试图告诉你它不专业(而且是),但在你的情况下你应该只是在应用程序的开头添加以下内容:

 error_reporting(E_ERROR|E_WARNING);

这将禁用E_NOTICE报告。正如名称所示,E_NOTICES不是错误,而是通知。您最好检查一下这些东西并证明未定义的变量不会导致错误。但常见的情况是它们只是非正式的,对于使用PHP处理表单输入是完全正常的。

此外,下次Google首先出现错误消息。

答案 4 :(得分:2)

这只是php通知消息,看来php.ini配置不符合vtiger标准, 您可以将错误报告设置为 E_ALL&amp; php.ini 中的~E_NOTICE 例如error_reporting(E_ALL&~E_NOTICE)然后重新启动apache 以反映更改。

答案 5 :(得分:1)

试试这个:

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

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

答案 6 :(得分:0)

我认为名称'month'或'op'可能没有表单元素。你可以验证HTML源代码(提交时导致错误的页面)是否确实具有上面名称的html元素

答案 7 :(得分:0)

未定义的索引意味着未设置数组键,在引发错误的行之前执行var_dump($_POST);die();并看到您正在尝试获取不存在的数组键。

答案 8 :(得分:0)

它只是意味着在这种情况下,数组$ _POST没有一个名为你的错误中未定义的元素。 PHP发出NOTICE而不是FATAL ERROR警告。

您可以通过编辑php.ini来记录较少的事件,或者通过首先使用isset()

检查项目是否确实已经初始化来处理它

答案 9 :(得分:0)

确保您使用过方法=&#34; post&#34;在您发送数据的表格中。

答案 10 :(得分:0)

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


        $emailTitle = 'New Email From KumbhAqua';
        $yourEmail = 'xyz@gmail.com';

        $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

答案 11 :(得分:0)

我确实定义了所有变量,这是我检查过的第一件事。我知道在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是另一个执行trim,strilashes和htmlspecialchars的函数。我认为输入已经很好地消毒了。不要只是粗暴地展示我的所作所为。当谈到电子邮件时,我还检查了它是否是正确的格式。我认为真正的答案是,一些变量是局部的,一些是全局的。我现在没有错误地工作,所以我现在非常忙,我会接受关闭错误作为我的答案。别担心我会弄清楚它现在不是非常重要!

答案 12 :(得分:-1)

显然,GET和/或POST变量不存在。只测试“是否”。 (伪代码):

if(isset($_GET['action'];)) {$action = $_GET['action'];} else { RECOVER FROM ERROR CODE }

答案 13 :(得分:-1)

要隐藏所有错误,代码为

<?php 
      error_reporting(0);
      @ini_set(‘display_errors’, 0);
//THE REST OF THE CODE
 ?>

答案 14 :(得分:-1)

确保标签正确关闭。并且结束标记将不包括在循环内。 (如果它包含在循环结构中)。