PHP Bugs  
php.net | support | documentation | report a bug | advanced search | search howto | statistics | login

go to bug id or search bugs for  

Bug #35480 Persistent connections + unknown column crashes
Submitted:29 Nov 2005 9:10pm UTC Modified: 30 Nov 2005 7:05pm UTC
From:tim at komta dot com Assigned to:wez
Status:Closed Category:PDO related
Version:5CVS-2005-11-30 (snap) OS:Windows XP
Votes:2 Avg. Score:3.5 ± 0.5 Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%) Same OS:0 (0.0%)
View/Vote Developer Edit Submission

[29 Nov 2005 9:10pm UTC] tim at komta dot com
Description:
------------
Using a persistent connection with PDO (mysql tested) and then executing
a query with an unknown column will crash PHP 5.1.1, and take Apache
with it.

This has been reproduced on two seperate systems here at the office
already.  Both systems use Apache 2.0.54 as a module, with PHP 5.1.1

Reproduce code:
---------------
<?php 
$pdo = new PDO('mysql:host=HOST;dbname=mysql',
       USER, PASSWORD, array(PDO::ATTR_PERSISTENT => TRUE));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$pdo->query('SELECT frank FROM mysql.user LIMIT 20');
?>

Expected result:
----------------
Expect a warning, such as Warning: PDO::query() [function.query]:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'frank' in 'field
list' in C:\Documents and Settings\Tim\workspace\hxpa SVN\temp.php on
line 5

Actual result:
--------------
PHP (Apache is reported) crashes.
[29 Nov 2005 9:55pm UTC] tony2001@php.net
And what MySQL version?
[29 Nov 2005 11:04pm UTC] tim at komta dot com
Oops, sorry about that, it's MySQL 5.0.15
[29 Nov 2005 11:09pm UTC] tony2001@php.net
Georg, this seems to be the same issue caused by protocol binary
incompatibility.
[30 Nov 2005 3:35am UTC] wez@php.net
tim, can you provide a backtrace?
[30 Nov 2005 2:07pm UTC] sniper@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php5.1-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5.1-win32-latest.zip

[30 Nov 2005 3:26pm UTC] tim at komta dot com
With the snapshot linked by Sniper, the problem is still there.

Wez, I think I'm misunderstanding what you're asking...The method of
getting a backtrace that I know of (debug_backtrace()) requires PHP to
be running.  The script crashes in such a way that no output ever goes
to the user agent, in spite of no output buffering.

Is there something else I should be doing?

- Tim
[30 Nov 2005 4:07pm UTC] andrea at 3site dot it
Hi guys, theese are two result files generated by APD for PHP 5.1.1 ...
are theese usefull ?

First crash: 
#Pprof [APD] v1.0.1
caller=C:\Programmi\Apache Group\Apache2\htdocs\test.php

END_HEADER
! 2 C:\Programmi\Apache Group\Apache2\htdocs\test.php
& 3 main 2
+ 3 2 2
& 4 apd_set_pprof_trace 2
+ 4 2 2
@ 2 2 0 10014 7978
- 3
& 6 PDO->__construct 1
+ 6 2 9
@ 2 9 0 0 271419
- 6
& 7 PDO->prepare 1
+ 7 2 14
@ 2 14 0 0 106
- 7
& 8 PDOStatement->execute 1
+ 8 2 15
@ 2 15 0 0 1164
- 8
@ 2 19 0 0 27
- 2

Second crash, script launched 1 time ... but two crashes:
#Pprof [APD] v1.0.1
caller=C:\Programmi\Apache Group\Apache2\htdocs\test.php

END_HEADER
! 1 C:\Programmi\Apache Group\Apache2\htdocs\test.php
& 1 main 2
+ 1 1 2
& 2 apd_set_pprof_trace 2
+ 2 1 2
@ 0 2 0 10014 3020
- 2
& 4 PDO->__construct 1
+ 4 1 9
@ 1 9 0 0 7835
- 4
& 5 PDO->prepare 1
+ 5 1 14
@ 1 14 0 0 77
- 5
& 6 PDOStatement->execute 1
+ 6 1 15
@ 1 15 0 0 435
- 6
@ 1 19 0 0 22
- 1

Code used is the same of gm with apd starded:
<?php
apd_set_pprof_trace();
try {
    $dbo = new PDO(
                        'mysql:host=localhost;dbname=test',
                        'user',
                        'pass',
                        array(PDO::ATTR_PERSISTENT => true)
                    );
} catch(PDOException $e) {
    echo 'Errore di connessione: '.$e->getMessage();
}

$pdostatement = $dbo->prepare('SELECT * FROM fake_table');
$pdostatement->execute();

echo 'print something';

?>

Regards .

P.S. Windows XP SP2 full updated with Apache 2.0.52 and PHP 5.1.1 as
module
[30 Nov 2005 4:37pm UTC] andrea at 3site dot it
Hi guys, it's me again :-)

MySQL used version for over debug was MySQL 4.1.9-nt ... but maybe the
problem is for the constant PDO::ATTR_PERSISTENT that creates some
problems on windows and Apache ... 

in sqlite, 2 or 3 default version, is the same .. in a different way, if
I try to connect with PDO::ATTR_PERSISTENT => true the database will be
undeletable and I need to stop Apache (with a crash) ... and then I can
delete my files.

It doesn't happen without PDO::ATTR_PERSISTENT during connection ... but
I wonder in a :memory: connection what should happen ... fear !!!!!
:oVVoVe:

Now this is the code:
<?php
$dbfile1 = 'sqlite2.sql';
$dbfile2 = 'sqlite3.sql';
$sqlite = new PDO('sqlite2:'.$dbfile1, '', '',
array(PDO::ATTR_PERSISTENT => true));
unset($sqlite);
$sqlite = new PDO('sqlite:'.$dbfile2, '', '', array(PDO::ATTR_PERSISTENT
=> true));
unset($sqlite);
unlink($dbfile1);
unlink($dbfile2);
?>

Regards
[30 Nov 2005 6:52pm UTC] wez@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php5.1-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5.1-win32-latest.zip

I meant a gdb backtrace for the crash.
However, I think this problem has now been resolved; please try the next
5.1 snapshot dated after this report.
[30 Nov 2005 7:01pm UTC] tim at komta dot com
Yup, that seems to have fixed it, at least for MySQL.

Thanks!

Tim
[30 Nov 2005 7:05pm UTC] iliaa@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


RSS feed | show source 

PHP Copyright © 2001-2009 The PHP Group
All rights reserved.
Last updated: Sat Nov 21 10:30:49 2009 UTC