Php 我在从mysql数据库两侧选择一些数据时遇到问题

Php 我在从mysql数据库两侧选择一些数据时遇到问题,php,mysql,mysqli,Php,Mysql,Mysqli,我有两边分开的值,比如 $ing=1,2,3,4,5,6 数据库有一个包含值的表 IDS 5,2,1,6,2,3,45 // in database 我知道这不是一个好的做法,但我必须这样做才能在一个查询中获得值。我还有一个单独的表,其中ID是单独的,对应于单独的用户,如 user 1 IDS 2 user 3 IDS 65 etc 到目前为止,我正在使用 $conditions[] = "CONCAT(',', `rcring`, ',') REGEX

我有两边分开的值,比如

 $ing=1,2,3,4,5,6
数据库有一个包含值的表

 IDS    5,2,1,6,2,3,45 // in database
我知道这不是一个好的做法,但我必须这样做才能在一个查询中获得值。我还有一个单独的表,其中ID是单独的,对应于单独的用户,如

  user 1    IDS 2 
  user 3    IDS 65 etc 
到目前为止,我正在使用

 $conditions[] = "CONCAT(',', `rcring`, ',') REGEXP ',($ing),'";
它给了我很好的结果,但它给了我$ing存在的值我只想要至少包含所有$ing的表

你能帮我吗?我试过我的工作,但我在任何地方都找不到合适的解决方案。谢谢

      //EDIT
我已经有了数组的条件

   if($ser !=''){
                   $conditions[] = "rc_ser='$ser'";
                }if($fridge == 1){
                    $ing="0|";
                    $ctch2fr='checked';
                    foreach($_SESSION['fridge'] as $item){
                    $ing=$ing.$item."|";}
                   $conditions[] = "CONCAT(',', `rcring`, ',') REGEXP ',($ing),'";
                }
                 if (count($conditions) > 0) {
                $sql= implode(' AND ', $conditions);
                }
这是数组中的一个条件,我在查询中这样调用它

select * ,(select count(rcid) from recipe where ($sql)) as total from recipe where ($sql)
我尝试了下面的答案,但结果总是0 当我打印查询时,它显示如下

 select *,(select count(rcid) from recipe where (CONCAT(',', `rcring`, ',') REGEXP ',(0),') ) as total from recipe where (CONCAT(',', `rcring`, ',') REGEXP ',(0),')

您需要拆分
$ing
,并在where子句中检查其所有部分:

<?php
$ings = explode(',',$ing);
$conditions = array();
foreach($ings as $i) {
    $conditions[] = "CONCAT(',', `rcring`, ',') REGEXP ',(".intval($i)."),'";
}
$where = implode(' AND ', $conditions);
/* Use $where in where clause in your sql query */

您需要拆分
$ing
并在where子句中检查其所有部分:

<?php
$ings = explode(',',$ing);
$conditions = array();
foreach($ings as $i) {
    $conditions[] = "CONCAT(',', `rcring`, ',') REGEXP ',(".intval($i)."),'";
}
$where = implode(' AND ', $conditions);
/* Use $where in where clause in your sql query */

据我所知,只有当
rcring
包含与子字符串完全相同的$ing时,您指定的条件才匹配,例如
rcring=“5,2,1,6,2,3,45”
与您的示例中的
$ing=“1,2,3,4,5,6”
不匹配。要在此处匹配,
rcring
应存储为
“1,2,3,4,5,45”

简单的排序在这里没有帮助,因为
ing=“1,2,5,6”
rcring=“1,2,3,4,5,6,45”

简单方法 使
$conditions[]
包含不同ID上匹配项的合并,例如

<?
foreach (explode(",", $ing) as $key => $val) {
    $conditions[] = "CONCAT(',', `rcring`, ',') REGEXP ',($id),'"
}
?>
现在,这将非常快地工作,并将跳过根本不匹配的行

小心! 始终使用并传递ID作为参数

黑客可能会滥用您的系统,通过传递危险信息而不是ID进行SQL注入,例如:
123”);放弃数据库测试;提交;//
这将把
$ings
变成smth-like

“+1+2+123\”;放弃数据库测试;提交;//“

最后的查询如下所示

SELECT * FROM USERS WHERE MATCh(`rcring`) AGAINST(+1 +2 +123\");DROP DATABASE TEST; COMMIT;//");

