Skip to content

Commit 6f32e1c

Browse files
committed
Deprecate driver specific PDO constants
RFC: https://wiki.php.net/rfc/deprecations_php_8_5. Closes GH-19526
1 parent 99068da commit 6f32e1c

File tree

103 files changed

+684
-348
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

103 files changed

+684
-348
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ PHP NEWS
4848
. Implement #81724 (openssl_cms_encrypt only allows specific ciphers).
4949
(Jakub Zelenka)
5050

51+
- PDO:
52+
. Driver specific constants in the PDO class are now deprecated. (Arnaud)
53+
5154
- Phar:
5255
. Fixed memory leaks when verifying OpenSSL signature. (Girgias)
5356

UPGRADING

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,51 @@ PHP 8.5 UPGRADE NOTES
427427
. The "uri:" DSN scheme has been deprecated due to security concerns with
428428
DSNs coming from remote URIs.
429429
RFC: https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_pdo_s_urischeme
430+
. Driver specific constants in the PDO class have been deprecated.
431+
List of affected constants and their replacement:
432+
PDO::DBLIB_ATTR_CONNECTION_TIMEOUT => Pdo\Dblib::ATTR_CONNECTION_TIMEOUT
433+
PDO::DBLIB_ATTR_QUERY_TIMEOUT => Pdo\Dblib::ATTR_QUERY_TIMEOUT
434+
PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
435+
PDO::DBLIB_ATTR_VERSION => Pdo\Dblib::ATTR_VERSION
436+
PDO::DBLIB_ATTR_TDS_VERSION => Pdo\Dblib::ATTR_TDS_VERSION
437+
PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS => Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS
438+
PDO::DBLIB_ATTR_DATETIME_CONVERT => Pdo\Dblib::ATTR_DATETIME_CONVERT
439+
PDO::FB_ATTR_DATE_FORMAT => Pdo\Firebird::ATTR_DATE_FORMAT
440+
PDO::FB_ATTR_TIME_FORMAT => Pdo\Firebird::ATTR_TIME_FORMAT
441+
PDO::FB_ATTR_TIMESTAMP_FORMAT => Pdo\Firebird::ATTR_TIMESTAMP_FORMAT
442+
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => Pdo\Mysql::ATTR_USE_BUFFERED_QUERY
443+
PDO::MYSQL_ATTR_LOCAL_INFILE => Pdo\Mysql::ATTR_LOCAL_INFILE
444+
PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY => Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY
445+
PDO::MYSQL_ATTR_INIT_COMMAND => Pdo\Mysql::ATTR_INIT_COMMAND
446+
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => Pdo\Mysql::ATTR_MAX_BUFFER_SIZE
447+
PDO::MYSQL_ATTR_READ_DEFAULT_FILE => Pdo\Mysql::ATTR_READ_DEFAULT_FILE
448+
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => Pdo\Mysql::ATTR_READ_DEFAULT_GROUP
449+
PDO::MYSQL_ATTR_COMPRESS => Pdo\Mysql::ATTR_COMPRESS
450+
PDO::MYSQL_ATTR_DIRECT_QUERY => Pdo\Mysql::ATTR_DIRECT_QUERY
451+
PDO::MYSQL_ATTR_FOUND_ROWS => Pdo\Mysql::ATTR_FOUND_ROWS
452+
PDO::MYSQL_ATTR_IGNORE_SPACE => Pdo\Mysql::ATTR_IGNORE_SPACE
453+
PDO::MYSQL_ATTR_SSL_KEY => Pdo\Mysql::ATTR_SSL_KEY
454+
PDO::MYSQL_ATTR_SSL_CERT => Pdo\Mysql::ATTR_SSL_CERT
455+
PDO::MYSQL_ATTR_SSL_CA => Pdo\Mysql::ATTR_SSL_CA
456+
PDO::MYSQL_ATTR_SSL_CAPATH => Pdo\Mysql::ATTR_SSL_CAPATH
457+
PDO::MYSQL_ATTR_SSL_CIPHER => Pdo\Mysql::ATTR_SSL_CIPHER
458+
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT
459+
PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY => Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY
460+
PDO::MYSQL_ATTR_MULTI_STATEMENTS => Pdo\Mysql::ATTR_MULTI_STATEMENTS
461+
PDO::ODBC_ATTR_USE_CURSOR_LIBRARY => Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY
462+
PDO::ODBC_ATTR_ASSUME_UTF8 => Pdo\Odbc::ATTR_ASSUME_UTF8
463+
PDO::ODBC_SQL_USE_IF_NEEDED => Pdo\Odbc::SQL_USE_IF_NEEDED
464+
PDO::ODBC_SQL_USE_DRIVER => Pdo\Odbc::SQL_USE_DRIVER
465+
PDO::ODBC_SQL_USE_ODBC => Pdo\Odbc::SQL_USE_ODBC
466+
PDO::PGSQL_ATTR_DISABLE_PREPARES => Pdo\Pgsql::ATTR_DISABLE_PREPARES
467+
PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES => Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES
468+
PDO::SQLITE_ATTR_OPEN_FLAGS => Pdo\Sqlite::OPEN_FLAGS
469+
PDO::SQLITE_ATTR_READONLY_STATEMENT => Pdo\Sqlite::ATTR_READONLY_STATEMENT
470+
PDO::SQLITE_DETERMINISTIC => Pdo\Sqlite::DETERMINISTIC
471+
PDO::SQLITE_OPEN_READONLY => Pdo\Sqlite::OPEN_READONLY
472+
PDO::SQLITE_OPEN_READWRITE => Pdo\Sqlite::OPEN_READWRITE
473+
PDO::SQLITE_OPEN_CREATE => Pdo\Sqlite::OPEN_CREATE
474+
RFC: https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_driver_specific_pdo_constants_and_methods
430475

