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>

我想选择字段值存在于序列化字段中的数据,所以我想REGEXP在mysql中使用并尝试过

$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  ";

但这不符合我的需要。

我该如何正确地做到这一点?

4

1 回答 1

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
}

你仍然有错误的架构,这是询问数据库的错误方式。您应该重新考虑存储值的方式:序列化数据不打算用于搜索条件。

于 2013-07-17T08:33:37.350 回答