#34964 [Bgs]: using PDO::query() more than once with MySQL-driver
| From: | akorthaus at web dot de | Date: | Mon, 24 Oct 2005 09:24:01 +0000 |
| Subject: | #34964 [Bgs]: using PDO::query() more than once with MySQL-driver | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-86967@lists.php.net to get a copy of this message | ||
ID: 34964
User updated by: akorthaus at web dot de
-Summary: using PDO::query() more than once
Reported By: akorthaus at web dot de
Status: Bogus
Bug Type: PDO related
Operating System: *
PHP Version: 5.*
Assigned To: wez
New Comment:
But why can't the mysql-driver set the last Statement to NULL, perhaps
in mysql_handle_doer() -
http://cvs.php.net/co.php/php-src/ext/pdo_mysql/mysql_driver.c?r=1.65#236
?
Shouldn't the API across all drivers be as consistent as possible?
The docs don't mention that you have to set the last statement to NULL
("for one of the drivers"), and don't mention that PDO::query() could
return FALSE.
Perhaps at least an exception should be thrown instead of returning
FALSE.
And you're right, with another PDO driver like sqlite I get a result
like:
output:
---------------------
object(PDOStatement)#2 ...
object(PDOStatement)#3 ...
object(PDOStatement)#4 ...
Previous Comments:
------------------------------------------------------------------------
[2005-10-24 10:32:21] helly@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
The MySql driver uses the old mysql protocol which is not capable of
this. We need someone to write a mysqlI driver and may want to find a
way to issue an error if used like this.
------------------------------------------------------------------------
[2005-10-24 04:05:06] akorthaus at web dot de
that's how this problem could also look like:
<?php
$db = new PDO('...');
$stmt = $db->query('SELECT * FROM table1');
var_dump($stmt);
$stmt = $db->query('SELECT * FROM table2');
var_dump($stmt);
$stmt = $db->query('SELECT * FROM table3');
var_dump($stmt);
?>
output:
-------------------------
object(PDOStatement)#2 ...
bool(false)
object(PDOStatement)#2 ...
Only if I do this:
<?php
$db = new PDO('...');
$stmt = $db->query('SELECT * FROM table1');
var_dump($stmt);
$stmt = NULL;
$stmt = $db->query('SELECT * FROM table2');
var_dump($stmt);
$stmt = NULL;
$stmt = $db->query('SELECT * FROM table3');
var_dump($stmt);
$stmt = NULL;
?>
output:
-------------------------
object(PDOStatement)#2 ...
object(PDOStatement)#2 ...
object(PDOStatement)#2 ...
This seems to work. But should this really be the way to go? I hope
it's a but ;-)
------------------------------------------------------------------------
[2005-10-24 03:52:50] akorthaus at web dot de
Description:
------------
If I want to use PDO::query() more than one time in a script, I have to
set the last PDOStatement to NULL, before I can use the second query.
Only If I add:
$stmt1 = NULL;
before
$stmt2 = $db->query ...
in the example below, I can work with the second query.
But - how can I work with two statments at the same time? I often have
to do this! I don't understand it because I use two different variables
for the statements here.
I have used the pdo_mysql driver (MySQL 4.1.14), pdo and pdo_mysql were
compiled from latest CVS.
Reproduce code:
---------------
<?php
$db = new PDO('...');
$stmt1 = $db->query('SELECT * FROM table1');
var_dump($stmt1);
$stmt2 = $db->query('SELECT * FROM table2');
var_dump($stmt1);
?>
Expected result:
----------------
object(PDOStatement)#2 ...
object(PDOStatement)#2 ...
Actual result:
--------------
object(PDOStatement)#2 ...
bool(false)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=34964&edit=1