正确的方法是始终以这种方式构造查询

据我所知,只有当
rcring
包含与子字符串完全相同的$ing时,您指定的条件才匹配,例如
rcring=“5,2,1,6,2,3,45”
将不匹配您示例中的
$ing=“1,2,3,4,5,6”
。要在此处匹配,
rcring
应存储为
“1,2,3,4,5,45”

简单的排序在这里没有帮助,因为
ing=“1,2,5,6”
rcring=“1,2,3,4,5,6,45”

简单方法 使
$conditions[]
包含不同ID上匹配项的合并,例如

<?
foreach (explode(",", $ing) as $key => $val) {
    $conditions[] = "CONCAT(',', `rcring`, ',') REGEXP ',($id),'"
}
?>
现在,这将非常快地工作,并将跳过根本不匹配的行

小心! 始终使用并传递ID作为参数

黑客可能会滥用您的系统,通过传递危险信息而不是ID进行SQL注入,例如:
123”);放弃数据库测试;提交;//
这将把
$ings
变成smth-like

“+1+2+123\”;放弃数据库测试;提交;//“

最后的查询如下所示

SELECT * FROM USERS WHERE MATCh(`rcring`) AGAINST(+1 +2 +123\");DROP DATABASE TEST; COMMIT;//");

正确的方法是始终以这种方式构造查询

您似乎有一个配方表,其中包含以逗号分隔的成分列表:

5,2,1,6,2,3,45
1,2,3,4,5,6
以及给定成分的列表:

5,2,1,6,2,3,45
1,2,3,4,5,6
你想找到可以用给定成分制作的配方(配方成分是给定成分的子集)。您需要编写构建以下查询的PHP代码:

选择*
从配方
在哪里(
在_集合中查找_('1',rcring)>0和
在_集合中查找_('2',rcring)>0和
在_集合中查找_('3',rcring)>0和
在_集合中查找_('4',rcring)>0和
在_集合中找到_('5',rcring)>0和
在_集合中查找_('6',rcring)>0
)
基于您的尝试(您必须将其转换为准备好的语句)的PHP代码的大致轮廓:


话虽如此,正确的解决方案是规范化数据。以下是结构的概要:

CREATE TABLE recipe(recipeid INT NOT NULL主键,名称VARCHAR(100));
创建表成分(IngreditId INT NOT NULL主键,名称VARCHAR(100));
创建表配方(recipeid INT不为NULL,ingredientid INT不为NULL,主键(recipeid,ingredientid));
插入配方值
(1,“配方1”),
(2,“配方2”),
(3,“配方3”),
(4,“配方4”);
插入到成分值中
(1,“成分1”),
(2,“成分2”),
(3,“成分3”),
(4,“成分4”);
在配方中插入配料值
(1, 1),
(2, 1), (2, 2),
(3, 1), (3, 2), (3, 3),
(4, 1), (4, 2), (4, 3), (4, 4);
查询:

选择*
从配方
我在哪里(
选择recipeid
来自配方和配料
按recipeid分组
具有计数(当ingredientid位于(1、2、3)中时,则为1 END)=计数(*)
)
结果是:

recipeid|名称
----------+----------
1 |配方1
2 |配方2
3 |配方3

您似乎有一个配方表,其中包含以逗号分隔的成分列表:

5,2,1,6,2,3,45
1,2,3,4,5,6
以及给定成分的列表:

5,2,1,6,2,3,45
1,2,3,4,5,6
你想找到可以用给定成分制作的配方(配方成分是给定成分的子集)。您需要编写构建以下查询的PHP代码:

选择*
从配方
在哪里(
在_集合中查找_('1',rcring)>0和
在_集合中查找_('2',rcring)>0和
在_集合中查找_('3',rcring)>0和
在_集合中查找_('4',rcring)>0和
在_集合中找到_('5',rcring)>0和
在_集合中查找_('6',rcring)>0
)
基于您的尝试(您必须将其转换为准备好的语句)的PHP代码的大致轮廓:


话虽如此,正确的解决方案是规范化数据。以下是结构的概要:

CREATE TABLE recipe(recipeid INT NOT NULL主键,名称VARCHAR(100));
以红色创建表