|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2010-12-06 12:22 UTC] squarious at gmail dot com
Description: ------------ This bug was found from a framework test units after a system upgrade (ubuntu/10.04 -> ubuntu/10.10). The bug was tracked that the send_long_data() stopped working completely. If I try to use it for large packets, the following execute() command will fail with error "Error executing prepared statement. Incorrect arguments to mysqld_stmt_execute". I made a script that reproduces 100% the bug and I ran it at ubuntu/10.04(php5.3.2, mysql5.1.41) PASS, ubuntu/10.10(php5.3.3, mysql5.1.49) FAIL, debian/squeeze(php5.3.3, mysql5.1.49) FAIL. So I assume its a regression at php's 5.3.3. Test script: --------------- //Full test @ http://codepad.org/eKnJnWnC // Code chunk that trigger the problem. if (!$stmt->bind_param('b', $null)) die("Error binding parameters. {$stmt->error}\n"); foreach(str_split($big_data, $max_allowed_packet) as $packet ) if (!$stmt->send_long_data(0, $packet)) die("Error sending long packet. {$stmt->error}\n"); if (!$stmt->execute()) die("Error executing prepared statement. {$stmt->error}\n"); Expected result: ---------------- OK: Executed prepared statement with blob less than max_allowed_packet. OK: Executed prepared statement with blob bigger than max_allowed_packet, sent at chunks. Actual result: -------------- OK: Executed prepared statement with blob less than max_allowed_packet. Error executing prepared statement. Incorrect arguments to mysqld_stmt_execute PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 18:00:01 2025 UTC |
Please always add complete test. Never link external sites. <?php // Reproduce bug that with send_long_data, execute() fails // Agjust your settings before execute $conn = new mysqli( 'localhost', // << Server 'root', // << Username 'root', // << Password 'test' // << Schema ); if (!$conn->query('CREATE TABLE IF NOT EXISTS `test_bug_blob` (`id` integer auto_increment, `data` BLOB, PRIMARY KEY(`id`));')) die("Error creating table.\n"); if (!($result = $conn->query('SELECT @@max_allowed_packet'))) die("Error reading max allowed packet size.\n"); $max_allowed_packet = $result->fetch_array(); $max_allowed_packet = $max_allowed_packet[0]; if (!($stmt = $conn->prepare('INSERT INTO `test_bug_blob` (`data`) VALUES (?)'))) die("Cannot prepare statement for INSERT. {$conn->error}\n"); // Sent blob smaller than max allowed_packet $data = str_repeat('0123456789', $max_allowed_packet/20); if (!$stmt->bind_param('s', $data)) die("Error binding parameters. {$stmt->error}\n"); if (!$stmt->execute()) die("Error executing prepared statement. {$stmt->error}\n"); echo "OK: Executed prepared statement with blob less than max_allowed_packet.\n"; // Sent blob bigger than max allowed_packet $big_data = str_repeat('0123456789', $max_allowed_packet/9); $null = null; if (!$stmt->bind_param('b', $null)) die("Error binding parameters. {$stmt->error}\n"); foreach(str_split($big_data, $max_allowed_packet) as $packet ) if (!$stmt->send_long_data(0, $packet)) die("Error sending long packet. {$stmt->error}\n"); if (!$stmt->execute()) die("Error executing prepared statement. {$stmt->error}\n"); echo "OK: Executed prepared statement with blob bigger than max_allowed_packet, sent at chunks.\n";Andrey, smells like a server bug fixed in the latest 5.0, 5.1. 5.5 series. Below is mysqlnd @ 64bit @ MySQL 5.1.45. Ulf nixnutz@linux-fuxh:~/php/php-src/branches/PHP_5_3_cta> sapi/cli/php foo.php array(1) { ["client_info"]=> string(48) "mysqlnd 5.0.7-dev - 091210 - $Revision: 306939 $" } array(1) { ["server_info"]=> string(12) "5.1.45-debug" } OK: Executed prepared statement with blob less than max_allowed_packet. Error executing prepared statement. Got a packet bigger than 'max_allowed_packet' bytes