【问题标题】:Notice : Undefined index in php注意:php中未定义的索引
【发布时间】:2014-02-06 11:55:12
【问题描述】:

我的数据正在保存在数据库中,但显示以下通知:

注意:未定义索引:D:\xampp\htdocs\savedata\saa.php 中的 fname 第 20 行

注意:未定义索引:lname in D:\xampp\htdocs\savedata\saa.php on 第 20 行

已添加 1 条记录

这是验证码:

    <?php
    $firstname=$lastname="";
    $firstnameErr=$lastnameErr="";
    if ($_SERVER['REQUEST_METHOD']== "POST") {
       $valid = true; //Your indicator for your condition, actually it depends on what you need. I am just used to this method.
     if(empty($_POST["fname"]))
    {
        $firstnameErr="*Name is Required";
        $valid=false;
    }
    else
    {
    $firstname=test_input($POST["fname"]);  
    }  

    if(empty($_POST["lname"]))
    {
        $lastnameErr="*Name is Required";
        $valid=false;
    }
    else
    {
    $$lastname=test_input($POST["lname"]);  
    }  

     //if valid then redirect
      if($valid){

          echo '<META HTTP-EQUIV="Refresh" Content="0; URL=saa.php">';    
        exit;
    //   header('Location: datasubmitted.php');
    //   exit();
      }
    }
    // Sanitize data
    function test_input($data) {
       $data = trim($data);
       $data = stripslashes($data);
       $data = htmlspecialchars($data);
       return $data;
    }
    ?>

html表单代码

    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
    Firstname: <input type="text" name="fname" /><?php echo $firstnameErr;?><br />
    Lastname: <input type="text" name="lname" /><?php echo $lastnameErr?>

    <input type="submit" name="submit" value="Submit"/>
    </form>

在数据库中插入数据的代码

<?php
$con = mysql_connect("localhost","root","geetha@99");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("test", $con);

$sql="INSERT INTO nametable (firstname,lastname)
VALUES
('$_POST[fname]','$_POST[lname]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con)
?>

【问题讨论】:

  • $POST["fname"] 是您在验证脚本中的错误,$_POST["fname"] 是正确的。
  • 同意@АндрейПочекуев
  • @АндрейПочекуев : 很好。但它不会抛出error,而不是警告!! :)
  • 为什么会这样?它查找空数组$POST,发现其索引"fname" 和"lname" 为空并发出通知。 $$lastname 虽然会引发错误,因为它会尝试使用空变量名,但代码永远不会到达该部分。

标签: php html mysql css undefined


【解决方案1】:

这是一个通知;不是错误

要解决此问题,您必须检查是否设置了 $_POST['fname'] 和 $_POST['lname']:

if(!isset($_POST["fname"] && empty($_POST["fname"])) {
   ...
}

if(!isset($_POST["lname"] && empty($_POST["lname"])) {
  ...
}

【讨论】:

    【解决方案2】:

    首先,直接在查询中使用$_POST 变量会使您的代码不安全,因为mysql 注入危险。如果没有绑定参数的 PDO,至少使用 mysql_real_escape_string($_POST['var'])。

    第二,mysql_*函数已弃用。

    关于您的错误消息,让我们知道第 20 行是哪一行会有所帮助。

    无论如何,你的错误是因为你使用了类似$_POST[fname] 的东西,而没有测试$_POST[fname] 是否存在。另外,请使用$_POST['fname'] 而不是$_POST[fname]。

    $p_fname = '';
    if (isset($_POST['fname'])) $p_fname = $_POST['fname'];
    //then
    $sql = "INSERT ..... SET field='".mysql_real_escape_string($p_fname)."'";
    

    如果你不关心 E_NOTICE 级别的错误,你就放

    error_reporting(E_ALL^E_NOTICE); //at the top of your scripts
    

    【讨论】:

      【解决方案3】:

      您可以通过在页面顶部使用此条件来忽略此通知,

      <?php
      if(isset($_POST['fname']) && $_POST['fname']!=''){ $firstname=$_POST['fname'];}else{$firstname='';}
      if(isset($_POST['lname']) && $_POST['lname']!=''){ $lastname=$_POST['lname'];}else{$lastname='';}
      ?>
      

      并使用$firstname 和$lastname 插入$_POST[fname] 和$_POST['lname']。

      【讨论】:

        【解决方案4】:

        发生这种情况是因为您的fname 变量在检查条件时未设置在POST 中.....所以$_POST["fname"] 为空,因此引发undefined 警告

        这样使用:

        if(isset($_POST["fname"]) && !empty($_POST["fname"]))
        {
           /* execution part*/
        }
        

        【讨论】:

        • 不应该是!empty(...)
        【解决方案5】:

        您的脚本中有几个拼写错误。第一个

         $firstname=test_input($POST["fname"]);
        

        应该是

         $firstname=test_input($_POST["fname"]);
        

        第二个包含两个

         $$lastname=test_input($POST["lname"]);
        

        应该是

         $lastname = test_input($_POST["lname"));
        

        【讨论】:

          【解决方案6】:

          对于数组元素的验证,不要使用空,而是使用 array_key_exists

          您的验证可能是

          if(array_key_exists('lname', $_POST) && empty($_POST["lname"]))
          {
              $lastnameErr="*Name is Required";
              $valid=false;
          }
          

          或者您应该使用 filter_input 函数获取元素。这是首选方法

          $lname = filter_input(INPUT_POST, 'lname');
          
          if (empty($lname)) {
              $lastnameErr="*Name is Required";
              $valid=false;
          }
          

          对于插入元素,我不鼓励在查询中使用 $_POST 变量,而是用它的转义版本替换。

          您可以将此检查放入验证中

          $lname = mysqli_real_escape_string($connection, $lname);
          

          另一个注意事项:不要使用 mysql_ 函数,因为它们已被弃用。您必须使用 mysqli_ 扩展。 http://www.php.net/manual/en/class.mysqli.php

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-02
            • 2013-03-20
            • 1970-01-01
            • 2011-05-26
            • 2016-04-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多