搜索PHP数组中的所有元素

时间:2016-06-15 17:16:23

标签: php mysql

使用下面更新的代码,我的搜索工作正常,但只使用数组中的最后一个字。有没有办法使用用户输入的所有单词搜索MySQL列?

注意:所有输入清理和转义都在我的代码中完成,但未在此处显示。

我有两个PHP数组:$ search_exploded(用户输入的搜索字词)和$ metaphoneArr(MySQL中关键字的元电话)。

我在$ search_exploded和$ metaphoneArr中循环,如果Levenshtein小于2,那么我将metaphone元素添加到名为$ levenResultsArr的第三个数组中。

在MySQL中,我正在加入两个表,如果我的第三个数组($ levenResultsArr)中的结果与我的metaphone_col中的行匹配,那么我希望打印结果。但不知何故,我没有在MySQL语句中正确引用第三个数组。

有什么建议吗?这是我的PHP代码的一部分。

$levenResultsArr = array();
foreach ($search_exploded as $search_each => $searchWord) {
    $search_each2 = metaphone($searchWord);
    echo $search_each2 . "<br/>";

    foreach ($metaphoneArr as $metaword => $val) {
        $lev = levenshtein($search_each2, $val);
        if ($lev < 2) {
            array_push($levenResultsArr, $search_each2);
        }
    }

}

// And shown below is the MySQL statement

$constructs = "
    SELECT vt.idvideolist,
           vt.videotitle,
           vt.videodescription
      FROM videolist_tbl vt
     INNER JOIN keyword__video k2v ON (vt.idvideolist = k2v.video_id)
     INNER JOIN keywords_tbl k ON (k2v.keyword_id = k.idkeywords_tbl)
     WHERE k.metaphone_col = '$search_each2'
";

它只使用数组中的最后一个单词而不是数组中的所有单词进行搜索。

2 个答案:

答案 0 :(得分:0)

没有看到更多的代码,有点难以确定发生了什么。虽然有几个想法。

包含所有搜索字词的数组是什么var?

我注意到你正在将物品推入$levenResultsArr。我不认为它在查询中使用过。

如果是$search_each_2,您可以尝试使用IN语法:

WHERE k.metaphone_col IN '$search_each2';

但这只会匹配确切的值。即:

如果some value数组包含IN,则

value不会返回。该数组必须包含some value

如果您需要它来匹配部分搜索,您可以尝试使用带有通配符的LIKE%

WHERE k.metaphone_col LIKE "%searchTerm1%"
OR k.metaphone_col LIKE "%searchTerm2%"
OR k.metaphone_col LIKE "%searchTerm3%"

您可以使用implode函数从数组创建sql字符串:http://php.net/manual/en/function.implode.php

答案 1 :(得分:0)

您在查询中没有正确引用数组,这是正确的。您只是引用变量'$search_each2'。您想要检查整个阵列。执行此操作的最佳方法是使用implode并使用MySQL IN子句将数组转换为字符串。我们需要先修改数组才能正确格式化:

foreach($levenResultsArr as &$foo){
    $foo = "'".$foo."'"; //add single quotes around each object in the array
}
$levenAsStr = implode(",", $levenResultsArr);

然后只需将最后一行更改为以下内容:

WHERE k.metaphone_col IN (".$levenAsStr.")";

这是因为我不在测试环境中,所以请告诉我是否存在任何语法错误。应该适合你!

相关问题