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


Undefined index errors accessing $_POST

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

注意:未定义的索引:C:'xampp'htdocs'shop.php第9行

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

下面是我的代码:
<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>";
    }
}

} 
?>

错误提示您正在访问一个不存在的数组项!

但通常你应该检查这些变量的存在(即使你确定表单已经发送):

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

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

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

请考虑升级到MySQLiPDO !关于这些主题有很多很好的资源。

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

解决方案

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

$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,
);

:

  • 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(),因为它不会跳过"empty"或null值。

附录

有指向文档的链接:

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

你应该为每个表单设置一个隐藏的输入,而不是试图监听一个提交按钮。并不是所有版本的PHP都将提交按钮注册为一个值。你还写了"if(isset($_POST['submit']))"两次,这将使php返回两个if语句为真。希望对大家有所帮助

我不能理解你想做的事情的逻辑。你能再解释一下吗?此外,您的第一个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

检查括号

尝试更改响应表单的代码:-

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属性设置为相同的值。

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

print_r($_POST);

将显示正在发布的内容。

嘿,把method改成"POST"而不是"POST",希望它能像我一样解决你的问题。

快乐编码