【问题标题】:Why does mysql_fetch_field exhaust memory in this query?为什么 mysql_fetch_field 在此查询中耗尽内存?
【发布时间】:2023-03-19 10:46:01
【问题描述】:

我的查询是三个表的几个左连接。返回的行数为 30k。这些行相当大。

查询执行良好(如在 mysql_query($sql) 中不会导致错误)。

如果我用 while($row = mysql_fetch_array($result)){} 循环这个查询,就没有问题。但是,在 while 循环之前,我会这样做:

$types = array();
while($field = mysql_fetch_field($result)){

    switch($field->type) {
         case "int":
                $types[$field->name] = 'int';
                break;
         case "real":
            $types[$field->name] = 'float';
            break;
        default:
            $types[$field->name] = 'string';
            break;
    }
}

而 php 在mysql_fetch_field 行抛出一个致命错误:

致命错误:允许的内存大小为 134217728 字节已用尽(试图分配 24 字节)

为什么会这样,为什么mysql_fetch_array while 循环也不会导致内存问题?以及如何使用mysql_fetch_field 获取字段名称类型。

【问题讨论】:

  • 无论如何你都不应该使用mysql_* 函数。它们已被弃用很长时间。使用 mysqli 或 PDO。

标签: php mysql


【解决方案1】:

尝试使用带偏移量的mysql_fetch_field

$types = array();
$index=0;
$num_fields=mysql_num_fields($resource);

while($index<$num_fields) {
 $field=mysql_fetch_field($resource, $index);



    switch($field->type) {
         case "int":
                $types[$field->name] = 'int';
                break;
         case "real":
            $types[$field->name] = 'float';
            break;
        default:
            $types[$field->name] = 'string';
            break;
    }
 $index++; 
}

【讨论】:

  • 没关系,因为如果没有提供索引,该函数会自动获取下一个未获取的字段。 php.net/manual/en/function.mysql-fetch-field.php
  • 我怀疑该字段的名称可能类似于引擎尝试执行的表达式或类似的东西,这就是它失败的原因。当像索引数组一样迭代它时,它是不同的
  • 有什么不同?无论哪种方式,您仍然会得到一个对象。
  • 我认为内部C++实现存在差异,字段的鬃毛是简单的单词吗?
  • 这仍然给出同样的错误,在这一行: field=mysql_fetch_field($resource, $index);
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2021-09-10
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2013-07-06
相关资源
最近更新 更多