使用PHP将数据从MYSQL获取到JSON

时间:2011-01-27 12:26:45

标签: php mysql json

我有以下非常简单的测试PHP代码,它提取数据并将其放入JSON格式的文本中。

我收到以下错误..

  

致命错误:第33行/var/www/test.php中允许的内存大小为33554432字节(试图分配1979603字节)

第33行是json_encode()行。

有没有办法让这更有效率? PHP.ini已设置为最大32M,因此从8M标准开始调整大小!

 <?php
    require('../../admin/db_login.php');

    $db=mysql_connect($host, $username, $password) or die('Could not connect');
    mysql_select_db($db_name, $db) or die('');

    $result = mysql_query("SELECT * from listinfo") or die('Could not query');
    $json = array();

    if(mysql_num_rows($result)){
            $row=mysql_fetch_assoc($result);
        while($row=mysql_fetch_row($result)){
            //  cast results to specific data types

            $test_data[]=$row;
        }
        $json['testData']=$test_data;
    }

    mysql_close($db);

    echo json_encode($json);


    ?>

5 个答案:

答案 0 :(得分:18)

您可能正在编码一个非常大的数据集。您可以一次编码每一行,而不是在一次大操作中对其进行编码。

<?php
require('../../admin/db_login.php');

$db=mysql_connect($host, $username, $password) or die('Could not connect');
mysql_select_db($db_name, $db) or die('');

$result = mysql_query("SELECT * from listinfo") or die('Could not query');

if(mysql_num_rows($result)){
    echo '{"testData":[';

    $first = true;
    $row=mysql_fetch_assoc($result);
    while($row=mysql_fetch_row($result)){
        //  cast results to specific data types

        if($first) {
            $first = false;
        } else {
            echo ',';
        }
        echo json_encode($row);
    }
    echo ']}';
} else {
    echo '[]';
}

mysql_close($db);

这样,每次调用json_encode()只会编码一个小数组而不是一个大数组。最终结果是一样的。 这是IMO解决方案,它将使用更少的内存。

答案 1 :(得分:10)

停止复制您的数据数组

$json = array();

if(mysql_num_rows($result)){
        $row=mysql_fetch_assoc($result);
    while($row=mysql_fetch_row($result)){
        //  cast results to specific data types

        $json['testData'][]=$row;
    }
}

有助于减少内存使用量

答案 2 :(得分:7)

使用此内容:

$result = mysql_query("SELECT * FROM listinfo");

$json = array();
$total_records = mysql_num_rows($result);

if($total_records > 0){
  while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){
    $json[] = $row;
  }
}

echo json_encode($json);

答案 3 :(得分:0)

作为首次解决方案,将其设置为256M甚至512M。

MySQL回归给你的数据集很可能很大。因此,即使您的PHP内存效率很高,您仍然会收到OoM错误。因此,作为一个更可行的长期解决方案,请使用LIMIT语句(SELECT * FROM $table WHERE 1=1 LIMIT 0,30(从索引0开始,获取30项)。

编辑:哦,哇,我甚至没有从第一个解决方案中看到问题......好吧,LIMIT你的查询仍然是一个好主意: - )

答案 4 :(得分:0)

这是我的第一个完美运作的json

<?php
// connect to mysql server
mysql_connect($host, $username, $password) or die('Could not connect');
// select the db name
mysql_select_db($dbname);
    // enter your sql query
    $sql = "Select * from Order_Details";
// Creates temp array variable
$temp = array();
// Gets table details
$result = mysql_query($sql);
// Adds each records/row to $temp
while($row=mysql_fetch_row($result)) {
    $temp[] = $row;
}
// Formats json from temp and shows/print on page
echo json_encode($temp);
?>