PHP:避免未定义的索引?
每当一个POST值不等于数组中设置的值列表时,将返回:Undefined Index error,我做了一个if语句,但不起作用 以下是if声明:PHP:避免未定义的索引?,php,Php,每当一个POST值不等于数组中设置的值列表时,将返回:Undefined Index error,我做了一个if语句,但不起作用 以下是if声明: if ($products[$_POST['product']] == $_POST['product']) { do everything;} else { echo "This item is not available"; } EDIT2: 看到目前的情况,避免警告不会有多大帮助,因为我正在处理几个因素,例如购物车中的物品列表,如果不删除无
if ($products[$_POST['product']] == $_POST['product']) {
do everything;}
else {
echo "This item is not available";
}
EDIT2:
看到目前的情况,避免警告不会有多大帮助,因为我正在处理几个因素,例如购物车中的物品列表,如果不删除无效产品,它将添加到购物列表会话中
这是完整的脚本:
<?php
session_start();
//Getting the list
$_SESSION['list'] = isset($_SESSION['list']) ? $_SESSION['list'] : array();
//stock
$products = array(
'Pineaple' => 500, 'Banana' => 50, 'Mango' => 150,
'Milk' => 500, 'Coffe' => 1200, 'Butter' => 300,
'Bread' => 450, 'Juice' => 780, 'Peanuts' => 800,
'Yogurt' => 450, 'Beer' => 550, 'Wine' => 2500,
);
if( isset($_POST['product']) ){
//Saving the stuff
$new_item = array(
'item' => $_POST['product'],
'quantity' => $_POST['quantity'],
'code' => $_POST['code'],
'price' => $products[$_POST['product']] * $_POST['quantity'],
);
$new_product = true;
foreach($_SESSION['list'] as $key => $item) {
if ($item['item'] == $new_item['item']) {
$_SESSION['list'][$key]['quantity'] += $new_item['quantity'];
$_SESSION['list'][$key]['price'] = $products[$new_item['item']] * $new_item['quantity'];
$new_product = false;
}
}
if ($new_product) {
$_SESSION['list'][] = $new_item;
}
/*if ($new_item['item'] != $products[$new_item['item']]) {
echo "This item is not available";}*/
//listing
echo "<b>SHOPPING LIST</b></br>";
foreach($_SESSION['list'] as $key => $item) {
echo 'Product .'. $key. ' '. $item['item'], ' ', $item['quantity'], ' units: ', $item['price']. '<br />';
}
}
else {
echo "This item is not available";
}
echo "</br> <a href='index.html'>Return to index</a> </br>";
//Printing session
var_dump($_SESSION);
session_destroy();
?>
您应该首先检查$\u POST['product']是否设置了,例如: 这将抑制警告
if (isset($products[$_POST['product']]) && $products[$_POST['product']] == $_POST['product'])
函数的作用是:避免出现警告
if(isset($products[$_POST['product']) && $products[$_POST['product'] != "")
请注意,vrable可以是空的,但也可以是“set”,因此&&之后的内容是必需的。您可以检查索引“product”是否在同一if语句中定义
if (isset($_POST['product']) && $products[$_POST['product']] == $_POST['product']) {
do everything;
}
else {
echo "This item is not available";
}
我被你的代码弄糊涂了。看起来您的数组具有相同的键和值,因此:
$products['saucepan'] = 'saucepan'
可能您正在尝试执行此操作,这将检查产品阵列中是否存在该产品:
if(isset($_POST['product']) && array_key_exists($_POST['product'], $products))
{
// do stuff
}
else
{
echo "This item is not available";
}
你也可以试试
$product = (isset($_POST['product'])) ? $_POST['product'] : null;
这将把$product设置为$U POST值(如果存在),或者设置为null(如果不存在)。
那你可以试试
if ($product) {
do_something();
}
或者使用
$products[$product];
我觉得这样可以让你的代码看起来更容易
@$_POST['product']
(使用@)将返回与以下内容相同的内容:
$product = (isset($_POST['product'])) ? $_POST['product'] : null;
越短越甜代码减少4倍!更容易阅读和理解
@符号是错误控制运算符(也称为“静音”或
“闭嘴”接线员)。它使PHP抑制任何错误消息(注意,
警告、致命等)
但请注意不要将@用于任何其他用途,因为它会使您的代码更难调试
(这将在编辑之前回答您的问题)使用PHP7,可以使用来处理可选的请求变量。您可以将您的
$\u POST['product']
引用更改为$\u POST['product']??null
如果“product”不是post数组中的有效键,则将解析为null(而不是抛出警告)。如果要检查$\u POST和$\u GET数组中的值,可以使用$\u POST['product']$_获取['product']??空
如果未设置值,则可以使用??
设置默认值
$\u POST[“产品”]??“无产品”
+1对于数组键存在,isset
是一个更具体、更有用的老大哥。你可以使用如果(空($products[$\u POST['product'])
,它也会检查值是空还是0。@Blowski:如果索引0对$product有效,那么?@Gaurav Fair point。我会检查$U POST['product']首先使用array\u key\u exists()要避免php中的索引错误,这似乎不是一个好的答案。沉默错误从来都不是正确的方法。@EvanHendler先检查isset,然后评估值并不比“@”好!但对于其他事情,沉默错误不是一件好事-这就是为什么我在答案中警告人们这一点。我必须走了对于Cedric来说,@
操作符的使用非常有限,到目前为止,我只在@session\u start()
上使用过它(显然没有功能原因,这会引发一个恼人的通知),$var=@$\u POST['var']
太好了,不能将其放入“从不抑制错误”框中。@EvanHendler沉默错误从来都不是正确的方法,但沉默通知则是另一回事。通知可能有助于找到后续错误的原因,但如果我的代码可以使用null而不是预期值,则此强制数组\u key\u exists()可能会对PHP中的代码造成相当大的污染,使其更难理解。伙计!你刚刚成就了我的一天,我已经找了很久了。请投票支持引用新的(ish)运算符。它更具声明性且更短。这应该是最好的答案,它的键入速度肯定更快,并且答案作者强调了它在上下文中的用法,这一点并不明显。
$product = (isset($_POST['product'])) ? $_POST['product'] : null;