0

我需要修改默认的 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用 % 替换变量中的空格,这样我就可以使用完整的通配符对 db 进行查询...

示例:用户搜索kawasaki racing filter,我希望将其替换为kawasaki%racing%filterso,查询将是%kawasaki%racing%filter%...

该方法似乎正确吗?它现在不起作用:(

有人能帮我吗?提前致谢!

4

2 回答 2

2

它对您不起作用的最可能原因是,如果您在数据库中%kawasaki%racing%filter%搜索 ,它将按顺序搜索包含所有这些单词的条目。

我的预感是您希望它在字符串中的任何位置找到包含这三个单词的条目,但是您这样做的方式意味着它们必须以与它们在查询中输入的顺序相同的顺序出现。

您最好将字符串拆分为单独的单词,并独立搜索每个单词。

例如

... WHERE field LIKE '%kawasaki%'
      AND field LIKE '%racing%'
      AND field LIKE '%filter%'

这将搜索包含所有三个单词的记录,但顺序不限。如果您想查找其中任何一个单词,而不是全部三个单词,请替换ANDOR

还:

  • 如有必要,不要忘记转义输入字符串。(即防止SQL注入攻击,如果输入包含引号字符等,防止查询中断)

  • 如果可能,我建议避免在查询中使用通配符。特别是在字符串的开头。这是因为它们会使查询变得非常慢(数据库必须读取每条记录,并为每条记录解析相关字段的全部内容:这是您可以在单个表上执行的最慢查询,如果您'同时在做JOIN,情况会更糟)。

在某些情况下,通配符搜索很有用,但如果您需要进行大量文本搜索,MySQL(和其他数据库;您没有指定您使用的数据库系统)确实有替代选项。

最简单的选择是将关键字存储在单独的表格中。您可以将它们视为标签。然后您可以直接查询确切的单词。

如果您需要更多,您可以查看 MySQL 的“全文搜索”功能,它可以直接替代慢速通配符搜索。

但即使这样有时也会很慢,所以如果你真的想要快,请查看Sphinx。这需要做更多的工作,但如果做对了,它会让您的搜索速度快如闪电。

于 2012-08-31T21:28:12.510 回答
1

确保您的 Tools::getValue 不返回 html 字符串,例如。 在你的情况下。试试 var_dumpin 你的 Tools:getValue 看看真正的输出是什么。

于 2012-08-31T13:15:42.837 回答