431476
- Reflection:
432477
. The setAccessible() methods of various Reflection objects have been

ext/mysqli/tests/bug77956.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@ $link->close();
5757
unlink('bug77956.data');
5858
?>
5959
--EXPECT--
60-
[006] [2000] LOAD DATA LOCAL INFILE is forbidden, check related settings like mysqli.allow_local_infile|mysqli.local_infile_directory or PDO::MYSQL_ATTR_LOCAL_INFILE|PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY
60+
[006] [2000] LOAD DATA LOCAL INFILE is forbidden, check related settings like mysqli.allow_local_infile|mysqli.local_infile_directory or Pdo\Mysql::ATTR_LOCAL_INFILE|Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY
6161
done

ext/mysqlnd/mysqlnd_loaddata.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filenam
167167
SET_CLIENT_ERROR(conn->error_info, CR_LOAD_DATA_LOCAL_INFILE_REJECTED, UNKNOWN_SQLSTATE,
168168
"LOAD DATA LOCAL INFILE is forbidden, check related settings like "
169169
"mysqli.allow_local_infile|mysqli.local_infile_directory or "
170-
"PDO::MYSQL_ATTR_LOCAL_INFILE|PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY");
170+
"Pdo\\Mysql::ATTR_LOCAL_INFILE|Pdo\\Mysql::ATTR_LOCAL_INFILE_DIRECTORY");
171171
prerequisities_ok = FALSE;
172172
}
173173

ext/pdo/php_pdo.h

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
#define PHP_PDO_H
1919

2020
#include "zend.h"
21+
#include "Zend/zend_compile.h"
22+
#include "Zend/zend_API.h"
23+
#include "Zend/zend_attributes.h"
2124

2225
PHPAPI extern zend_module_entry pdo_module_entry;
2326
#define phpext_pdo_ptr &pdo_module_entry
@@ -50,8 +53,47 @@ PHP_MINIT_FUNCTION(pdo);
5053
PHP_MSHUTDOWN_FUNCTION(pdo);
5154
PHP_MINFO_FUNCTION(pdo);
5255

53-
#define REGISTER_PDO_CLASS_CONST_LONG(const_name, value) \
54-
zend_declare_class_constant_long(php_pdo_get_dbh_ce(), const_name, sizeof(const_name)-1, (zend_long)value);
56+
static inline void pdo_declare_deprecated_class_constant_long(
57+
zend_class_entry *ce, const char *name, zend_long value,
58+
zend_string *since, const char *message) {
59+
60+
zval zvalue;
61+
ZVAL_LONG(&zvalue, value);
62+
63+
zend_string *name_str = zend_string_init_interned(name, strlen(name), true);
64+
65+
zend_class_constant *constant = zend_declare_class_constant_ex(
66+
ce, name_str, &zvalue,
67+
ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL);
68+
69+
zend_attribute *attr = zend_add_class_constant_attribute(ce, constant,
70+
ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED),
71+
1 + (message != NULL));
72+
73+
attr->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
74+
ZVAL_STR(&attr->args[0].value, since);
75+
76+
if (message) {
77+
zend_string *message_str = zend_string_init_interned(message, strlen(message), true);
78+
79+
attr->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
80+
ZVAL_STR(&attr->args[1].value, message_str);
81+
}
82+
}
83+
84+
/* Declare a constant deprecated in 8.5 */
85+
#define REGISTER_PDO_CLASS_CONST_LONG_DEPRECATED_85(const_name, value) \
86+
pdo_declare_deprecated_class_constant_long(php_pdo_get_dbh_ce(), \
87+
const_name, (zend_long)value, \
88+
ZSTR_KNOWN(ZEND_STR_8_DOT_5), NULL)
89+
90+
/* Declare one of the constants deprecated in https://wiki.php.net/rfc/deprecations_php_8_5
91+
* "Deprecate driver specific PDO constants and methods" */
92+
#define REGISTER_PDO_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(name, old_prefix, new_prefix, value) \
93+
pdo_declare_deprecated_class_constant_long(php_pdo_get_dbh_ce(), \
94+
old_prefix name, (zend_long)value, \
95+
ZSTR_KNOWN(ZEND_STR_8_DOT_5), \
96+
"use " new_prefix name " instead")
5597

