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