-1

我有一个脚本,我试图匹配我以 ajax $.post 请求的形式检索到的可删除数据,该请求包含名字、姓氏、描述和等级,并将其与数据库中相同数据的数据相匹配。在这样做时,我想找到用户并在我的查询中获取它们。我在使用高效查询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 服务器版本相对应的手册以获取正确的语法andmysql_fetch_assoc() 期望参数 1 是资源,给定的布尔值。

我欢迎任何我可以实施的技巧,并将不胜感激

4

4 回答 4

1

查询的语法是有效的,这意味着您在输入数据的某处有一个单引号,导致查询因语法错误而失败。

为了解决这个问题,您可以$data通过mysql_real_escape_string()which 将转义任何引号,最重要的是防止 SQL 注入。

比转义更好的是使用带有PDOMySQLi的参数化查询。

至于优化,您可以尝试REGEXP而不是多个 LIKE。这里的例子

于 2012-11-08T16:23:53.917 回答
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 注入问题。小学,更不用说中学,到处都是喜欢使用评分系统的人。要找出危害,请在搜索引擎中查找“little Johnny Droptables”。

于 2012-11-08T16:24:47.513 回答
1

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

于 2012-11-08T16:34:54.973 回答
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 注入

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

此外,不鼓励您使用该mysql_功能,因为它们已被弃用。改为使用mysqli

于 2012-11-08T16:27:51.857 回答