【问题标题】:Splitting a string to put into a CodeIgniter Active Record SQL query拆分字符串以放入 CodeIgniter Active Record SQL 查询
【发布时间】:2013-07-01 18:21:26
【问题描述】:

我正在尝试进行搜索查询以查看文本区域是否包含一些关键字。尽管将我的 textarea 值插入到查询中,但我遇到了一些麻烦。

这是我的查询:

$match = $this->input->post('wStory');
$this->db->where("`terms` LIKE '%$match%'");
$query = $this->db->get('filter_tbl');
return $query->num_rows();

$match 是我的文本字段,我一直在尝试做的是拆分里面的单词,然后遍历每个单词。我尝试过使用 PHP 的 explode() 函数,该函数可以工作,但在这种情况下它不起作用,因为它将字符串转换为数组。

有什么方法可以将我的 textarea 中的字符串拆分为单词并遍历 like 语句中的单词,或者我只是缺少什么?

【问题讨论】:

  • 每个条目是否只包含一个单词?
  • 也许不是使用 sql-where 函数,全文搜索可能更有用
  • @Trent 不,它有多个。我有一个全文,如果你在匹配的地方放一两个词就可以了。
  • @Martijn 我正在搜索的列上有全文
  • 你不能只使用 preg_match_all() 吗?检查stackoverflow.com/questions/10684183/…。然后做一个 implode(",",$textareaArea)...?

标签: php mysql string codeigniter activerecord


【解决方案1】:

您当前正在运行的查询正在检查特定短语,而不是检查任何指定单词。

您需要执行以下操作:

$match = $this->input->post('wStory');

// break search phrase into keywords
$keywords = explode(' ', $match);

// Build query
foreach ($keywords as $keyword)
{
    $keyword = trim($keyword);
    $this->db->or_where("`terms` LIKE '%$keyword%'");
}
$query = $this->db->get('filter_tbl');
return $query->num_rows();

explode(' ', $match) 不考虑任何可能分隔单词的标点符号。

【讨论】:

  • 是否有任何理由会在每个单词周围添加额外的空格?出于某种原因,它似乎在每个单词周围添加了多余的空格。
  • 除非查询中的所有单词都是关键字,否则这似乎不起作用。如果碰巧不等于关键字,则返回 0
  • 我已经编辑了我的答案来解决这两个问题。我不确定会有多余的空格,但trim() 应该可以解决这个问题。
  • 现在使用->or_where(),而不是使用->where(),因此并非所有搜索词都需要返回项目。您需要实施某种排名系统,以便包含更多关键字的项目将显示在结果的顶部。
【解决方案2】:

没有$this->db->like("terms", $match);方法吗?

http://ellislab.com/codeigniter/user-guide/database/active_record.html#like

【讨论】:

  • 是的,我在尝试不同的东西,最初我的位置更复杂。我只是还没有更改它,以防我添加更多字段。
  • 是的,但这不是我的问题。我在搜索的文本字段超过一两个单词并将它们拆分时遇到问题。
【解决方案3】:

我认为全文搜索是要走的路。 Rob W 发布的网址也给出了这个:

$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);

你关心的是什么

$this->db->where('MATCH (terms) AGAINST ("$match")', NULL, FALSE);

编辑:进一步阅读后,这可能会更好(或至少可读性更好):

$this->db->where('MATCH (terms) AGAINST ("$match")');

【讨论】:

  • 不过,我的查询并没有真正的问题,我尝试输入查询的数据有问题。
  • 不知道大家是否熟悉fulltextsearch,但是如果正确准备字符串$match,应该不会很困难吧? $matches4query = $match." > ".str_replace(" ", ", ", $match);小例子:)
  • 我在我网站上的其他地方使用全文搜索,所以我已经使用它们一段时间了。那些尽管用户发布了两个词之一。这个虽然我试图在整个文本区域中搜索几个关键词,但不能只将整个文本区域放在查询中。这就是我的问题所在。感谢您的帮助!我真的不明白为什么要放置 str_replace ......这似乎会使搜索变得混乱。
【解决方案4】:

试试这个:

$match = $this->input->post('wStory');

//Getting words from textarea and put them into array
$wordsArray = explode(' ',$match);

if (!empty($wordsArray)) {
    //use where_in() instead of where()
    $this->db->where_in("`terms`", $wordsArray);

    $query = $this->db->get('filter_tbl');
    return $query->num_rows();
}

【讨论】:

  • 我收到 500 错误。 $wordsArray 应该是 $n_words 吗?
  • @zazvorniki - 不,那么 $wordsArray 的输出是什么? ($n_words 仅用于获取 preg 的返回值)
  • @zazvorniki - 抱歉。再试一次。也许你现在得到了你想要的。
  • $wordsArray 没有返回任何内容。这似乎导致了 500。这就是我问的原因,因为您似乎没有为该值设置任何内容。
  • @zazvorniki - 当您尝试时,您的文本区域中有哪些单词? ($match 的值是多少)
猜你喜欢
  • 2012-04-17
  • 2013-02-22
  • 2014-03-05
  • 2016-03-15
  • 2013-01-09
  • 1970-01-01
  • 2014-12-17
  • 2011-09-08
  • 2019-01-08
相关资源
最近更新 更多