1

この機能は次のとおりです。

function get_article_info(){
        $id = $_GET['id'];
        $data = array();
        $q = "SELECT * FROM articles WHERE article_id = $id";
        $qry = mysql_query($q);
        while($row = mysql_fetch_assoc($qry)){
            $data[] = $row;
        }
        return $data;
    }

これと同じである:

function get_article_info2(){
        $id = $_GET['id'];
        $data = array();
        $q = mysql_fetch_assoc(mysql_query("SELECT * FROM articles WHERE article_id = $id"));

        while($row = $q){
            $data[] = $row;
        }
        return $data;
    }

get_article_info2 を使用しようとすると、次のエラーが発生します。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes)

なぜそれが機能しないのか教えてもらえますか? どうも ;)

4

2 に答える 2

2
    $q = mysql_fetch_assoc(mysql_query("SELECT * FROM articles WHERE article_id = $id"));

    while($row = $q){
        $data[] = $row;
    }

このループに終わりはありません。以前に $q に値を代入したことがあり、決して変更されないためです。したがって、同じ行が $data に何度も追加され、最終的にスクリプトがメモリ不足になります。

すべてのレコードに対して個別に fetch 関数を呼び出す必要があります (最初のコードのように)。

于 2013-04-09T13:22:53.780 に答える
2

まず第一に、常にSQL パラメータをエスケープまたはサニタイズする必要があります。

$sql = sprintf('SELECT * FROM articles WHERE article_id = %d', (int)$_GET['id']);
$res = mysql_query($sql);

次に、ループmysql_fetch_assoc() で実行する必要があります。そうしないと、無限ループが発生します。

while (($row = mysql_fetch_assoc($req)) !== false) {
    $data[] = $row;
}

mysql_*とはいえ、古い関数の使用はやめるべきです。代わりに PDO または mysqli を使用し、準備済みステートメントの力を活用してください。

于 2013-04-09T13:27:33.510 に答える