【问题标题】:PHP error: Notice: Undefined index:PHP错误:注意:未定义的索引:
【发布时间】:2011-05-26 19:53:41
【问题描述】:

我正在使用 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;
    }
?>  

【问题讨论】:

  • 请发布您的其余代码。未定义的索引错误意味着未发送该键的发布数据,索引为“月”和“操作”。某些东西要么将其设置回 NULL,要么根本没有发送它们,并且表单存在问题。
  • 编辑:很抱歉忘记提及当用户提交数据时它们会消失。但是,当他们第一次访问该页面时,它会显示此错误。我怎样才能摆脱它,让它不显示它?
  • 检查用户是否提交?
  • 大约一百万个问题的精确副本,以PHP Undefined Index开头

标签: php variables indexing undefined


【解决方案1】:

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

【讨论】:

  • 请更详细地描述您的解决方案。
  • 在我的情况下,通过替换表单标签解决了问题;
    =$row['id'];?> =$row['adrs'];?> =$row['ownr'];?> =$row['rmrk'];?> echo ''; } ?> 像这样;单选按钮 标签在循环块之后关闭。
  • 您应该编辑您的答案,并添加格式化的源代码。不可读。
【解决方案2】:

我确实定义了我首先检查的所有变量。我知道这在 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 的函数。我认为输入已经很好地消毒了。不要试图粗鲁,只是展示我的所作所为。当涉及到电子邮件时,我还检查了它是否是正确的格式。我认为真正的答案是,有些变量是局部的,有些是全局的。我现在已经让它没有错误地工作了,所以虽然我现在非常忙,但我会接受关闭错误作为我的答案。别担心,我会发现它现在并不重要!

【讨论】:

    【解决方案3】:
    <?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
    

    【讨论】:

    • 出现两个错误 1) 未定义索引:parse_var 2) 发送未定义变量
    【解决方案4】:

    试试这个:

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

    【讨论】:

      【解决方案5】:

      确保您在发送数据的表单中使用了 method="post"。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            您是否将表单处理器与表单放在同一个脚本中?如果是这样,它会在设置 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 问题,我可以保证您以后会头疼。有许多很棒的稳定版本可供下载,有些像单纯的对象模型一样简单。

            【讨论】:

            • 嗨,是的,表单与脚本在同一页面上,所以我认为这是问题之一,现在放置错误报告代码已删除错误,但我在其他位上有问题代码,所以我认为我真的需要重组一切!
            • 不幸的是,我不能使用任何现成的购物车,因为它是任务的一部分,我们必须在 php 中建立一个动态网站,用户可以在其中收养动物等,所以必须从头开始编程,并且讲师希望完成整个事情的方式使其变得更加复杂,
            • 啊,那么这就是家庭作业了。这对这些部分有点挑剔,哈哈。 webforcecart.com
            • 查看该类中如何处理添加和删除项目。应该为您指明正确的方向。
            • 由于newbees possible misunderstanding:$_POST 始终设置,无论 sapi,还是 GET 或 POST(HEAD,PUT,..),除非在 variables_order 中明确禁用(PHP_INI_DIR 自php 5.0.5,所以如果在那里禁用它可能总是为文件禁用)。仅用isset($_POST['name_of_your_submit_input']) 总结以上内容即可。
            【解决方案9】:

            我怎样才能摆脱它,让它不显示?

            这里的人们试图告诉你这是不专业的(确实如此),但在你的情况下,你应该简单地在你的应用程序的开头添加以下内容:

             error_reporting(E_ERROR|E_WARNING);
            

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

            另外,下次先谷歌一下错误信息。

            【讨论】:

            • 从他最后的评论来看,我认为他并没有首先检查表单提交。之所以发出通知,是因为正在对尚未发送的数据进行任何处理。
            • @DeaconDesperado:可能。无论如何,一个 sn-p 看起来好像 $_POST 输入变量只是在脚本的开头本地化。处理可能由另一个if 触发,或者只是其中一个变量的布尔状态。 ...我们永远不会发现:}
            • 因此它仍将是我们这个时代最大的谜团之一......这不会阻止它一次又一次地被发布,哈哈。
            【解决方案10】:

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

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

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

            【讨论】:

              【解决方案11】:

              显然 $_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
              }
              

              【讨论】:

              • 我个人避免使用 'is_set',因为如果 $_POST['month'] 已设置为 null,它会返回 false。当您真的要询问数组键是否存在时,请使用array_key_exists。
              • @meagar:任何$_POST[] var 都不太可能包含NULL,如果它源自multipart/form-data。如果子函数通过 $_POST 注入状态,那只会是一个问题,这应该比区分 null 和 unset 更令人担忧。
              【解决方案12】:

              这只是意味着数组,在这种情况下为 $_POST,没有一个名为 what is undefined 在您的错误中的元素。 PHP 发出 NOTICE 而不是 WARNING of FATAL ERROR。

              您可以通过编辑 php.ini 来记录更少的事件,或者通过首先使用 isset() 检查项目是否确实已经初始化来处理它

              【讨论】:

                【解决方案13】:

                未定义的索引表示未设置数组键,在抛出错误的行之前执行var_dump($_POST);die(); 并查看您正在尝试获取不存在的数组键。

                【讨论】:

                  【解决方案14】:

                  我认为不可能有名称为“月”或“操作”的表单元素。您能否验证 HTML 源(提交时导致错误的页面)是否确实具有上述名称的 html 元素

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-03-20
                    • 2014-06-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-02-06
                    • 1970-01-01
                    相关资源
                    最近更新 更多