2010-02-10 63 views
0

以下可能吗?在DB检查SQL变量是否包含PHP变量

字段包含:1,2,3,4

$a=1; 

$selqry="select * from table where field={contains $a}"; 

感谢, B.

+0

问题是“仅”标记为[sql]。你真的想保持它与数据库系统无关吗? – VolkerK 2010-02-10 17:41:56

回答

0

当然,这是可能的。

  1. 如果您不介意"1"匹配"2,3,11,4"。您可以使用INSTRLIKE来完成。例如:

    SELECT * 
    FROM tbl 
    WHERE INSTR(field, '1') != 0 
    
  2. 如果你不想"1"匹配"2,3,11,4",你必须使用一个(慢)的正则表达式,如果你的DBMS支持它(MySQL的,例如,做):

    SELECT * 
    FROM tbl 
    WHERE field REGEXP '[[:<:]]1[[:>:]]' 
    

但是,更好的问题是这是否是一个好主意。对此的回答是响亮的。您不应将多个值存储在单个字段中。像这样的案例真的会从normalization中受益。

+0

不等于0(!= 0 ) - 为什么需要? 该字段将只包含从1到8的数字 谢谢。 – Bift 2010-02-10 17:27:50

+0

这不是真的需要,因为0在SQL中与“false”同义。它只是强调了“INSTR()”返回一个字符串位置而不是一个包含/不包含布尔值的事实。 – 2010-02-10 17:37:45

0

我不是100%肯定你问什么,但为什么不只是做一个LIKE,应该在数字领域工作了:

SELECT * FROM foo WHERE id like '%1%'; 

这将匹配001100101010

1

MySQL的FIND_IN_SET(str,strlist) function可以帮助你在那里(编辑:哎呀....如果你使用MySQL)

返回范围1到N,如果一个值字符串str位于由N个子字符串组成的字符串列表strlist中。字符串列表是由由“,”字符分隔的子字符串组成的字符串。
SELECT 
    x,y,z 
FROM 
    tablename 
WHERE 
    FIND_IN_SET(':id', field) 

(如果你不使用pdo/prepared statements,替换:ID由$ a的值,但要确保它的编码/正确转义)

这不是完美的指数型虽然...你”最终将在WHERE子句中完成具有此功能的全表扫描。

0

如果字段只从1-8包含数字,你可以做到这一点简单的

$selqry="select * from table where field like '%" . intval($a) . "%'"; 

你“应该”大概移动领域到另一个表和使用查询加入基于ID的表。

相关问题