Skip to content

Commit 6afbb74

Browse files
committed
Fixed bug #81037 PDO discards error message text from prepared statement
1 parent 28e7add commit 6afbb74

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ PHP NEWS
2828
- ODBC:
2929
. Fixed bug #80460 (ODBC doesn't account for SQL_NO_TOTAL indicator). (cmb)
3030

31+
- PDO_MySQL:
32+
. Fixed bug #81037 PDO discards error message text from prepared statement. (Kamil Tekiela)
33+
3134
- PDO_ODBC:
3235
. Fixed bug #44643 (bound parameters ignore explicit type definitions). (cmb)
3336

ext/pdo_mysql/mysql_driver.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,11 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin
8888
dbh->is_persistent);
8989

9090
} else {
91-
einfo->errmsg = pestrdup(mysql_error(H->server), dbh->is_persistent);
91+
if (S && S->stmt) {
92+
einfo->errmsg = pestrdup(mysql_stmt_error(S->stmt), dbh->is_persistent);
93+
} else {
94+
einfo->errmsg = pestrdup(mysql_error(H->server), dbh->is_persistent);
95+
}
9296
}
9397
} else { /* no error */
9498
strcpy(*pdo_err, PDO_ERR_NONE);

ext/pdo_mysql/tests/bug81037.phpt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Bug #81037 PDO discards error message text from prepared statement
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
6+
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
7+
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
8+
MySQLPDOTest::skip();
9+
?>
10+
--FILE--
11+
<?php
12+
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
13+
14+
$pdo = MySQLPDOTest::factory();
15+
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
16+
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
17+
MySQLPDOTest::createTestTable($pdo);
18+
19+
$sql = "SELECT id FROM test WHERE label = :par";
20+
$stmt = $pdo->prepare($sql);
21+
try {
22+
$stmt->execute();
23+
} catch (PDOException $e) {
24+
echo $e->getMessage(), "\n";
25+
}
26+
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
27+
28+
?>
29+
--CLEAN--
30+
<?php
31+
require __DIR__ . '/mysql_pdo_test.inc';
32+
MySQLPDOTest::dropTestTable();
33+
?>
34+
--EXPECT--
35+
SQLSTATE[HY000]: General error: 2031 No data supplied for parameters in prepared statement

0 commit comments

Comments
 (0)