1

私は preg_split を使用していくつかの結果を見つけていますが、(奇妙なことに) 最初の単語を除いてうまく機能します。

たとえば、「phone blue」というアイテムがあり、「phone random」を検索しても何も得られませんが、「random phone」(または「something ph」、「something phone random」など)を検索すると、 「電話青」を見つけます。

さまざまな表現を探して試してみました (例: @[\W]+@ 、 /[\s,]+/ など)。しかし、何も役に立ちません。アイテムを (完全な文字列で) 見つけようとする最初の試みが物事を台無しにしていると推測することしかできませんが、その方法はわかりません。これはかなり新しいです!助けてくれてありがとう

編集:「電話」を検索するだけでは機能しないことに注意するのを忘れていました。

function find_by_location_or_name($where) {

    // first try complete
    $this->db->where('items_location', $where);
    $this->db->or_like('items_name', $where);
    $query = $this->db->from('items_table')->get();

    // if nothing, break it up, try again
    if( !$query->num_rows) {
        $where_like = preg_split('/ /',  $where);

        $tryagain = false;

        foreach($where_like as $like) {
            if(! $tryagain) {
                $this->db->like('items_location', $like);
            } else {
                $this->db->or_like('items_name', $like);
            }
            $tryagain = true;
        }

        // Do the query
        $query = $this->db->from('items_table')->get();
}

更新: みんなの助けに感謝します! 最後に、これはうまくいきました:

// first try complete
$this->db->where('items_location', $where);
$this->db->or_where('items_name', $where);
$query = $this->db->from('items_table')->get();

// if nothing, break it up, try again
if( !$query->num_rows) {
    $where_like = preg_split('/ /',  $where);

    $tryagain = false;

    foreach($where_like as $like) {
        if(! $tryagain) {
            $this->db->like('items_location', $like);
            $this->db->or_like('items_name', $like);
        } else {
            $this->db->like('items_name', $like);
        }
        $tryagain = true;
    }
4

1 に答える 1

0

私はあなたのコードを見ました。preg_split の代わりに全文索引を作成し、文字列全体を MySQL に渡す必要があります。MySQL に見つけてもらいましょう。それはまさにあなたが必要とするものです。

見てください: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

このリンクは例でより明確です: http://www.bakale.com/mysql/myfultext.htm

于 2013-11-07T12:02:19.733 に答える