访问$ _POST的未定义索引错误

时间:2011-11-28 17:49:44

标签: php html forms

我一直试图解决这个问题,但它给了我同样的错误:

  

注意:未定义的索引:第9行的C:\ xampp \ htdocs \ shop.php中的项目

     

注意:未定义的索引:第24行的C:\ xampp \ htdocs \ shop.php中的正文

这是我的代码:

<form action="" method="post">
    <input type="radio" name="items" value="fed" /> Fed<br />
    <input type="radio" name="items" value="body" /> Body<Br>
    <input type="submit" name="submit"><br>
</form> 

<?php
if(isset($_POST['submit'])) {
     $items = $_POST['items'];
     if($items=="fed") {
         echo "You choose feds";    
         die();
     }
     else
         echo "<Form action='' method='POST'>
         <select name='body'>
         <option value='head'>Head</option>
         </select>
         <input type='submit' name='submit' value='submit' /><br />
         </form>";

 if(isset($_POST['submit'])) {
    $body = $_POST['body'];
    $connect = mysql_connect("localhost","root","")or die(mysql_error());
    mysql_select_db("feds",$connect)or die(mysql_error());

    $merchandise = mysql_query("SELECT * FROM merchandise WHERE body_part='$body' ")or     die(mysql_error());

    while($row = mysql_fetch_array($merchandise)) {
        echo $row['item'];  
        echo "<bR>";
    }
}


} 
?>

7 个答案:

答案 0 :(得分:3)

错误消息表明您正在访问不存在的数组项目!

但一般来说,你应该检查这些变量是否存在(即使你确定表格已经发送):

$items = isset($_POST['items']) ? $_POST['items'] : outputError('...');

请修复您的SQL注入安全漏洞!!

$body = mysql_real_escape_string( $_POST['body'] );

请考虑升级到 MySQLi PDO !这些主题有很多很好的资源。

答案 1 :(得分:2)

这些不是错误,它们是通知。但是它们应该在生产环境中修复,因为这会提示您在某些情况下代码可能无法正常工作。

解决方案

根据您想要实现的目标,您可以使用以下代码:

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

并且您确定您的$items变量包含某些内容(至少为空字符串)。当然,根据您的代码架构,您可以将空字符串替换为falsenull,但这取决于您。

关于使用isset()empty()

的提示

不要使用它们来检查数组中是否存在特定元素 - 使用array_key_exists()。有什么区别?

我们假设$my_array看起来像这样:

$my_array = array(
    'a' => 'abc',
    'b' => 0,
    'c' => '',
    'd' => null,
);

然后:

    {li> empty() $my_array['b']$my_array['c']$my_array['d']将返回true,因为所有这些值都被视为空,而$my_array['e']将会{还返回true,因为不存在的值/变量也被视为空, 所有元素的
  • isset()将返回true$my_array['d']除外,因为isset()将等于null的变量视为未设置。 isset($my_array['e'])也将返回`false(因为未设置变量),
  • array_key_exists()将为数组中实际存在的每个键返回true,如果不存在则返回false

因此,如上所述,检查某个元素是否在数组中定义的更好选项是使用array_key_exists(),因为它不会跳过“空”或null值。

附录

有文档链接:

  • isset() - 确定变量是否已设置且不是NULL
  • empty() - 确定变量是否为空(空字符串,0为整数,0.0为浮点数,'0' - 零为字符串,nullfalse或空数组array()),
  • array_key_exists() - 实际检查数组中是否存在给定的键或索引,

答案 2 :(得分:0)

未定义的索引意味着您正在尝试访问不存在的数组键。您的表单可能不像您期望的那样发布。一个简单的:

print_r($_POST);

将显示发布的内容。

答案 3 :(得分:0)

我无法理解你想要做什么的逻辑。你能解释一下吗?您的第一个if条件也会被错误关闭。您的结构如下:

if(user submits) //true
{
if(){ do something}
else{ do something}

if(user submits) //true
{
//you call body variable, which is not defined the first time user submits the page, thus the error
}

}//original if ends

所以,检查括号。

答案 4 :(得分:0)

您应该为每个表单创建一个隐藏的输入,而不是尝试收听提交按钮。 并非所有版本的php都将提交按钮注册为值。 你也写了“if(isset($ _ POST ['submit']))”两次,这将使php返回if-statements都是真的..希望这有帮助

答案 5 :(得分:0)

尝试将回显表单的代码更改为: -

echo "<Form action='' method='POST'>
     <select name='body' id='body'>
     <option value='head'>Head</option>
     </select>
     <input type='submit' id='submit' name='submit' value='submit' /><br />
     </form>";

注意我已经将id添加到表单元素中,最好将id和name属性设置为表单的相同值。

答案 6 :(得分:0)

嘿,只需使用方法&#34; POST&#34;而不是&#34; post&#34; .hope所以它会像我一样解决你的问题。

快乐编码