我有一个元素显示客户最后查看的产品。它将产品ID存储在会话中,并在查询中使用这些ID来获取所有产品。问题是,有3个产品的限制,我可以在查询中添加LIMIT 0,3
,但这并不限制会话中存储的ID数量。
我得到的一个例子:
在产品页面上:
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
在目录页面上:
if($_SESSION['laatstbekeken'] != ''){
$prods = implode(",", $_SESSION['laatstbekeken']);
}
$laatst = "SELECT * FROM `snm_content` WHERE id IN ($prods) and state = 1 ORDER BY hits DESC LIMIT 0,3";
当回显时,查询看起来像这样:
SELECT * FROM `snm_content` WHERE id IN (7,6,5,7,8,5) and state = 1 ORDER BY hits DESC LIMIT 0,3
如何确保会话中始终只有3个ID?
例如,当会话包含3,2,1且客户查看产品4时,会话应包含4,3,2
答案 0 :(得分:1)
如果您只想在$prods
中使用最后三个ID,请使用array_slice()
在此处进行检查http://php.net/manual/en/function.array-slice.php
试试这个
if($_SESSION['laatstbekeken'] != ''){
$prods = implode(",", array_slice($_SESSION['laatstbekeken'],-3));
}
$laatst = "SELECT * FROM `snm_content` WHERE id IN ($prods) and state = 1 ORDER BY hits DESC LIMIT 0,3";
要删除重复的产品ID ,请使用array_unique 这样做
if($_SESSION['laatstbekeken'] != ''){
$result = array_unique($_SESSION['laatstbekeken']);
$prods = implode(",", array_slice($result,-3));
}
$laatst = "SELECT * FROM `snm_content` WHERE id IN ($prods) and state = 1 ORDER BY hits DESC LIMIT 0,3";
<强> EDIT2: - 强>
if($_SESSION['laatstbekeken'] != ''){
$result = array_unique(array_reverse($_SESSION['laatstbekeken']));
$result=array_reverse($result);
$prods = implode(",", array_slice($result,-3));
}
答案 1 :(得分:0)
一个函数,如果元素尚不存在,则向该元素添加元素。
我们假设如下:
$mArray
是您的$_SESSION['laatstbekeken']
$currentProduct
是您的$productcr[0]['id']
并且$mArray(1,2,3)
内已有3个产品ID。您正在查看的当前产品为4
,因此必须将其添加到array
。
$mArray = [3,2,1];
$currentProduct = 4;
echo "<pre>Before : <br/>";
print_r($mArray);
echo "<br/>After : <br/>";
$mArray = addProductToArray($currentProduct, $mArray);
print_r($mArray);
function addProductToArray($mCurrentProduct, $mArray){
if(sizeof($mArray) < 3){
if(!in_array($mCurrentProduct, $mArray)){
$mArray[] = $mCurrentProduct;
}
}
else{
if(!in_array($mCurrentProduct, $mArray)){
array_pop($mArray);
array_unshift($mArray, $mCurrentProduct);
}
}
return $mArray;
}
输出:
Before :
Array
(
[0] => 3
[1] => 2
[2] => 1
)
After :
Array
(
[0] => 4
[1] => 3
[2] => 2
)
答案 2 :(得分:0)
更改您的代码如下:
在产品页面上:
if(count($_SESSION['laatstbekeken']) < 3 )
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
else{
array_pop($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
}
print_r($_SESSION['laatstbekeken']);
在目录页面上:
if($_SESSION['laatstbekeken'] != '' && count($_SESSION['laatstbekeken']) == 3 ){
echo $prods = implode(",", $_SESSION['laatstbekeken']);
}
答案 3 :(得分:0)
插入新产品后,像这样切片数组:
$_SESSION['laatstbekeken'] = array_slice($_SESSION['laatstbekeken'], -3, 3);
此示例有助于查看结果:
<?php
$_SESSION['laatstbekeken'][] = 12;
$_SESSION['laatstbekeken'][] = 13;
$_SESSION['laatstbekeken'][] = 14;
var_dump($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'][] = 15;
$_SESSION['laatstbekeken'][] = 16;
var_dump($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'] = array_slice($_SESSION['laatstbekeken'], -3, 3);
var_dump($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'][] = 17;
$_SESSION['laatstbekeken'][] = 18;
$_SESSION['laatstbekeken'] = array_slice($_SESSION['laatstbekeken'], -3, 3);
var_dump($_SESSION['laatstbekeken']);
输出将是:
/sess.php:7:
array(3) {
[0] =>
int(12)
[1] =>
int(13)
[2] =>
int(14)
}
/sess.php:12:
array(5) {
[0] =>
int(12)
[1] =>
int(13)
[2] =>
int(14)
[3] =>
int(15)
[4] =>
int(16)
}
/sess.php:16:
array(3) {
[0] =>
int(14)
[1] =>
int(15)
[2] =>
int(16)
}
/sess.php:23:
array(3) {
[0] =>
int(16)
[1] =>
int(17)
[2] =>
int(18)
}