Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP按主键返回查询结果集_Php_Mysql_Sql_Sql Order By - Fatal编程技术网

PHP按主键返回查询结果集

PHP按主键返回查询结果集,php,mysql,sql,sql-order-by,Php,Mysql,Sql,Sql Order By,我试图按发布日期的降序从数据库中获取前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 *,

我试图按发布日期的降序从数据库中获取前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] ) );
}
运行时,echos的输出如下所示: 5051525354

数据库是使用此查询创建的(用于显示结构):


我试过运行不同的查询,它总是按主键的升序返回。为什么?

不能参数化标识符,例如列名、表名、函数和运算符

假设您认为您是通过以下方式订购的:

order by views
实际上,这是:

order by 'views'  -- a constant string
我猜MySQL足够聪明,知道按字符串排序是无用的,所以它会按照读取数据的顺序返回。注意:不能保证这是主键顺序,尽管通常是这样

不幸的是,您将不得不损坏查询字符串,以便生成:

order by views  -- or whatever column you want

弄乱查询字符串是什么意思?publicationDate是一种日期数据类型(实际上是unix时间戳),因此它不应该有issue@peterxz . . . 将额外字符串放入查询字符串中。如果所有的东西都可以作为一个参数输入(您正在做的),那就太好了。唉,这种情况是不可能的。啊,我明白你的意思。谢谢我通过将其从参数中取出并直接放入查询中来解决它。但如果我想在上升和下降之间切换,有什么办法吗?或者我应该预写这两个查询并决定使用if块吗?使用两个不同的
orderby
子句(然后可以将它们附加到相同的基本查询)。您可以执行类似于排序方式(case when?=“ASC”然后是X end)ASC、X desc的操作,但是我认为构建
order by
子句更简单。
order by views  -- or whatever column you want