繁体   English   中英

PHP SQL:按用户输入顺序对搜索查询结果进行排序

[英]PHP SQL: Order search query results by user input order

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

我有一个带有“ 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;     


    }

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

为了保持术语的顺序和结果的顺序,有必要在某种case使用order by子句( 可以在ORDER BY中添加if语句吗?可能有助于解释这一点)。

$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";
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 . "' ";
}

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

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

您的查询正在生成类似

ORDER BY DESC

而且OrderBy Query应该是这样的

ORDER BY expression [ ASC | DESC ];

因此,您缺少查询中的表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM