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

Reply via email to