【问题标题】:PHP SQL: Order search query results by user input orderPHP SQL:按用户输入顺序对搜索查询结果进行排序
【发布时间】:2018-12-15 15:37:09
【问题描述】:

我试图寻找解决方案,但似乎无法理解我遇到的问题。

我有一个带有“where 子句”的搜索查询,说明用户输入多个单词是否返回结果。

我需要以相同的搜索顺序返回的结果。

即使我只是添加了“ORDER BY DESC”,也会引发错误“尝试获取非对象的属性”。

这是我的代码:

$word = $_GET['word'];
$word3 = $_GET['word'];
$word = explode(";", $word);
$noOfWords = count($word);
$word2 = $word3;

if ($noOfWords == 1) {
    $searchString = " word_eng LIKE '" . $conn->escape_string($word3)  
        "%'";
} else {
    $searchString = $whereClause = "";
    foreach ($word as $entry) {
        $searchString .= " OR word_eng LIKE '" . $conn->escape_string($entry) . "' ORDER BY '" . $word2 . "' ";
    }
}

$whereClause = ($searchString != "") ? " WHERE " . preg_replace('/OR/', 
        '', $searchString, 1) : $whereClause;


$sql = "SELECT word_eng FROM words " . $whereClause . " LIMIT 17";

$result = $conn->query($sql);

if ($result->num_rows > 0) { 

    while($row = $result->fetch_assoc()) { 

        $row1 = $row["word_eng"];

        echo $row1;     


    }

【问题讨论】:

    标签: php sql


    【解决方案1】:

    您尝试使用 ORDER BY 的方式存在一些问题。在任何 SQL 中应该只有 1 个 order by 子句,您要为添加的每个单词添加它。第二部分是它期望按列名排序,并按您搜索的单词排序。

    为了保持术语的顺序和结果的顺序,有必要使用带有 case 之类的 order by 子句(Can you add an if statement in ORDER BY? 可能有助于解释这一点)。

    $orderBy = "";
    
    if ($noOfWords == 1) {
        $searchString = " word_eng LIKE '" . $conn->escape_string($word3) ."%'";
    } else {
        $searchString = $whereClause = "";
        $orderBy = " order by case `word_eng` ";
        foreach ($word as $order=>$entry) {
            $searchString .= " OR word_eng LIKE '" . $conn->escape_string($entry) . "'";
            $orderBy .= " when '$entry' then $order ";
        }
        $orderBy .= " end ";
    }
    
    $whereClause = ($searchString != "") ? " WHERE " . preg_replace('/OR/',
        '', $searchString, 1) : $whereClause;
    
    
    $sql = "SELECT word_eng FROM words " . $whereClause . " " .$orderBy." LIMIT 17";
    

    【讨论】:

    • 是的,谢谢,我不再收到错误消息,但结果词的显示顺序与初始搜索的顺序不同?因此,如果搜索 3,2,5,它将以相同的顺序返回 3,2,5 而不是“2,3,5”,这就是它目前正在做的事情。希望这是有道理的
    • 我不得不重新编写大部分代码,但这应该会让你更接近你的目标。
    • 完美!感谢您的解释,我将对此进行更多研究。
    【解决方案2】:
    if ($noOfWords == 1) {
        $searchString = " word_eng LIKE '" . $conn->escape_string($word3)  
        "%'";
    } else {
        $searchString = $whereClause = "";
        foreach ($word as $entry) {
            $searchString .= " OR word_eng LIKE '" . $conn->escape_string($entry);
        }
        $searchString .= "' ORDER BY '" . $word2 . "' ";
    }
    

    【讨论】:

      【解决方案3】:

      我认为您在下面的代码中弄乱了 MySQL 查询字符串。

      $searchString .= " OR word_eng LIKE '" . $conn->escape_string($entry) . "' ORDER BY '" . $word2 . "' ";
      

      您的查询正在生成类似

      的内容
      ORDER BY DESC
      

      OrderBy Query 应该是这样的

      ORDER BY expression [ ASC | DESC ];
      

      所以您缺少查询中的表达式。

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 2013-08-19
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        • 2014-03-20
        • 2011-10-16
        • 2011-09-28
        • 1970-01-01
        相关资源
        最近更新 更多