Edit report at http://bugs.php.net/bug.php?id=51386&edit=1

 ID:               51386
 Updated by:       and...@php.net
 Reported by:      rellig at minad dot de
 Summary:          mysql tries to allocate 4294967296 bytes when fetching
                   longtext via mysqli
-Status:           Assigned
+Status:           Wont fix
 Type:             Bug
 Package:          MySQLi related
 Operating System: gentoo
 PHP Version:      5.2.13
 Assigned To:      mysql

 New Comment:

This is a known limitation of ext/mysqli when using libmysql (always in
5.2 and previous) and when libmysql is enabled with 5.3 . The reason is
that the server sends not too specific metadata about the column. This
longtext has a max length of 4G and ext/mysqli tries to bind with the
max length, to be sure no data loss occurs (data doesn't fit in the bind
buffer on C level). However, that means 4G for a longtext/longblob
column. ext/mysqli has been changed to have a way to work around that.
You need to call mysqli_stmt_store_result() which will store the data
locally, which means, of course a higher memory usage for PHP. However,
because you use libmysql this won't hit the PHP's memory limit, for
sure. During store_result the max_length of every column will be
calculated and then when bind_result is executed only a buffer with size
of max_length will be allocated, which will be definitely lower than
4G.

In short,

prepare

execute

store_result

bind_result

fetch...fetch...fetch



Best,

Andrey


Previous Comments:
------------------------------------------------------------------------
[2010-04-07 20:37:41] and...@php.net

>From the link:



function news_read($limit = 0) {

        if($limit == 0)

                $qry = "SELECT * FROM news ORDER BY n_id DESC";

        else

                $qry = "SELECT * FROM news ORDER BY n_id DESC LIMIT $limit";

        echo $qry;

        $stmt = $this->db->prepare($qry);

        $stmt->execute();

        $stmt->bind_result($n_id,$n_title,$n_note,$n_time,$n_author);

        while($stmt->fetch()) {

                $n_ids[] = $n_id;

                $n_titles[] = $n_title;

                $n_notes[] = $n_note;

                $n_times[] = $n_time;

                $n_authors[] = $n_author;

                $stmnt->free_result;

        }

        $stmt->close();

        return array(ids => $n_ids, titles => $n_titles, notes => $n_notes,
times => $n_times, authors => $n_authors);

}

------------------------------------------------------------------------
[2010-03-25 08:19:55] rellig at minad dot de

Description:
------------
I wanted to fetch some lines in a php script via
mysqli-prepared-statement and got this

error:

Allowed memory size of 134217728 bytes exhausted (tried to allocate
4294967296 bytes)

I was confused because php reportet that this error occured at
bind_result.

After some time I figured out that it works when I turn one field with
LONGTEXT type to

VARCHAR, for example.



here is a link to my php-script:

http://paste.minad.de/?nid=216





you can look at http://bugs.mysql.com/bug.php?id=52234 too.





------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=51386&edit=1

Reply via email to