【问题标题】:php MySQL Search on two columnsphp MySQL搜索两列
【发布时间】:2014-09-23 18:29:36
【问题描述】:

我正在尝试使用 php 和 MySQL 执行搜索功能。我需要从两个不同的列中搜索,一列用于歌曲标题,另一列用于艺术家,用户可以使用以下方式进行搜索:

1. artist name.
2. song title.
3. both of them (without order)
4. there will be special characters for ex: ' (apostrophe)

这就是我所做的,但我需要一种更有效的方法来做到这一点。我也想过在 php 中使用similar_text();。谁能建议我一个更好的方法来做到这一点。谢谢你

表:songs

|artist   |    title   |
|----------------------|
|eminem   | not afraid |
|kida     | o'najr     |

我的代码:

$search_value = $_POST["search_value"];
$query = "select * from `songs` where concat(`title`, `artist`) like '%$search_value%'";

【问题讨论】:

  • 有什么东西不能用吗?您是否遇到任何您没有预料到的错误?
  • 这看起来非常不安全。你确定你的用户参数是properly escaped吗? $_POST 数据 NEVER 直接进入查询。如果不以某种形式转义,这是行不通的。
  • 它有效,但你知道......这不是一个很好的解决方案。也为前。它不应该与字符串的一部分一起使用。例如。如果你搜索:raid 它会显示 Eminem - Not Afraid 结果。这不应该发生。
  • 它显示 eminem 因为你可能是印刷艺术家。尝试打印标题!
  • @rexhin - 为什么不应该显示?如果您不想搜索歌曲标题,请删除该部分查询。它是代码,不是魔法。

标签: php mysql


【解决方案1】:
  1. 在这种情况下,您应该使用 SQL OR 语句,而不是 CONCAT 语句。

  2. 结合搜索前后的空格,这应该会给你预期的结果! (我的意思是,如果您搜索“raid”,您将找不到“Eminem - Not Afraid”,如果您想找到它,您必须搜索“afraid”,例如;如果您想按 revelance 对结果进行排序,您将必须创建索引并使用它们,或者使用 Levenshtein 方法或其他方法......)

  3. 在 sql 语句中使用数据之前不要忘记对其进行转义。

顺便说一句,如果你想让它不区分大小写,你将不得不使用blabla COLLATE UTF8_GENERAL_CI LIKE %what you search% blabla

// if you are using mysql_connect()
$search_value = ' '.mysql_real_escape_string($_POST["search_value"]).' ';
$query = "select * from `songs` where `title` like '%$search_value%' or  `artist` like '%$search_value%'";

// if you are using PDO
$args[':search_value'] = '% '.$_POST["search_value"].' %';

$query = "SELECT * FROM `songs` WHERE `title` LIKE :search_value OR `artist` LIKE :search_value";

$qry = $PDO->prepare($query);
$res = $qry->execute($args);

对于多词搜索,您也可以使用

// for mysql_connect()
$search_value = $_POST["search_value"];
$search_value = explode(' ', $search_value);
foreach($search_value as $k => $v){
    $search_value[$k] = mysql_real_escape_string($v);
}
$search_value = ' '.implode(' % ', $search_value).' ';

// for PDO
$search_value = explode(' ', $_POST["search_value"]);
$search_value = implode(' % ', $search_value);
$args[':search_value'] = '% '.$search_value.' %';

【讨论】:

    【解决方案2】:

    如果你不想混淆,你可以简单地使用sql或语句。

    $search_value = $_POST["search_value"];//check user input first than create a query.
    $query = "select * from `songs` where `title` like '%$search_value%' or  `artist` like '%$search_value%'";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多