我需要修改默认的 prestashop 数据库查询。我尝试过以下方法:
public function ajaxProcessCheckProductName()
{
if ($this->tabAccess['view'] === '1')
{
$search = Tools::getValue('q'); /* in this variable, i wish subsitute the space with % */
$searchmod = str_replace(" ", "%", $search);
$id_lang = Tools::getValue('id_lang');
$limit = Tools::getValue('limit');
$result = Db::getInstance()->executeS('
SELECT DISTINCT pl.`name`, p.`id_product`, pl.`id_shop`
FROM `'._DB_PREFIX_.'product` p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int)$id_lang.')
WHERE pl.`name` LIKE "%'.pSQL($searchmod).'%"
GROUP BY pl.`id_product`
LIMIT '.(int)$limit);
die(Tools::jsonEncode($result));
}
}
我希望用%替换变量中的空格,例如
kawasaki racing filter
,这样我就可以使用完整的通配符对数据库进行查询...
示例:用户搜索
kawasaki racing filter
,我希望将其替换为kawasaki%racing%filter
,因此查询将是%kawasaki%racing%filter%
...
这个方法看起来正确吗?现在不起作用:(
有人可以帮助我吗?预先感谢!
它对您不起作用的最可能原因是,如果您在数据库中搜索
%kawasaki%racing%filter%
,它将按顺序搜索包含所有这些单词的条目。
我的预感是,您希望它在字符串中的任何位置找到包含这三个单词的条目,但您执行此操作的方式意味着它们必须以与在查询中输入的顺序相同的顺序出现。
您最好将字符串拆分为单独的单词,并独立搜索每个单词。
例如
... WHERE field LIKE '%kawasaki%'
AND field LIKE '%racing%'
AND field LIKE '%filter%'
这将搜索包含所有三个单词的记录,但顺序不限。如果您想查找这些单词中的任何一个而不是全部三个,请将
AND
替换为 OR
。
还有:
如有必要,不要忘记转义输入字符串。 (即防止 SQL 注入攻击,并防止输入包含引号字符等导致查询中断)
如果可能,我建议避免在查询中使用通配符。特别是在字符串的开头。这是因为它们会使查询变得非常慢(数据库必须读取每条记录,并解析每条记录的相关字段的全部内容:这是您可以在单个表上执行的最慢的查询,并且如果您同时做
JOIN
,会更糟)。在某些情况下,通配符搜索很有用,但如果您需要进行大量文本搜索,MySQL(和其他数据库;您没有指定您正在使用哪个数据库系统)确实有替代选项。
最简单的选择是将关键字存储在单独的表中。您可以将它们视为标签。然后就可以直接查询确切的单词了。
如果您需要更多,您可以查看MySQL的“全文搜索”功能,它可以被视为慢速通配符搜索的直接替代。
但即使这样有时也可能很慢,所以如果你真的想要快,请查看Sphinx。这需要更多的工作,但是做得正确的话,它会让你的搜索速度快如闪电。
确保您的 Tools::getValue 不返回 html 字符串,例如。
在你的情况下。尝试在你的 Tools:getValue 中使用 var_dump 看看真正的输出是什么。