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. とにかく、この関数は多くの点で間違っています
    • アプリケーション関数から接続することはありませんが、アプリケーションごとに 1 回だけ接続してから、 PDO クラスの単一のインスタンスを使用して関数に渡します。
    • 1000000 行は多すぎます。LIMIT を設定するのを忘れた瞬間、サーバーが停止します
    • ASC決して文字列ではありません。これは構文キーワードです。したがって、その中の文字をエスケープしてもまったく役に立ちません。ただし、デフォルトの資格情報を持つローカルサーバーでは、サーバーに接続して同じ文字列を返しますが、ライブサーバーでは接続できないため、false を返します。キーワードを適切にバインドするために何をすべきか
于 2013-04-29T05:32:42.273 に答える
-1

私にはdb接続の問題のように聞こえます。おそらく、host/un/pw を再確認してください。

于 2013-04-29T03:33:24.437 に答える