CentOS 6.4 PHP 5.3.3 MySQL 5.1.69 x86_64
mysql_stmt::fetch()
使用准备好的语句执行 fetch 时,PHP 产生错误:PHP 致命错误:允许的内存大小为 134217728 字节已用尽(尝试分配 4294967296 字节)。
当用于创建临时表的 SELECT 语句中包含的变量未设置时,会发生这种情况,无论该变量是否在调用存储过程之前在环境中设置。该变量必须在存储过程中设置。当使用 SELECT 语句将临时表中的数据返回给 PHP,并且 PHP 使用 mysql_stmt::fetch() 访问数据时,PHP 会生成上述致命错误。
MySQL 代码:
DELIMITER $$
CREATE PROCEDURE test_sp()
BEGIN
# uncomment below line, and PHP call to mysqli_stmt::fetch() works
# SET @status = 1;
# remove tmp table
DROP TABLE IF EXISTS tmp_table;
# CREATE TEMPORARY TABLE
CREATE TEMPORARY TABLE tmp_table
SELECT @status AS status;
SELECT * FROM tmp_table;
END $$
DELIMITER ;
PHP代码:
// obtain MySQL login info
require_once(MYSQLOBJ);
// initialize status
$status = "";
$db = new mysqli(
DB_HOST,
DB_USER,
DB_PASSWORD,
DB_NAME
);
$query = "CALL test_sp";
$stmt = $db->prepare($query);
$stmt->execute();
$stmt->bind_result( $status );
$stmt->store_result();
$stmt->fetch(); // PHP FATAL ERROR OCCURS HERE
$stmt->free_result();
$db->close();
print "<p>status = $status</p>\n";