2010-02-10 166 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的表。