我想搜索一些产品并得到结果。这是我的PHP代码:
function Item_Search($AppID, $Keyword = '', $Wears)
{
// expected $Wears = [1,0,1,0,1] , numbers can be diffrent from 0 to 1
$WearNames = ['red', 'green', 'blue', 'yellow', 'black'];
$FinalWear = [];
foreach ($Wears as $i => $Wear) {
if ($Wear == 1) {
$FinalWear[] = $WearNames[$i];
}
}
$FinalWear = json_encode($FinalWear);
$FinalWear = str_replace(str_split('[]'), '', $FinalWear);
$ItemList = Query("SELECT * FROM items WHERE appid=$AppID
AND name LIKE '%$Keyword%'
AND wear IN ($FinalWear)
");
}这个代码工作得很好,但是有些产品没有任何颜色。在这种情况下,我想说,如果所有的颜色是1(真),然后显示产品也没有颜色。
所以我的问题是,我能不能在$FinalWear中加入wear IN ($FinalWear),这样我就能得到所有的结果了吗?
发布于 2019-11-28 21:42:41
您可以接受$Wear中元素的和,如果它与计数相同,那么所有元素都会被设置。然后,您可以使用它将一个OR条件添加到wear测试中,在设置了$Wear中的所有元素时,在wear中检查一个空字符串:
function Item_Search($AppID, $Keyword = '', $Wears)
{
// expected $Wears = [1,0,1,0,1] , numbers can be different from 0 to 1
$WearNames = ['red', 'green', 'blue', 'yellow', 'black'];
$FinalWear = [];
foreach ($Wears as $i => $Wear) {
if ($Wear == 1) {
$FinalWear[] = $WearNames[$i];
}
}
$FinalWear = "'" . implode("','", $FinalWear) . "'";
$EmptyWear = array_sum($Wears) == count($Wears) ? "OR wear = ''" : '';
$ItemList = Query(<<<EOD
SELECT *
FROM items
WHERE appid=$AppID
AND name LIKE '%$Keyword%'
AND (wear IN ($FinalWear) $EmptyWear)
EOD
);
}(查询输出的) 3v4l.org演示
请注意,如果$AppID和$Keyword来自外部源,则查询容易受到SQL注入的影响,您应该使用准备好的语句来避免这种可能性。看这个问题。
如果wear为空意味着它实际上是NULL,则将生成$EmptyWear的行更改为
$EmptyWear = array_sum($Wears) == count($Wears) ? "OR wear IS NULL" : '';https://stackoverflow.com/questions/59096331
复制相似问题