0

デフォルトの prestashop db クエリを変更する必要があります。私は次のことを試しました:

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 でクエリを実行できます...

例: ユーザー searchkawasaki racing filterを so に置き換えたいkawasaki%racing%filter場合、クエリは%kawasaki%racing%filter%...

アプローチは正しいようですか?現在は機能しません:(

誰かが私を助けることができますか?前もって感謝します!

4

2 に答える 2

2

うまくいかない理由として最も可能性が高いのは、データベースで を%kawasaki%racing%filter%検索すると、これらすべての単語を含むエントリがこの順序で検索されるためです。

私の推測では、これらの 3 つの単語を含むエントリが文字列のどこかにあることを期待しているのですが、この方法では、クエリに入力された順序と同じ順序で表示される必要があります。

文字列を別々の単語に分割し、それぞれを個別に検索する方がよいでしょう。

例えば

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

これにより、3 つの単語すべてを含むレコードが検索されますが、順序は問いません。3 つすべてではなく、これらの単語のいずれかを検索する場合は、 に置き換えANDますOR

また:

  • 必要に応じて、入力文字列をエスケープすることを忘れないでください。(つまり、SQL インジェクション攻撃を防ぎ、入力に引用符が含まれている場合にクエリが壊れないようにするためなど)

  • 可能であれば、クエリでワイルドカードを使用しないことをお勧めします。特に文字列の先頭。これは、クエリが非常に遅くなる可能性があるためです (DB はすべてのレコードを読み取り、すべてのレコードについて問題のフィールドの内容全体を解析する必要があります。これは、単一のテーブルで実行できる最も遅いクエリです。JOIN同時に s を実行している場合は、さらに悪化します)。

ワイルドカード検索が役立つ場合もありますが、大量のテキスト検索を行う必要がある場合、MySQL (および他の DB。使用している DB システムを指定していません) には代替オプションがあります。

最も簡単なオプションは、キーワードを別のテーブルに保存することです。それらはタグと考えることができます。次に、正確な単語を直接クエリできます。

それ以上のものが必要な場合は、MySQL の「全文検索」機能を調べることができます。これは、遅いワイルドカード検索の直接の代替と見なすことができます。

ただし、それでも遅い場合があるため、本当に高速にしたい場合は、Sphinxをチェックしてください。もう少し手間がかかりますが、正しく行えば、検索が非常に高速になります。

于 2012-08-31T21:28:12.510 に答える
1

Tools::getValue が html-string を返さないことを確認してください。 あなたの場合。Tools:getValue で var_dump を試して、実際の出力を確認してください。

于 2012-08-31T13:15:42.837 に答える