php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #34054 pdo_mysql driver prepares all queries
Submitted: 2005-08-09 19:37 UTC Modified: 2011-01-06 16:36 UTC
Votes:1
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: jonathan+php at daikini dot com Assigned: mysql (profile)
Status: Not a bug Package: PDO related
PHP Version: 5.1.0b3 OS: Mac OS X 10.4.2
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: jonathan+php at daikini dot com
New email:
PHP Version: OS:

 

 [2005-08-09 19:37 UTC] jonathan+php at daikini dot com
Description:
------------
Using MySQL 4.1.11

The pdo_mysql driver appears to attempt to prepare every query 
that it processes. Unfortunately only certain query statement 
types can be prepared in the current version of MySQL. See: 
http://bugs.mysql.com/bug.php?id=6415

This is causing a failure in the example code posted.

Perhaps the pdo_mysql driver could look at the type of 
statement it is processing and act accordingly and only 
prepare statements that allow it or perhaps a new option or 
method could be added so that it could be explicitly stated 
that the query should not be prepared.

Reproduce code:
---------------
<?php
$db = new PDO("mysql:dbname=test;host=127.0.0.1", 'root', '');

$db->query('DROP TABLE IF EXISTS pdo_test');
$db->query('CREATE TABLE pdo_test (field1 int(11) default NULL, field2 varchar(20) default NULL)');

$query_that_should_not_fail = "SHOW CREATE TABLE pdo_test";

$result = $db->query($query_that_should_not_fail);
      
if (!$result) {
   $errorInfo = $db->errorInfo();
   print_r($errorInfo);
   exit;
}

$row = $result->fetch(PDO_FETCH_ASSOC);
echo count($row);
?>

Expected result:
----------------
2

Actual result:
--------------
Array
(
    [0] => HY000
    [1] => 1295
    [2] => This command is not supported in the prepared 
statement protocol yet
) 

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-08-09 19:45 UTC] iliaa@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

Use exec() specifically designed for these cases.
 [2005-08-09 19:52 UTC] jonathan+php at daikini dot com
PDO::exec() prepares and executes an SQL statement in a single 
function call, returning the number of rows affected by the 
statement.

I don't need to know the number of rows affected by the 
statement. I need a PDOStatement object that I can call fetch 
on.
 [2011-01-01 23:41 UTC] jani@php.net
-Package: Feature/Change Request +Package: MySQL related
 [2011-01-06 16:36 UTC] uw@php.net
-Status: Open +Status: Bogus -Package: MySQL related +Package: PDO related -Assigned To: +Assigned To: mysql
 [2011-01-06 16:36 UTC] uw@php.net
Today's MySQL PDO driver has a fallback to non-prepared execution.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 27 00:01:30 2024 UTC