如何使用LIKE使MySQL查询更有效

时间:2012-11-08 16:10:46

标签: php mysql

我有一个脚本,我试图匹配我以ajax $ .post请求的形式检索到的droppable data,该请求包含名字,姓氏,描述和等级,并将其与相同的数据库中的数据。这样做我想找到用户并在我的查询中提取它们。我在使用LIKE进行高效查询时遇到问题,并且我不确定要添加哪些其他组件才能使其正确发生

if (isset($_POST['data'])){
    $data = $_POST['data'];
    $query = mysql_query("SELECT * FROM `tempusers`
        WHERE `firstname` LIKE '%" . $data . "%'
            OR `lastname` LIKE '%" . $data . "%'
            OR `description` LIKE '%" . $data . "%'
            OR `grade` LIKE '%" . $data . "%'");

    if (! $query){
        echo'Database error: ' . mysql_error();
    }

    while ($row=mysql_fetch_assoc($query)) {
        $description = $row['description'];
        echo $description;
    }

    exit;
}

问题是我没有返回任何结果而是得到错误

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获得正确的语法and mysql_fetch_assoc()期望参数1为资源,给定布尔值。

我欢迎任何我可以实施的提示,并且非常感谢

4 个答案:

答案 0 :(得分:1)

查询的语法有效,这意味着您的输入数据中某处有单引号,导致查询失败并出现语法错误。

要解决此问题,您可以将$data传递给mysql_real_escape_string(),这将转义任何引号,最重要的是阻止SQL注入。

甚至比转义更好的方法是使用PDOMySQLi的参数化查询。

至于优化,您可以尝试REGEXP而不是多个LIKE。 Example here

答案 1 :(得分:1)

您已经请求帮助优化无效的MySQL查询。

首先,您需要使查询正常工作。通常的做法是将您的查询键入MySQL客户端(如phpmyadmin),看看会发生什么。您可能还会发现使用echo输出构造的查询将帮助您查看SQL语法错误。

其次,表格的查询

  column LIKE '%matchstring%'

根本无法优化。匹配字符串上的前导%表示MySQL服务器必须搜索您提到的列的每一行才能找到匹配项。索引对此没有帮助。如果您可以这样查询

 column LIKE 'matchstring%'

您可以使用索引来优化这些搜索。

第三,您在查询中使用OR。 MySQL优化器并不真正喜欢OR,它会重新扫描每个表。

您可以将此表放入MyISAM访问方法(如果尚未访问)并使用FULLTEXT匹配。试试这个:

  WHERE MATCH (firstname, lastname, description, grade) 
        AGAINST ('matchstring' IN BOOLEAN MODE)

这将执行您想要的搜索。您可以使用全文索引对其进行优化。

最后,正如Marc B指出的那样,你必须修复你的SQL注入问题。小学,从不介意中学,充满了喜欢分级系统的人。要找出危险,请在搜索引擎中查找“小Johnny Droptables”。

答案 2 :(得分:1)

die;之后放置echo'Database error: ' . mysql_error();并运行您的代码以检查数据库错误是什么。

答案 3 :(得分:0)

您没有清理用户输入,这会导致SQL中出现杂散的引号字符(由您的错误消息证明)。简单的修复可以是(在将其放入查询之前转义字符串):

if (isset($_POST['data'])){

    // sanitize user input
    $data = mysql_real_escape_string($_POST['data']);

    $query = mysql_query("SELECT * FROM `tempusers`
        WHERE `firstname` LIKE '%" . $data . "%'
            OR `lastname` LIKE '%" . $data . "%'
            OR `description` LIKE '%" . $data . "%'
            OR `grade` LIKE '%" . $data . "%'");

    if (! $query){
        echo'Database error: ' . mysql_error();
    }

    while ($row=mysql_fetch_assoc($query)) {
        $description = $row['description'];
        echo $description;
    }

    exit;
}

请阅读SQL injection

关于提高效率:索引不适用于使用LIKE查询的字段。

此外,不鼓励您使用mysql_函数,因为它们已被弃用。请改用mysqli