防止将重复的ID添加到会话(数组)

时间:2016-08-18 12:05:38

标签: php mysql arrays

我有一个会给数组添加id的会话,问题是即使id已经存在,每个id都会被添加。如何防止将重复的ID添加到数组中?

我想我需要使用in_array检查id,但我不确切知道如何正确使用它。

我使用以下链接将产品的ID发送到我的报价页面:

<p><a class="offertelink" href="offerte.php?product='.$productcr[0]['id'].'">Request a quote</a></p>

然后在该页面上我使用以下代码:

if(!isset($_SESSION['product'])){
    $_SESSION['product'] = array();
}

// CHECK FIRST THAT $_GET['product'] IS SET BEFORE ADDING IT TO SESSION
if( isset($_GET['product'])){
    $_SESSION['product'][] = $_GET['product'];
}
$prods  = implode(",", $_SESSION['product']);

最后使用数组中的ID加载所有产品:

if(count($_SESSION['product'])  != 0){
//  offerte overzicht
$offerte            = "SELECT * FROM `snm_content` WHERE `id` in (".$conn->real_escape_string($prods).")  AND state = 1";
$offertecon         = $conn->query($offerte);
$offertecr          = array();
while ($offertecr[] = $offertecon->fetch_array());
}

但是现在每次我重新加载页面时,id都会再次添加,因为产品只加载了一次,所以并不是很糟糕,但我仍然想解决这个问题,因为我认为检查大量重复ID的查询是不是最好的方式。

2 个答案:

答案 0 :(得分:2)

使用in_array很简单 - 您只需检查element is in array

var_dump(in_array($element, $array));

在你的情况下是:

var_dump(in_array($_GET['product'], $_SESSION['product']));

支票是:

// i advise you to check product value as `int`.  
// Because values as `empty string` or `0` or `false` are considered set
if( 0 < intval($_GET['product']) && !in_array($_GET['product'], $_SESSION['product']) ) {
    $_SESSION['product'][] = $_GET['product'];
}

但更聪明的解决方案是将产品ID用作具有固定值的数组键(例如1true):

$_SESSION['product'] = [
    '101' => 1,
    '102' => 1,
    '106' => 1,
];

在这种情况下,您甚至不需要检查您的密钥是否存在 - 如果存在,它将被覆盖,如果不存在 - 将被添加:

if( 0 < intval($_GET['product']) ) {
    $_SESSION['product'][ $_GET['product'] ] = 1;
}
// but here you need to take array keys instead of values
$prods  = implode(",", array_keys($_SESSION['product']));

答案 1 :(得分:1)

选项1 使用in_array()来防止重复:

// CHECK FIRST THAT $_GET['product'] IS SET BEFORE ADDING IT TO SESSION
if( isset($_GET['product'])){
    if(!in_array($_GET['product'], $_SESSION['product']){
        // product not exists in array
        $_SESSION['product'][] = $_GET['product'];
    }
}

选项2 添加产品前的空数组

//if(!isset($_SESSION['product'])){
    $_SESSION['product'] = array();
//}