PHP возвращает набор результатов запроса по первичному ключу - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь получить первые X строк из базы данных по дате их публикации в порядке убывания, однако я обнаружил, что, хотя запрос работает отлично, если выполняется непосредственно в моей локальной базе данных, в PHP набор результатов всегда в порядкеиз первичных ключей.Вот фрагмент кода:

public static function getList( $numRows=1000000, $order="publicationDate DESC" ) {
$conn = new PDO( db_host, db_user, db_pw );
$sql = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM blogs
        ORDER BY " . ":order" . " LIMIT :numRows";

$st = $conn->prepare( $sql );
$st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
$st->bindValue( ":order", $order, PDO::PARAM_STR);
$st->execute();
$list = array();

while ( $row = $st->fetch() ) {
  echo $row['id'];
  $article = new Blogpost( $row );
  $list[] = $article;
}


// Now get the total number of articles that matched the criteria
$sql = "SELECT FOUND_ROWS() AS totalRows";
$totalRows = $conn->query( $sql )->fetch();
$conn = null;
return ( array ( "results" => $list, "totalRows" => $totalRows[0] ) );
}

Когда это выполняется, вывод эха выглядит следующим образом: 50 51 52 53 54

База данных была создана с помощью этого запроса (чтобы показатьВы структурируете):

 DROP TABLE IF EXISTS blogs;
 CREATE TABLE blogs
(
  id              smallint unsigned NOT NULL auto_increment,
  publicationDate date NOT NULL,
  title           varchar(255) NOT NULL,
  summary         text NOT NULL,
  content         mediumtext NOT NULL,
  views           int(11) NOT NULL,
  previewPic      varchar(255) NOT NULL,

  PRIMARY KEY     (id)
);

Я пытался выполнить разные запросы, и он всегда возвращается в порядке возрастания первичного ключа.Почему?

1 Ответ

0 голосов
/ 26 августа 2018

Нельзя параметризовать идентификаторы, такие как имена столбцов, имена таблиц, функции и операторы.

Скажем, вы думаете, что упорядочиваете по:

order by views

На самом деле это:

order by 'views'  -- a constant string

Я предполагаю, что MySQL достаточно умен, чтобы знать, что упорядочивание по строке бесполезно, поэтому он возвращает его в порядке чтения данных.Примечание: не гарантируется, что это будет порядок первичного ключа, хотя это часто имеет место.

К сожалению, вам придется манипулировать строкой запроса, поэтому вы можете сгенерировать:

order by views  -- or whatever column you want
...