ID: 35793 Comment by: gg15 at gmx dot net Reported By: deadman_great at mail dot ru Status: Assigned Bug Type: PDO related Operating System: RH Fedora Core 2 PHP Version: 5CVS-2005-12-25 (snap) Assigned To: Wez New Comment:
$result = $db->query('SELECT COUNT(*) FROM XYZ'); $row = $result->fetch(PDO::FETCH_ASSOC); $result->closeCursor(); $result = $db->query('SELECT * FROM XYZ'); $row = $result->fetch(PDO::FETCH_ASSOC); // this one throws the error an $result = null; between the statements fixes the issue, so I think this is a problem of php... Previous Comments: ------------------------------------------------------------------------ [2006-03-11 10:42:51] peres dot yzqk8 at mailnull dot com I'd got same problem with this piece of code: $s = $db->query("SELECT * FROM test ORDER BY poledrugie;"); var_dump($s->fetchAll()); $s = $db->query("SELECT * FROM test ORDER BY poletrzecie;"); var_dump($s->fetchAll()); Changed it to: $s = $db->query("SELECT * FROM test ORDER BY poledrugie;"); var_dump($s->fetchAll()); $st = $db->query("SELECT * FROM test ORDER BY poletrzecie;"); var_dump($st->fetchAll()); So I think it's wrong use of PHP objects... ------------------------------------------------------------------------ [2006-02-14 16:06:00] m at tacker dot org I can reproduce this bug on two machines (athlon-xp and pentium3) with PHP 5.1.1-gentoo (cli) (built: Feb 10 2006 18:06:50) Zend Engine v2.1.0 This is the test case: <?php /** * Test case for bug #35793 * @see http://bugs.php.net/bug.php?id=35793 * * @author Markus Tacker <[EMAIL PROTECTED]> * @version $Id: pdo-proxy-bug.php 760 2006-02-14 14:59:19Z mtacker $ */ // If you set this to true I will reconnect before each select // at line 56 // => no crash $reconnect_before_select = false; error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1); $dsn = array( 'dbtype' => 'mysql', 'host' => 'localhost', 'database' => 'test', 'username' => 'test', 'password' => '', ); // $DB = new Database; $DB = new PDO($dsn['dbtype'] . ':host=' . $dsn['host'] . ';dbname=' . $dsn['database'], $dsn['username'], $dsn['password']); $table = uniqid(); // Create a test table $sql = 'CREATE TABLE `' . $table . '` (' . "varname varchar(64) NOT NULL default ''," . "varvalue tinytext NOT NULL default ''," . 'PRIMARY KEY (varname)' . ') ENGINE=InnoDB DEFAULT CHARSET=utf8'; $result = $DB->exec($sql); if ($result === false and $result->errorCode() != PDO::ERR_NONE) { exit('Query failed: ' . $sql . "\n"); } echo 'OK: ' . $sql . "\n"; // Insert into test table $sql = 'INSERT INTO `' . $table . '`' . ' (varname, varvalue)' . ' VALUES (' . $DB->quote('uniqid') . ', ' . $DB->quote($table) . ')'; $result = $DB->exec($sql); if ($result === false and $result->errorCode() != PDO::ERR_NONE) { exit('Query failed: ' . $sql . "\n"); } echo 'OK: ' . $sql . "\n"; // Select from table for ($i = 0; $i < 10; $i++) { if ($reconnect_before_select) { unset($DB); $DB = new PDO($dsn['dbtype'] . ':host=' . $dsn['host'] . ';dbname=' . $dsn['database'], $dsn['username'], $dsn['password']); } $sql = 'SELECT * FROM `' . $table . '` LIMIT 1'; $result = $DB->query($sql); if ($result === false or $result->errorCode() != PDO::ERR_NONE) { exit('Query failed: ' . $sql . "\n"); } echo 'OK: ' . $sql . "\n"; $row = $result->fetchObject(); // $row = $result->fetch(); // $row = $result->fetchAll(); if ($row === false or $result->errorCode() != PDO::ERR_NONE) { $info = $result->errorInfo(); exit('Fetch failed: ' . $info[2] . ' (' . $info[0] . '/' . $info[1] . ')' . "\n"); } echo 'OK: ' . $table . ' == ' . $row->varvalue . "\n"; $result->closeCursor(); } // Delete temp table $DB->exec('DROP TABLE `' . $table . '`'); ?> ------------------------------------------------------------------------ [2006-01-24 11:04:37] [EMAIL PROTECTED] This is not a mysql bug: mysql_stmt_fetch returns 1 (error). (Error message "Row retrieval was canceled by mysql_stmt_close() call") So pdo called mysql_stmt_close before (I assume prepare/bind/execute failed before) ------------------------------------------------------------------------ [2005-12-28 11:48:26] [EMAIL PROTECTED] Assigning to the MySQL folks. ------------------------------------------------------------------------ [2005-12-27 15:55:03] deadman_great at mail dot ru I think that mysql developers say "It's a PDO problem" :-) Maybe this will be helpful for you. I place var_dump() for PDOStatement: $stm = $this->pdo->Prepare($query); $stm->Execute($vars); var_dump($stm); Working scripts: object(PDOStatement)#4 (1) object(PDOStatement)#10 (1) object(PDOStatement)#10 (1) object(PDOStatement)#10 (1) object(PDOStatement)#10 (1) ... Non working: object(PDOStatement)#4 (1) object(PDOStatement)#10 (1) object(PDOStatement)#10 (1) object(PDOStatement)#11 (1) // 1st #2050 error object(PDOStatement)#10 (1) // 2nd #2050 error object(PDOStatement)#12 (1) // 3rd #2050 error object(PDOStatement)#12 (1) // error #2053 object(PDOStatement)#12 (1) // error #2053 ... // error #2053 PS: Before each error #2053: Warning: PDOStatement::execute() [function.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/35793 -- Edit this bug report at http://bugs.php.net/?id=35793&edit=1