Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php MySQL在两列上搜索_Php_Mysql - Fatal编程技术网

php MySQL在两列上搜索

php MySQL在两列上搜索,php,mysql,Php,Mysql,我正在尝试使用php和MySQL执行搜索功能。我需要从两个不同的栏中搜索,一个是歌曲标题栏,另一个是艺术家栏,用户可以使用: 1. artist name. 2. song title. 3. both of them (without order) 4. there will be special characters for ex: ' (apostrophe) 这就是我所做的,但我需要一个更有效的方法来做到这一点。我还想过使用类似的文本()在php中。谁能给我一个更好的建议吗。多谢各位

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

1. artist name.
2. song title.
3. both of them (without order)
4. there will be special characters for ex: ' (apostrophe)
这就是我所做的,但我需要一个更有效的方法来做到这一点。我还想过使用
类似的文本()在php中。谁能给我一个更好的建议吗。多谢各位

表:
歌曲

|artist   |    title   |
|----------------------|
|eminem   | not afraid |
|kida     | o'najr     |
我的代码:

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

如果不想引起混淆,可以简单地使用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%'";
  • 在这种情况下,您应该使用SQL
    语句,而不是
    CONCAT
    语句

  • 在搜索之前和之后加上一个空格,这应该会给你预期的结果! (我的意思是,如果你搜索'raid',你不会找到'Eminem-not fear',如果你想找到它,你必须搜索'fear',例如;如果你想按启示排序结果,你必须创建索引并使用它们,或者使用Levenshtein方法或其他方法……)

  • 在sql语句中使用数据之前,不要忘记转义数据

  • 顺便说一句,如果您想使其不区分大小写,您必须使用
    blabla-COLLATE UTF8\u-GENERAL\u-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.' %';
    

    有什么不起作用的吗?你有没有遇到意想不到的错误?这看起来非常不安全。您确定您的用户参数正确吗
    $\u POST
    数据从不直接进入查询。如果不以某种形式逃跑,这是行不通的。它是行不通的,但你知道。。。这不是个好办法。同样适用于ex。它不应与字符串的一部分一起工作。例如,如果你搜索:raid,它会显示Eminem——结果是无所畏惧。这不应该发生。它显示了阿姆,因为你可能是印刷艺术家。尝试打印标题@雷申-为什么它不应该显示这一点?如果不想搜索歌曲标题,请删除该部分查询。信息技术这是密码,不是魔法。