直接参数VS.保存在变量中的值

时间:2013-04-09 13:17:26

标签: php mysql function

这应该是这个功能:

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)

能告诉我为什么它不起作用吗? 谢谢;)

2 个答案:

答案 0 :(得分:2)

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

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

此循环没有结束,因为您之前曾为$ q分配一个值,并且它永远不会更改。因此,同一行会一遍又一遍地附加到$ data,最后你的脚本内存不足。

您必须分别为每条记录调用fetch函数(如第一段代码所示)。

答案 1 :(得分: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代替并利用预处理语句的强大功能。