0

在我的开发环境中,我在一个类中有静态函数,我可以在其中检索表的数据列表并打印到屏幕上。它工作得很好。这是我的代码:

public static function getList( $numRows=1000000, $order="name ASC" ) {

    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM posttypes ORDER BY " . mysql_real_escape_string($order) . " LIMIT :numRows";
    $stmt = $conn->prepare( $sql );
    $stmt->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
    $stmt->execute();
    $list = array();

    while ( $row = $stmt->fetch() ) {
        $postType = new PostType( $row );
        $list[] = $postType;
    }

    //Now get total number of posts that match criteria
    $sql = "SELECT FOUND_ROWS() AS totalRows";
    $totalRows = $conn->query( $sql )->fetch();
    $conn = null;

    return ( array( "results" => $list, "totalRows" => $totalRows[0] ) );
}

但是,在我的生产环境中,我无法检索任何记录。但是,如果我在 phpMyAdmin 中运行那个确切的查询,我会得到我想要的确切记录。

不知道发生了什么?这是我第一次设置生产环境。我正在使用蓝色主机。

更新:好的,我通过删除 mysql_real_escape_string 来修复它,但是我相信转义字符串更安全,但这必须返回 false 并且 SQL 语句失败。感谢大家的帮助。

4

5 回答 5

1
  1. 这是 PDO 查询失败的副本,但我看不到任何错误。如何从 PDO 获取错误消息?
  2. 无论如何,这个功能在很多方面都是错误的
    • 永远不要从应用程序函数连接,而是每个应用程序连接一次,然后使用 PDO 类的单个实例,将其传递给函数。
    • 1000000 行太多了。一旦你忘记设置 LIMIT,你就会杀死你的服务器
    • ASC无论如何都不是字符串。这是一个语法关键字。因此,逃避其中的任何字符是完全没用的。虽然,在使用默认凭据的本地服务器上,它会自行连接到服务器并返回相同的字符串,但在实时服务器上,它无法连接,因此返回 false。如何正确绑定关键字
于 2013-04-29T05:32:42.273 回答
0

首先简单测试:

  1. 您的生产 sql 数据库与您的开发数据库匹配吗?看起来你有 phpMyAdmin。

打开笔记本:剪切并跳过来自 PhpNyAdmin 的成功查询。将其粘贴到笔记本文件中。

将生产程序中的查询剪切并粘贴到同一个文件中,以验证两个查询是否相同。标点符号错误很难发现。

于 2013-04-29T01:36:11.127 回答
0

更新:好的,我通过删除 mysql_real_escape_string 来修复它,但是我相信转义字符串更安全,但这必须返回 false 并且 SQL 语句失败。感谢大家的帮助。

于 2013-04-29T05:23:02.583 回答
0

以防万一有人遇到这个问题...

当我从 Xampp 上的开发转移到生产时,我遇到了同样的问题,我从查询中什么也没得到。事实证明(经过几个小时的挫折),当我将我的数据库副本导入 Xampp 时,我所有的表名都已从以大写字母开头更改为小写。我所有的后续代码都基于这种语法,根本不起作用。所以Xampp是我问题的原因。

我知道我一开始就应该使用小写字母,但我在 20 年前刚开始编码时创建了数据库,但我一无所知!

于 2021-08-05T09:09:34.147 回答
-1

对我来说听起来像是一个数据库连接问题。也许仔细检查您的主机/联合国/密码?

于 2013-04-29T03:33:24.437 回答