|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2016-06-09 09:47 UTC] fredrik at neam dot se
Description:
------------
PdoStatement->execute() fails but does not throw an exception when supplying parameters to execute() whilst not using any placeholders in the query.
Tested on PHP 7.0.7, 5.6.20 and HHVM 3.13.1
Test script:
---------------
$dbh = new PDO('###');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$params = [":bar" => 1];
$sql = "SELECT 1";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute($params);
Expected result:
----------------
Either ->execute() should return true and the result set be populated, or an exception should be thrown (like it does for the below case):
$dbh = new PDO('###');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$params = [":bar" => 1];
$sql = "SELECT :foo";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute($params);
Actual result:
--------------
$result is false, but an exception is not thrown. The result set is empty.
This is problematic since when the error mode is set to PDO::ERRMODE_EXCEPTION, it is fair to assume that failed statements results in thrown exceptions, so that the return variable must not be checked after each usage of ->execute().
Patchesbug72368_test (last revision 2016-07-10 05:35 UTC by mbeccati@php.net)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Oct 29 09:00:01 2025 UTC |
I experience this issue as well with dblib. Using SQL Server Profiler, I confirmed that it as indeed triggering exceptions at the DB level, but they are not being thrown by PDO. It seems inconsistent, in that I only get exceptions when executing a statement where I did something like forgetting to bind a parameter. The following should demontrate the issue: $conn = new PDO('dblib:host=XXX;dbname=XXX', 'REDACTED', 'REDACTED'); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare("SELECT thistable FROM doesnotexist"); try { $stmt->execute(); } catch (Exception $ex) { die("I am never reached"); } The above WILL reach SQL Server, and emit an EventClass of "Exception", but PDO does not trickle it down to a PDOException. It's extremely unreliable.