5698
#define LONG_CONST(c) (zend_long) c
5799

ext/pdo/tests/pdo_016.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
1717
$db = PDOTest::factory();
1818

1919
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
20-
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
20+
$db->setAttribute(Pdo\Mysql::ATTR_USE_BUFFERED_QUERY, true);
2121
}
2222

2323
$db->exec('CREATE TABLE test016(idx int NOT NULL PRIMARY KEY, txt VARCHAR(20))');

ext/pdo/tests/pdo_016a.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
1717
$db = PDOTest::factory();
1818

1919
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
20-
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
20+
$db->setAttribute(Pdo\Mysql::ATTR_USE_BUFFERED_QUERY, true);
2121
}
2222

2323
$db->exec('CREATE TABLE test016a(idx int NOT NULL PRIMARY KEY, txt VARCHAR(20))');

ext/pdo/tests/pdo_021.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
1616
$db = PDOTest::factory();
1717

1818
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
19-
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
19+
$db->setAttribute(Pdo\Mysql::ATTR_USE_BUFFERED_QUERY, true);
2020
}
2121

2222
$db->exec('CREATE TABLE test021(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))');

ext/pdo_dblib/pdo_dblib.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,18 @@ PHP_RSHUTDOWN_FUNCTION(pdo_dblib)
190190
return SUCCESS;
191191
}
192192

193+
#define REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, value) \
194+
REGISTER_PDO_CLASS_CONST_LONG_DEPRECATED_ALIAS_85(base_name, "DBLIB_", "Pdo\\Dblib::", value)
195+
193196
PHP_MINIT_FUNCTION(pdo_dblib)
194197
{
195-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_CONNECTION_TIMEOUT", (long) PDO_DBLIB_ATTR_CONNECTION_TIMEOUT);
196-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_QUERY_TIMEOUT", (long) PDO_DBLIB_ATTR_QUERY_TIMEOUT);
197-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER", (long) PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER);
198-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_VERSION", (long) PDO_DBLIB_ATTR_VERSION);
199-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_TDS_VERSION", (long) PDO_DBLIB_ATTR_TDS_VERSION);
200-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_SKIP_EMPTY_ROWSETS", (long) PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS);
201-
REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_DATETIME_CONVERT", (long) PDO_DBLIB_ATTR_DATETIME_CONVERT);
198+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_CONNECTION_TIMEOUT", (long) PDO_DBLIB_ATTR_CONNECTION_TIMEOUT);
199+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_QUERY_TIMEOUT", (long) PDO_DBLIB_ATTR_QUERY_TIMEOUT);
200+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_STRINGIFY_UNIQUEIDENTIFIER", (long) PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER);
201+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_VERSION", (long) PDO_DBLIB_ATTR_VERSION);
202+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_TDS_VERSION", (long) PDO_DBLIB_ATTR_TDS_VERSION);
203+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_SKIP_EMPTY_ROWSETS", (long) PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS);
204+
REGISTER_PDO_DBLIB_CLASS_CONST_LONG_DEPRECATED_ALIAS_85("ATTR_DATETIME_CONVERT", (long) PDO_DBLIB_ATTR_DATETIME_CONVERT);
202205

203206
if (FAIL == dbinit()) {
204207
return FAILURE;

ext/pdo_dblib/tests/bug_69592.phpt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
PDO_DBLIB: PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS for skip junk resultsets on SET NOCOUNT expression
2+
PDO_DBLIB: Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS for skip junk resultsets on SET NOCOUNT expression
33
--EXTENSIONS--
44
pdo_dblib
55
--SKIPIF--
@@ -18,7 +18,7 @@ $sql = '
1818
SELECT 0 AS [result]
1919
';
2020

21-
var_dump($db->getAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS));
21+
var_dump($db->getAttribute(Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS));
2222

2323
$stmt = $db->query($sql);
2424
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -27,15 +27,15 @@ var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
2727
$stmt->closeCursor();
2828

2929

30-
$db->setAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS, true);
31-
var_dump($db->getAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS));
30+
$db->setAttribute(Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS, true);
31+
var_dump($db->getAttribute(Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS));
3232

3333
$stmt = $db->query($sql);
3434
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
3535
var_dump($stmt->nextRowset());
3636
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
3737
$stmt->closeCursor();
38-
var_dump($db->getAttribute(PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS));
38+
var_dump($db->getAttribute(Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS));
3939

4040
?>
4141
--EXPECT--

0 commit comments

Comments
 (0)