mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix #64705 errorInfo property of PDOException is null when PDO::__construct() fails
This commit is contained in:
commit
981af26d7b
9 changed files with 86 additions and 6 deletions
4
NEWS
4
NEWS
|
@ -35,6 +35,10 @@ PHP NEWS
|
|||
. Fixed bug #79917 (File cache segfault with a static variable in inherited
|
||||
method). (Nikita)
|
||||
|
||||
- PDO:
|
||||
. Fixed bug #64705 (errorInfo property of PDOException is null when
|
||||
PDO::__construct() fails). (Ahmed Abdou)
|
||||
|
||||
- Standard:
|
||||
. Fixed bug #79930 (array_merge_recursive() crashes when called with array
|
||||
with single reference). (Nikita)
|
||||
|
|
|
@ -37,6 +37,33 @@
|
|||
|
||||
static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value);
|
||||
|
||||
void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error)
|
||||
{
|
||||
zval error_info,pdo_exception;
|
||||
char *pdo_exception_message;
|
||||
|
||||
object_init_ex(&pdo_exception, php_pdo_get_exception());
|
||||
array_init(&error_info);
|
||||
|
||||
add_next_index_string(&error_info, *pdo_error);
|
||||
add_next_index_long(&error_info, driver_errcode);
|
||||
add_next_index_string(&error_info, driver_errmsg);
|
||||
|
||||
spprintf(&pdo_exception_message, 0,"SQLSTATE[%s] [%d] %s",*pdo_error, driver_errcode, driver_errmsg);
|
||||
zend_update_property(php_pdo_get_exception(), &pdo_exception, "errorInfo", sizeof("errorInfo")-1, &error_info);
|
||||
zend_update_property_long(php_pdo_get_exception(), &pdo_exception, "code", sizeof("code")-1, driver_errcode);
|
||||
zend_update_property_string(
|
||||
php_pdo_get_exception(),
|
||||
&pdo_exception,
|
||||
"message",
|
||||
sizeof("message")-1,
|
||||
pdo_exception_message
|
||||
);
|
||||
efree(pdo_exception_message);
|
||||
zval_ptr_dtor(&error_info);
|
||||
zend_throw_exception_object(&pdo_exception);
|
||||
}
|
||||
|
||||
void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *sqlstate, const char *supp) /* {{{ */
|
||||
{
|
||||
pdo_error_type *pdo_err = &dbh->error_code;
|
||||
|
|
|
@ -691,4 +691,5 @@ PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh);
|
|||
PDO_API void php_pdo_free_statement(pdo_stmt_t *stmt);
|
||||
|
||||
|
||||
PDO_API void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error);
|
||||
#endif /* PHP_PDO_DRIVER_H */
|
||||
|
|
|
@ -103,8 +103,7 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin
|
|||
|
||||
if (!dbh->methods) {
|
||||
PDO_DBG_INF("Throwing exception");
|
||||
zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode, "SQLSTATE[%s] [%d] %s",
|
||||
*pdo_err, einfo->errcode, einfo->errmsg);
|
||||
pdo_throw_exception(einfo->errcode, einfo->errmsg, pdo_err);
|
||||
}
|
||||
|
||||
PDO_DBG_RETURN(einfo->errcode);
|
||||
|
|
17
ext/pdo_mysql/tests/bug_64705.phpt
Normal file
17
ext/pdo_mysql/tests/bug_64705.phpt
Normal file
|
@ -0,0 +1,17 @@
|
|||
--TEST--
|
||||
Bug #64705 errorInfo property of PDOException is null when PDO::__construct() fails
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo_mysql')) print 'skip not loaded';
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$dsn = 'mysql:host=DonotExistsHost;dbname=test;user=foo;password=wrongpass';
|
||||
try {
|
||||
$pdo = new \PDO($dsn, null, null);
|
||||
} catch (\PDOException $e) {
|
||||
var_dump(!empty($e->errorInfo) && is_array($e->errorInfo));
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
bool(true)
|
|
@ -96,8 +96,7 @@ int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *
|
|||
}
|
||||
|
||||
if (!dbh->methods) {
|
||||
zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode, "SQLSTATE[%s] [%d] %s",
|
||||
*pdo_err, einfo->errcode, einfo->errmsg);
|
||||
pdo_throw_exception(einfo->errcode, einfo->errmsg, pdo_err);
|
||||
}
|
||||
|
||||
return errcode;
|
||||
|
|
17
ext/pdo_pgsql/tests/bug_64705.phpt
Normal file
17
ext/pdo_pgsql/tests/bug_64705.phpt
Normal file
|
@ -0,0 +1,17 @@
|
|||
--TEST--
|
||||
Bug #64705 errorInfo property of PDOException is null when PDO::__construct() fails
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo_pgsql')) print 'skip not loaded';
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$dsn = 'pgsql:host=DonotExistsHost;dbname=test;user=foo;password=wrongpass';
|
||||
try {
|
||||
$pdo = new \PDO($dsn, null, null);
|
||||
} catch (\PDOException $e) {
|
||||
var_dump(!empty($e->errorInfo) && is_array($e->errorInfo));
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
bool(true)
|
|
@ -76,8 +76,7 @@ int _pdo_sqlite_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int li
|
|||
}
|
||||
|
||||
if (!dbh->methods) {
|
||||
zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode, "SQLSTATE[%s] [%d] %s",
|
||||
*pdo_err, einfo->errcode, einfo->errmsg);
|
||||
pdo_throw_exception(einfo->errcode, einfo->errmsg, pdo_err);
|
||||
}
|
||||
|
||||
return einfo->errcode;
|
||||
|
|
17
ext/pdo_sqlite/tests/bug_64705.phpt
Normal file
17
ext/pdo_sqlite/tests/bug_64705.phpt
Normal file
|
@ -0,0 +1,17 @@
|
|||
--TEST--
|
||||
Bug #64705 errorInfo property of PDOException is null when PDO::__construct() fails
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo_sqlite')) print 'skip not loaded';
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$dsn = 'sqlite:./bug64705NonExistingDir/bug64705NonExistingDb';
|
||||
try {
|
||||
$pdo = new \PDO($dsn, null, null);
|
||||
} catch (\PDOException $e) {
|
||||
var_dump(!empty($e->errorInfo) && is_array($e->errorInfo));
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
bool(true)
|
Loading…
Add table
Add a link
Reference in a new issue