Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:避免未定义的索引?_Php - Fatal编程技术网

PHP:避免未定义的索引?

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: 看到目前的情况,避免警告不会有多大帮助,因为我正在处理几个因素,例如购物车中的物品列表,如果不删除无

每当一个POST值不等于数组中设置的值列表时,将返回:Undefined Index error,我做了一个if语句,但不起作用

以下是if声明:

 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;