php变量unidentified index

时间:2013-09-16 19:14:57

标签: php variables

我还是php的初学者,我似乎无法理解这里有什么问题。即使存在“未识别的索引”错误,代码仍然有效。我得到的错误是指变量$ food,$ calories,$ healthy,$ submit。

代码是:

<?php

require 'connect.inc.php';

$foodname = $_POST['food_name'];
$calories = $_POST['calories'];
$healthy = $_POST['healthy_unhealthy'];
$submit_button = $_POST['submit'];

$sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

if(isset($submit_button)&&!empty($foodname)&&!empty($calories)&&!empty($healthy))
{
    mysql_query($sql, $conn);
}
else{
echo'Kindly fill in fields';
}

?>
<form action="insert.php" method="POST">
Food Name:<br>
<input type="text" name="food_name"><br>
Calories:<br>
<input type="text" name="calories"><br>
Healthy:<br>
<input type="text" name="healthy_unhealthy"><br>
<input type="submit" name="submit">
</form>

6 个答案:

答案 0 :(得分:3)

首先,确保您处于接受数据的适当状态。将您的代码包装在:

<?php

require 'connect.inc.php';

// We only run this code if the user has POSTed data to this page. Without this we 
// will get an 'undefined index' error.
if(isset($_POST['submit'])) {
    $foodname = $_POST['food_name'];
    $calories = $_POST['calories'];
    $healthy = $_POST['healthy_unhealthy'];
    $submit_button = $_POST['submit'];

    $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

    if(isset($submit_button)&&!empty($foodname)&&!empty($calories)&&!empty($healthy))
    {
        mysql_query($sql, $conn);
    }
    else{
        echo'Kindly fill in fields';
    }
}

?>
<form action="insert.php" method="POST">
Food Name:<br>
<input type="text" name="food_name"><br>
Calories:<br>
<input type="text" name="calories"><br>
Healthy:<br>
<input type="text" name="healthy_unhealthy"><br>
<input type="submit" name="submit">
</form>

这将确保您当前正在从您定义的表单中接收POST请求。

$ _POST变量是一个数组,其中包含您通过POST请求发送到Web应用程序的数据。在您的表单中,您应该具有适当名称的字段(food_name,calories,healthy_unhealthy等)。听起来这些字段可能会丢失。

在您的代码中,靠近顶部的位置,放入以下内容:

print_r($_POST);

或者,你可以做一个

var_dump($_POST);

这将打印出$ _POST变量的内容。如果您没有看到对food_name,calories或healthy_unhealthy的任何引用,请检查您的表单是否正确并将这些变量传递给Web应用程序。

答案 1 :(得分:2)

尝试在你的php中放一个包装器......就像这样:

if (isset($_POST['submit'])) {
    //code here....
}

并将你的表格改为:

<form action="" method="POST">

调试..使用此:

var_dump($toDebug);

答案 2 :(得分:1)

第一次加载页面时,您会看到Undefined Index错误消息。

要修复错误,请使用isset()并检查表单是否已实际提交:

if(isset($_POST['submit'])) { 
print_r($_POST); //to see all the form inputs
// your code ...

}

我还要检查是否设置了变量:

$foodname = (isset($_POST['food_name'])) ? $_POST['food_name'] : NULL;
$calories = (isset($_POST['calories'])) ? $_POST['calories'] : NULL;
$healthy = (isset($_POST['healthy_unhealthy'])) ? $_POST['healthy_unhealthy'] : NULL;

无关旁注:您的代码容易受到SQL注入攻击。不要直接在MySQL查询中插入变量,而是先使用mysql_real_escape_string()转义它们,如下所示:

$foodname = mysql_real_escape_string($foodname);
$calories = mysql_real_escape_string($calories);
$healthy = mysql_real_escape_string($healthy);

这有助于防止SQL注入。更好的是,停止使用mysql_*函数。它们不再被维护and are officially deprecated。请改为了解prepared statements,并使用PDOMySQLi

通过更正,您的代码应如下所示:

if(isset($_POST['submit'])) 
{
    /* form was submitted, proceed */

    $submit_button = $_POST['submit'];

    /* checking if user inputs are set */
    $foodname = (isset($_POST['food_name'])) ? $_POST['food_name'] : NULL;
    $calories = (isset($_POST['calories'])) ? $_POST['calories'] : NULL;
    $healthy = (isset($_POST['healthy_unhealthy'])) ? $_POST['healthy_unhealthy'] : NULL;

    /* escaping user inputs */
    $foodname = mysql_real_escape_string($foodname);
    $calories = mysql_real_escape_string($calories);
    $healthy = mysql_real_escape_string($healthy);

    //query
    $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

    /* storing query result to a variable */
    $result = mysql_query($sql, $conn);

    if($result) 
    { 
        //do stuff
    } 
    else 
    {
        die(mysql_error()); //display error, and exit
    }
}

希望这有帮助!

答案 3 :(得分:1)

PHP允许您使用未定义或未声明的变量。当您引用一个从未声明过的变量时,您会收到此通知。

当遇到未识别的变量时,它将采用扣除类型的默认“零”值。数字为0,字符串为空字符串。

在您的情况下,$_POST变量未填充值(它们通过POST表单填充),并且您会收到每个未识别变量的通知。

更多信息可以在documentation中找到:

  

没有必要在PHP中初始化变量,但这是一个非常好的做法。未初始化的变量具有其类型的默认值,具体取决于使用它们的上下文 - 布尔值默认为FALSE,整数和浮点数默认为零,字符串(例如,在echo中使用)设置为空字符串,数组变为空阵列。

这是否是一个聪明的语言设计决定,我会留给自己。

答案 4 :(得分:0)

您有此代码

$sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

if(isset($submit_button)&&!empty($foodname)&&!empty($calories)&&!empty($healthy))
{
    mysql_query($sql, $conn);
}

在哪里,你使用if语句之外的那些变量,并且第一次不可用,所以,你可以使用,( $sql变量应填入if语句< /强>)

if( isset($_POST['submit']) && (!empty($foodname) && !empty($calories) &&!empty($healthy)) ) { 
    $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";
    mysql_query($sql, $conn);
}

此外,您可以使用(更好)

if( isset($_POST['submit']) ) { 
    $foodname = $_POST['food_name'];
    $calories = $_POST['calories'];
    $healthy = $_POST['healthy_unhealthy'];
    if( !empty($foodname) && !empty($calories) && !empty($healthy) ){
        $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";
        mysql_query($sql, $conn);
    }
}

答案 5 :(得分:0)

Unindentified index不是错误,而是通知。它不会停止你的脚本,因此它会继续。

请记住,您的$_POST - 变量可能为空,这就是导致此通知出现的原因。这本身不是问题,但是你继续在sql语句中使用这个(现在没有正确初始化的变量) - 如果处理不当可能会产生问题。

对于调试目的,请快速var_dump($_POST);查看其中的内容。

您可以使用isset()函数来避免这种情况:

if (isset($_POST['food_name'])) {
    //do something here
}

我倾向于随时初始化我的变量,p.e。像这样:

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

这会导致更棘手的问题:SQL安全性。像这样编码,你的脚本很容易发生sql注入攻击。

关于这个主题的两个建议:

  • 不要使用mysql扩展名。它已被弃用,请改用mysqlipdo:mysql
  • 在使用变量之前清理变量(p.e. using mysqli_real_escape_string,或者更好的是,使用预处理语句。