Skip to content

Commit

Permalink
Updated pdo_sqlsrv_get_driver_methods as per documentation (#1259)
Browse files Browse the repository at this point in the history
  • Loading branch information
yitam committed May 18, 2021
1 parent 3bc0624 commit 7313fa0
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 5 deletions.
11 changes: 6 additions & 5 deletions source/pdo_sqlsrv/pdo_dbh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1574,12 +1574,13 @@ pdo_sqlsrv_function_entry *pdo_sqlsrv_get_driver_methods( _Inout_ pdo_dbh_t *dbh
PDO_LOG_DBH_ENTRY;

sqlsrv_conn* driver_conn = reinterpret_cast<sqlsrv_conn*>( dbh->driver_data );
SQLSRV_ASSERT( driver_conn != NULL, "pdo_sqlsrv_get_driver_methods: driver_data object was NULL." );
CHECK_CUSTOM_ERROR( true, driver_conn, PDO_SQLSRV_ERROR_FUNCTION_NOT_IMPLEMENTED ) {
return NULL;
}

return NULL; // to avoid a compiler warning
// As per documentation, simply return false if the method does not exist
// https://www.php.net/manual/en/function.is-callable.php
// But user can call PDO::errorInfo() to check the error message if necessary
CHECK_CUSTOM_WARNING_AS_ERROR(true, driver_conn, PDO_SQLSRV_ERROR_FUNCTION_NOT_IMPLEMENTED);

return NULL; // return NULL for PDO to take care of the rest
}

namespace {
Expand Down
50 changes: 50 additions & 0 deletions test/functional/pdo_sqlsrv/pdo_1258_is_callable_error.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
--TEST--
GitHub issue 1258 - is_callable() throws an exception if PDOStatement method does not exist
--DESCRIPTION--
The test shows is_callable() will return false if PDOStatement method does not exist instead of throwing an exception. The user can still check errorInfo() for the error message. See documentation https://www.php.net/manual/en/function.is-callable.php
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif.inc'); ?>
--FILE--
<?php
require_once("MsSetup.inc");
require_once("MsCommon_mid-refactor.inc");

try {
$conn = connect();
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->prepare("SELECT @@Version");
$functionExists = is_callable([$stmt, 'bindParam'], false, $callable);
var_dump($functionExists);
var_dump($callable);

$functionExists = is_callable([$stmt, 'boo']);
var_dump($functionExists);

echo PHP_EOL . "Error INFO:" . PHP_EOL;
var_dump($conn->errorInfo());

echo "Done\n";
} catch (PdoException $e) {
echo $e->getMessage();
}

?>
--EXPECT--
bool(true)
string(23) "PDOStatement::bindParam"
bool(false)

Error INFO:
array(3) {
[0]=>
string(5) "IMSSP"
[1]=>
int(-58)
[2]=>
string(48) "This function is not implemented by this driver."
}
Done

0 comments on commit 7313fa0

Please sign in to comment.