From 6afbb7419458f0b2f40284a295be07f03b3b5a65 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 13 May 2021 13:50:32 +0100 Subject: [PATCH] Fixed bug #81037 PDO discards error message text from prepared statement --- NEWS | 3 +++ ext/pdo_mysql/mysql_driver.c | 6 +++++- ext/pdo_mysql/tests/bug81037.phpt | 35 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 ext/pdo_mysql/tests/bug81037.phpt diff --git a/NEWS b/NEWS index 77d14f0538b..43f1e76142e 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,9 @@ PHP NEWS - ODBC: . Fixed bug #80460 (ODBC doesn't account for SQL_NO_TOTAL indicator). (cmb) +- PDO_MySQL: + . Fixed bug #81037 PDO discards error message text from prepared statement. (Kamil Tekiela) + - PDO_ODBC: . Fixed bug #44643 (bound parameters ignore explicit type definitions). (cmb) diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index c5c04adf8a7..eb7a55a7ee7 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -88,7 +88,11 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin dbh->is_persistent); } else { - einfo->errmsg = pestrdup(mysql_error(H->server), dbh->is_persistent); + if (S && S->stmt) { + einfo->errmsg = pestrdup(mysql_stmt_error(S->stmt), dbh->is_persistent); + } else { + einfo->errmsg = pestrdup(mysql_error(H->server), dbh->is_persistent); + } } } else { /* no error */ strcpy(*pdo_err, PDO_ERR_NONE); diff --git a/ext/pdo_mysql/tests/bug81037.phpt b/ext/pdo_mysql/tests/bug81037.phpt new file mode 100644 index 00000000000..67c90a4458b --- /dev/null +++ b/ext/pdo_mysql/tests/bug81037.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #81037 PDO discards error message text from prepared statement +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); +MySQLPDOTest::createTestTable($pdo); + +$sql = "SELECT id FROM test WHERE label = :par"; +$stmt = $pdo->prepare($sql); +try { + $stmt->execute(); +} catch (PDOException $e) { + echo $e->getMessage(), "\n"; +} +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +?> +--CLEAN-- + +--EXPECT-- +SQLSTATE[HY000]: General error: 2031 No data supplied for parameters in prepared statement \ No newline at end of file