基于表中数组的PHP Oracle查询数据

基于表中数组的PHP Oracle查询数据,php,oracle,Php,Oracle,我有一个oracle sql语句 表数据如下所示: FORM_NO | PART_NO | CHUTTER_ID 1 | ABC | 1,3,9,12,15 "SELECT * FROM tb_test WHERE ',' || CHUTTER_ID || ',' LIKE '%,$get_q,%'" $q = oci_parse($c1, "SELECT * FROM tb_test WHERE ',' || CHUTTER_

我有一个oracle sql语句

表数据如下所示:

FORM_NO | PART_NO | CHUTTER_ID
1       | ABC     | 1,3,9,12,15
"SELECT * FROM tb_test WHERE ',' || CHUTTER_ID || ',' LIKE '%,$get_q,%'"
$q = oci_parse($c1, "SELECT * FROM tb_test 
                     WHERE ',' || CHUTTER_ID || ',' LIKE '%,' || :p1 || ',%'");
oci_bind_by_name($stid, ':p1', $get_q);
oci_execute($q);
我有一个PHP变量

$get_q = "3";
现在我想问:

$q = oci_parse($c1, "SELECT * FROM tb_test WHERE CHUTTER_ID IN '$get_q'");
oci_execute($q);
查询结果为空


有人知道如何解决这个问题吗?

您可以这样编写测试:

FORM_NO | PART_NO | CHUTTER_ID
1       | ABC     | 1,3,9,12,15
"SELECT * FROM tb_test WHERE ',' || CHUTTER_ID || ',' LIKE '%,$get_q,%'"
$q = oci_parse($c1, "SELECT * FROM tb_test 
                     WHERE ',' || CHUTTER_ID || ',' LIKE '%,' || :p1 || ',%'");
oci_bind_by_name($stid, ':p1', $get_q);
oci_execute($q);
这会在CUTTER_ID的值后面添加逗号,使其类似于:

,1,3,9,12,15,
然后检查上述内容是否与此模式匹配:

%,3,%
其中,
%
表示0到任意数量的字符。需要额外的逗号来确保使用此方法也能找到1和15

关于您最初的查询 您的查询无效,因为运算符中的
要求正确的参数必须是带括号的列表,如不带引号的
(3)
。但即使你这样做,你也会得到这样的表达:

CUTTER_ID IN (3)
这就像说:

'1,3,9,12,15' IN (3)
但这毫无意义。您可能希望测试相反的结果:

3 in (1,3,9,12,15)
但是遗憾的是,数据库字段
CUTTER\u ID
不适合这种构造。幸运的是,像
这样的
替代方案可以工作

SQL注入 请注意,如果示例中的值“3”是从用户输入派生的,则代码容易受到攻击。要避免这种情况,请通过
oci\u bind\u by\u name
绑定值,如下所示:

FORM_NO | PART_NO | CHUTTER_ID
1       | ABC     | 1,3,9,12,15
"SELECT * FROM tb_test WHERE ',' || CHUTTER_ID || ',' LIKE '%,$get_q,%'"
$q = oci_parse($c1, "SELECT * FROM tb_test 
                     WHERE ',' || CHUTTER_ID || ',' LIKE '%,' || :p1 || ',%'");
oci_bind_by_name($stid, ':p1', $get_q);
oci_execute($q);
数据库设计 最后,一个数据库字段中的值列表不是良好数据库模型的标志。这是一个未标准化的数据库示例。它甚至不符合标准

如果您对数据库设计有控制权,请考虑在上面链接的文章中更改它。它将提高您的查询速度