我有一个MySQL表(比如它叫unicode
,其中包含我要搜索的多个字段。
用户在表单的搜索字段中输入搜索字符串,在提交表单时,我使用字段构建SQL语句。
例如,假设我搜索的字段为name
和select name, unicode, description, id
from cheese
where 1 = 1
and (unicode like '%blue%'
or unicode like '%cheese%'
or name like '%blue%'
or name like '%cheese%');
。
如果用户输入“蓝纹奶酪”,我想构建一个如下所示的SQL语句:
// get the search string and do something with it:
$str = $_POST['str'];
$keywords = preg_split('/[\s]+/', $str);
$totalKeywords = count($keywords);
// build up the sql strings for unicode and name
// unicode
for($i=0 ; $i < $totalKeywords; $i++){
$search_bit_unicode = ":search_unicode" . $i;
if ($i == 0) {
$sql_str_unicode .= " unicode LIKE $search_bit_unicode ";
} else {
$sql_str_unicode .= " OR unicode LIKE $search_bit_unicode ";
}
}
// name
for($i=0 ; $i < $totalKeywords; $i++){
$search_bit_name = ":search_name" . $i;
$sql_str_name .= " OR name LIKE $search_bit_name ";
}
// ..... and then build in the bindParams for when the PDO code runs
// unicode
if (!empty($sql_str_unicode)) {
$keywords_unicode = preg_split('/[\s]+/', $str);
$totalKeywords_unicode = count($keywords_unicode);
for ($x = 0; $x<$totalKeywords_unicode; $x++) {
$keywords_unicode[$x] = "%" . $keywords_unicode[$x] . "%";
$keywords_unicode[$x] = preg_replace('/@{2,}/','-',$keywords_unicode[$x]);
$stmt2a->bindParam(':search_unicode' . $x, $keywords_unicode[$x]);
}
}
// name
if (!empty($sql_str_name)) {
$keywords_name = preg_split('/[\s]+/', $str);
$totalKeywords_name = count($keywords_name);
for ($y = 0; $y<$totalKeywords_name; $y++) {
$keywords_name[$y] = "%" . $keywords_name[$y] . "%";
$keywords_name[$y] = preg_replace('/@{2,}/','-',$keywords_name[$y] );
$stmt2a->bindParam(':search_name' . $y, $keywords_name[$y]);
}
}
为熟悉的逻辑以及聪明人在阅读我的基本要求时会看到的所有其他垃圾事件道歉。
这是代码的基本运行:
$stmt2a
我遇到的问题是,由于种种原因,我必须在页面上的4个不同部分运行上述2个块。
每次我必须复制我正在搜索的每个字段的大块代码。
我想知道是否可以创建一个函数?最后两个代码块非常相似 - 它只是末尾的后缀不同:
e.g。
每次使用代码块时另一个不同的是.id
位,因为bindParams正在不同的SQL块中使用。
我可能是“在棍子上要月亮”,因为我知道我的代码非常冗长而且写得不够聪明,我可以看到有很大的改进空间。
在这种情况下,我可以看到有一个用于构建这些动态PDO bindParam行的函数,但我不知道从哪里开始。感谢