2013-07-17 43 views
0

請讓我有一個表,其中有兩個字段IDValue。現場Value包含序列化數組使用PHP:匹配字段中的序列化值

------------------------------------------------------------------------ 
ID |      Value          | 
------------------------------------------------------------------------ 
1 | a:2:{s:1:"0";s:12:"dHJhbnNwb3J0";s:1:"2";s:16:"Y2VudHJlIHZpbGxl";}| 
------------------------------------------------------------------------ 
2 | a:1:{s:1:"0";s:16:"Y2VudHJlIHZpbGxl";}       | 
------------------------------------------------------------------------ 
3 | a:2:{s:1:"0";s:12:"Y29tbWVyY2U=";s:1:"2";s:12:"dHJhbnNwb3J0";} | 
------------------------------------------------------------------------ 

在我的形式,我有一個字段也命名Value使用複選框,用戶可以選擇多個選項,並且數據將在一個名爲陣列發送value[]

<form> 
    <input type="checkbox" name="value[]" value="dHJhbnNwb3J0" /> Value One 
    <input type="checkbox" name="value[]" value="Y2VudHJlIHZpbGxl" /> Value Two 
    <input type="checkbox" name="value[]" value="Y29tbWVyY2U" /> Value Three 
    <input type="submit" name="submit" value="Look for" /> 
</form> 

我想選擇其中的字段值的序列化領域存在的數據,所以我認爲在MySQL中使用REGEXP,我已經試過

$clause = ''; 
for($i = 0 ; $i < $c; ++$i) 
    $clause .= " OR Value REGEXP '{$_POST['value'][$i]}'; 

// This is the query used : 
$q = " SELECT * FROM TABLE WHERE value = '{$_POST['value'][0]}' $clause "; 

但這不符合我的需要。

我該如何正確操作?

+2

只使用'Value LIKE'%{$ _ POST ['value'] [$ i]}%'' – 2013-07-17 08:19:33

+1

如果你沒有*結構化數據存儲在那裏,你爲什麼要使用MySQL?現在你不能做你想做的事情,你認爲你的方法是不正確的。 XY問題,請查看。 –

+0

@Akam,謝謝我將只使用LIKE,它似乎完美無缺! – Alpha

回答

0

那麼你可以嘗試這樣的:

if (!empty($_POST['value']) && is_array($_POST['value'])) { 
    $re = '"(' . implode('|', array_map('preg_quote', $_POST['value'])) . ')"'; 
    $q = "SELECT * FROM TABLE WHERE value REGEXP '$re'"; 
    // execute query, proceed results 
} 

你仍然有錯誤的體系結構,這是一種錯誤的方式來問你的數據庫。您應該重新考慮您存儲值的方式:序列化數據並不意味着用於搜索條件。