Как использовать TOP в SQL Server - PullRequest
0 голосов
/ 04 октября 2019

У меня есть следующий код:

public function findAllByPagePlain($limit, $offset, $q, $category_id, $column, $order)
    {
        $query = "SELECT DISTINCT TOP $limit p.* FROM ec_product p ";
        $keywordQuery = "(p.name REGEXP '$q' OR p.status REGEXP '$q' OR p.description REGEXP '$q') ";
        if ($category_id != -1) {
            $query = $query . ", product_category pc WHERE pc.product_id=p.id AND pc.category_id=$category_id ";
            if ($q != "") $query = $query . "AND " . $keywordQuery;
        } else {
            if ($q != "") $query = $query . "WHERE " . $keywordQuery;
        }
        $query = $query . "ORDER BY p." . $column . " " . $order . " OFFSET $offset ";
        return $this->db->get_list($query);
    }

Я пытаюсь использовать TOP, чтобы сначала получить n rows из моей базы данных. но он продолжает давать мне ошибку, говоря

Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '0'. [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '0'. ) )

Кто-нибудь знает, как решить эту проблему?

1 Ответ

0 голосов
/ 05 октября 2019

Примите во внимание следующее:

  • Причиной ошибки Incorrect syntax near '0' является тот факт, что вы не используете правильный синтаксис для предложений OFFSET ... FETCH . Я думаю, что вы пытаетесь реализовать пейджинговое решение, поэтому используйте предложения OFFSET ... FETCH вместо предложения TOP.
  • REGEXP синтаксис является частью MySQL, для MS SQL Server вы должны использовать LIKE или PATINDEX()
  • В качестве важного примечания переписать свой код и использовать параметризованные операторы для предотвращения SQLинъекционные атаки (как указано в комментариях).

Измените функцию, как в примере ниже, чтобы устранить ошибку Incorrect syntax near '0':

<?php
public function findAllByPagePlain($limit, $offset, $q, $category_id, $column, $order)
    {
        $query = "SELECT DISTINCT p.* FROM ec_product p ";
        $keywordQuery = "(p.name LIKE '%$q%' OR p.status LIKE '%$q%' OR p.description LIKE '%$q%') ";
        if ($category_id != -1) {
            $query = $query . ", product_category pc WHERE pc.product_id=p.id AND pc.category_id=$category_id ";
            if ($q != "") $query = $query . "AND " . $keywordQuery;
        } else {
            if ($q != "") $query = $query . "WHERE " . $keywordQuery;
        }
        $query = $query . "ORDER BY p." . $column . " " . $order . " OFFSET ". $offset . " ROWS FETCH NEXT " . $limit. " ROWS ONLY";
        return $this->db->get_list($query);
    }
?>
...