|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-06-09 17:56 UTC] david dot prusak at copart dot com
Description:
------------
When attempting to use the PDO class, Apache GPF's.
My PHP.ini reads as follows:
extension_dir = "C:\php\ext"
extension=php_pdo.dll
extension=php_pdo_odbc.dll
Apache/PHP doesn't alert me that the libraries couldn't be loaded.
The code provided is 100% reproducable on my system.
Removing all the code except the database connection doesn't crash. The code does say that the connection was established.
I'm not 100% sure if it's php or my php.ini file. The backtrace tells me that the class doesn't exist. That leaves me with a suspicion that it could be config related.
Reproduce code:
---------------
<?php
try {
$dbh = new PDO('odbc:IBMDB2', 'USER', 'PASS',
array(PDO_ATTR_PERSISTENT => true));
echo "Connected\n";
} catch (Exception $e) {
echo "Failed: " . $e->getMessage();
}
$email = "me@somewhere.com";
$stmt = $dbh->prepare("CALL SPROC(?, ?)");
$stmt->bindParam(1, $email);
$stmt->bindParam(2, $return_value, PDO_PARAM_STR, 80);
$stmt->execute();
print "procedure returned $return_value\n";
?>
Expected result:
----------------
Results from the database without error
Actual result:
--------------
(gdb) target exec C:\php\php.exe
(gdb) run test.php
Starting program: /cygdrive/c/php/php.exe test.php
PHP Fatal error: Class 'PDO' not found in c:\Documents and Settings\dmprusak1\My Documents\htdocs_80\pages\project_manager\test.php on line 17
Fatal error: Class 'PDO' not found in c:\Documents and Settings\dmprusak1\My Documents\htdocs_80\pages\project_manager\test.php on line 17
Program received signal SIGSEGV, Segmentation fault.
0x77ea3c00 in RpcRaiseException ()
from /cygdrive/c/WINDOWS/system32/rpcrt4.dll
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Oct 29 11:00:01 2025 UTC |
Sounds like two different issues, neither of which is PDO specific ;-) Check that you were modifying the right php.ini file, and that you restarted apache after changing it. (phpinfo() will help you to figure that out). Your script is broken, btw. You catch the exception, effectively ignoring the error, and then continue to use the $dbh even though you "know" it isn't there. You should move that code inside the try {} block, just after you echo "Connected"; The GPF concerns me, but I suspect it will go away once you load PDO correctly. If you're feeling motivated, can you try pruning down your script to the smallest possible test case that reproduces the GPF? I'm hoping you can cut it down to something like this: <?php class foo { function __construct() { throw new Exception("bang"); } } try { $foo = new foo; } catch (Exception $e) { echo "Failed " . $e->getMessage(); } $foo->bar(); ?>Oops sorry about that. This fails with a gpf: <?php try { $dbh = new PDO('odbc:DATABASE', 'USER', 'PASS') $stmt = $dbh->prepare("SELECT * FROM TABLE"); } catch (Exception $e) { echo "Failed: " . $e->getMessage(); } ?> While this works just fine and prints "Connected", <?php try { $dbh = new PDO('odbc:DATABASE', 'USER', 'PASS') print "Connected\n"; } catch (Exception $e) { echo "Failed: " . $e->getMessage(); } ?> When I use exec, I don't get the GPF, but I'm also not getting the correct results. When trying to query a fake table, I don't get an error. When I query the correct table, I don't get a count. When I put in an incorrect database, user or password, I do get the correct error. So that tells me that I can connect to the database. <?php try { $dbh = new PDO('odbc:DATABASE', 'USER', 'PASS') print "Connected<br>"; $count = $dbh->exec("SELECT * FROM FAKETABLE"); print "Count: $count"; } catch (Exception $e) { echo "Failed: " . $e->getMessage(); } ?> I did verify the php.ini is correct. I put in a typo in the ini file to see if Apache will err on start up and it did. (brute force method :) ) Hope that's not too much information. --DavidWhen I installed the link you provided on my Windows machine, php/apache starts, but I get an error "Unable to load dynamic library 'C:\php\ext\php_pdo.dll' - the specified procedure could not be found. This also occurs with php_pdo_odbc.dll On my solaris machine, configure doesn't work. It's informing me that the IBM_DB2 environment wasn't set, but I did run it and it is set. ./configure --with-apache2=../httpd-2.0.53 --prefix=/www/php --with-mysql=/usr/local/mysql --with-gd=/usr/local --with-apxs2=/www/apache/bin/apxs --with-config-file-path=/www/php/etc --with-ibm-db2=/export/home/db2inst1/sqllib/ checking for Adabas support... no checking for SAP DB support... no checking for Solid support... no checking for IBM DB2 support... ./configure: !: not found no configure: error: build test failed. Please check the config.log for details. You need to source your DB2 environment before running PHP configure: # . $IBM_DB2/db2profile configure:63159: checking for IBM DB2 support configure:63230: gcc -o conftest -g -O2 -D_POSIX_PTHREAD_SEMANTICS -R/usr/ucbl ib -L/usr/ucblib -R/usr/local/lib/gcc/sparc-sun-solaris2.9/3.4.2 -L/usr/local/li b/gcc/sparc-sun-solaris2.9/3.4.2 -R/usr/local/lib -L/usr/local/lib -R/usr/local/ mysql/lib/mysql -L/usr/local/mysql/lib/mysql conftest.c -L/export/home/db2inst1/sqllib//lib -ldb2 -lmysqlclient -lgd -lresolv -lm -ldl -lnsl -lsocket -lgcc -lxml2 -lz -lico nv -lm -lsocket -lnsl -lxml2 -lz -liconv -lm -lsocket -lnsl 1>&5 configure: failed program was: #line 63219 "configure" #include "confdefs.h" char SQLExecute(); int main() { SQLExecute(); return 0; } --David