PHP:避免未定义的索引?

时间:2011-04-30 05:15:09

标签: php

每次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();

?>

9 个答案:

答案 0 :(得分:18)

我对你的代码感到有点困惑。看起来你的数组具有相同的键和值,所以:

$products['saucepan'] = 'saucepan'

也许您正在尝试这样做,这将检查产品数组中是否存在产品:

if(isset($_POST['product']) && array_key_exists($_POST['product'], $products))
{
  // do stuff
}
else
{
  echo "This item is not available";
}

答案 1 :(得分:8)

您应首先检查$ _POST ['product']是否设置为isset(),例如:

if( isset($_POST['product']) ){
    // Do something with $_POST['product']
}

这应该取消警告。

答案 2 :(得分:6)

@$_POST['product']

(使用 @ )将返回相同的内容:

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

更短更甜!! 代码少4倍!更易于阅读和理解。

  

@符号是错误控制操作符(AKA&#34;沉默&#34;或   &#34;闭嘴&#34;运营商)。它使PHP抑制任何错误消息(注意,   警告,致命等。)。

但要注意不要将@用于任何其他事情,因为它会使你的代码更难调试!

(这将在编辑前回答您的问题)

答案 3 :(得分:4)

在PHP 7中,null coalescing operator可用于处理可选的请求变量。您可以将$_POST['product']的引用更改为$_POST['product'] ?? null,如果'product'在post数组中不是有效的键,则它将解析为null(而不是发出警告)。如果要同时检查$ _POST和$ _GET数组的值,则可以使用$_POST['product'] ?? $_GET['product'] ?? null

答案 4 :(得分:3)

您也可以尝试

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

如果存在,则将$ product设置为$ _POST值,否则设置为null。 然后你可以尝试

if ($product) {
  do_something();
}

或使用

访问您的数组
$products[$product];

我觉得这样可以使你的代码在眼睛上更容易一些......

答案 5 :(得分:0)

if (isset($products[$_POST['product']]) && $products[$_POST['product']] == $_POST['product']) 

isset()函数将帮助您避免警告

答案 6 :(得分:0)

if(isset($products[$_POST['product']) && $products[$_POST['product'] != "")

请注意,变量可以为空,但也可以“设置”,以便在&amp;&amp;是必要的。

答案 7 :(得分:0)

您可以检查索引'product'是否在同一if语句中定义..

if (isset($_POST['product']) && $products[$_POST['product']] == $_POST['product']) {
    do everything;
}
else {
    echo "This item is not available";
}

答案 8 :(得分:0)

如果未设置值,则可以使用??设置默认值。

$_POST['product'] ?? "No product";