Skip to content

Commit b7444cf

Browse files
committed
Add conditional Pdo/Mysql class declaration
1 parent 3a70b81 commit b7444cf

File tree

2 files changed

+77
-40
lines changed

2 files changed

+77
-40
lines changed

src/Php84/Resources/stubs/Pdo/Mysql.php

Lines changed: 71 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,82 @@
1414
use PDOException;
1515

1616
if (\PHP_VERSION_ID < 80400) {
17-
class Mysql extends PDO
17+
// Feature detection for non-mysqlnd; see also https://www.php.net/manual/en/class.pdo-mysql.php#pdo-mysql.constants.attr-max-buffer-size
18+
if (defined('PDO::MYSQL_ATTR_MAX_BUFFER_SIZE') && defined('PDO::MYSQL_ATTR_READ_DEFAULT_FILE') && defined('PDO::MYSQL_ATTR_READ_DEFAULT_GROUP'))
1819
{
19-
public const ATTR_COMPRESS = PDO::MYSQL_ATTR_COMPRESS;
20-
public const ATTR_DIRECT_QUERY = PDO::MYSQL_ATTR_DIRECT_QUERY;
21-
public const ATTR_FOUND_ROWS = PDO::MYSQL_ATTR_FOUND_ROWS;
22-
public const ATTR_IGNORE_SPACE = PDO::MYSQL_ATTR_IGNORE_SPACE;
23-
public const ATTR_INIT_COMMAND = PDO::MYSQL_ATTR_INIT_COMMAND;
24-
public const ATTR_LOCAL_INFILE = PDO::MYSQL_ATTR_LOCAL_INFILE;
25-
public const ATTR_LOCAL_INFILE_DIRECTORY = \PHP_VERSION_ID >= 80100 ? \PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY : 1015;
26-
public const ATTR_MAX_BUFFER_SIZE = PDO::MYSQL_ATTR_MAX_BUFFER_SIZE;
27-
public const ATTR_MULTI_STATEMENTS = PDO::MYSQL_ATTR_MULTI_STATEMENTS;
28-
public const ATTR_READ_DEFAULT_FILE = PDO::MYSQL_ATTR_READ_DEFAULT_FILE;
29-
public const ATTR_READ_DEFAULT_GROUP = PDO::MYSQL_ATTR_READ_DEFAULT_GROUP;
30-
public const ATTR_SERVER_PUBLIC_KEY = PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY;
31-
public const ATTR_SSL_CA = PDO::MYSQL_ATTR_SSL_CA;
32-
public const ATTR_SSL_CAPATH = PDO::MYSQL_ATTR_SSL_CAPATH;
33-
public const ATTR_SSL_CERT = PDO::MYSQL_ATTR_SSL_CERT;
34-
public const ATTR_SSL_CIPHER = PDO::MYSQL_ATTR_SSL_CIPHER;
35-
public const ATTR_SSL_KEY = PDO::MYSQL_ATTR_SSL_KEY;
36-
public const ATTR_SSL_VERIFY_SERVER_CERT = PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT;
37-
public const ATTR_USE_BUFFERED_QUERY = PDO::MYSQL_ATTR_USE_BUFFERED_QUERY;
20+
class Mysql extends PDO
21+
{
22+
public const ATTR_COMPRESS = PDO::MYSQL_ATTR_COMPRESS;
23+
public const ATTR_DIRECT_QUERY = PDO::MYSQL_ATTR_DIRECT_QUERY;
24+
public const ATTR_FOUND_ROWS = PDO::MYSQL_ATTR_FOUND_ROWS;
25+
public const ATTR_IGNORE_SPACE = PDO::MYSQL_ATTR_IGNORE_SPACE;
26+
public const ATTR_INIT_COMMAND = PDO::MYSQL_ATTR_INIT_COMMAND;
27+
public const ATTR_LOCAL_INFILE = PDO::MYSQL_ATTR_LOCAL_INFILE;
28+
public const ATTR_LOCAL_INFILE_DIRECTORY = \PHP_VERSION_ID >= 80100 ? \PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY : 1015;
29+
public const ATTR_MAX_BUFFER_SIZE = PDO::MYSQL_ATTR_MAX_BUFFER_SIZE;
30+
public const ATTR_MULTI_STATEMENTS = PDO::MYSQL_ATTR_MULTI_STATEMENTS;
31+
public const ATTR_READ_DEFAULT_FILE = PDO::MYSQL_ATTR_READ_DEFAULT_FILE;
32+
public const ATTR_READ_DEFAULT_GROUP = PDO::MYSQL_ATTR_READ_DEFAULT_GROUP;
33+
public const ATTR_SERVER_PUBLIC_KEY = PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY;
34+
public const ATTR_SSL_CA = PDO::MYSQL_ATTR_SSL_CA;
35+
public const ATTR_SSL_CAPATH = PDO::MYSQL_ATTR_SSL_CAPATH;
36+
public const ATTR_SSL_CERT = PDO::MYSQL_ATTR_SSL_CERT;
37+
public const ATTR_SSL_CIPHER = PDO::MYSQL_ATTR_SSL_CIPHER;
38+
public const ATTR_SSL_KEY = PDO::MYSQL_ATTR_SSL_KEY;
39+
public const ATTR_SSL_VERIFY_SERVER_CERT = PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT;
40+
public const ATTR_USE_BUFFERED_QUERY = PDO::MYSQL_ATTR_USE_BUFFERED_QUERY;
41+
42+
public function __construct(
43+
string $dsn,
44+
?string $username = null,
45+
?string $password = null,
46+
?array $options = null
47+
)
48+
{
49+
parent::__construct($dsn, $username, $password, $options);
3850

39-
public function __construct(
40-
string $dsn,
41-
?string $username = null,
42-
?string $password = null,
43-
?array $options = null
44-
)
51+
if (($driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME)) !== 'mysql')
52+
{
53+
throw new PDOException("Pdo\Mysql::__construct() cannot be used for connecting to the \"$driver\" driver");
54+
}
55+
}
56+
}
57+
} else {
58+
class Mysql extends PDO
4559
{
46-
parent::__construct($dsn, $username, $password, $options);
60+
public const ATTR_COMPRESS = PDO::MYSQL_ATTR_COMPRESS;
61+
public const ATTR_DIRECT_QUERY = PDO::MYSQL_ATTR_DIRECT_QUERY;
62+
public const ATTR_FOUND_ROWS = PDO::MYSQL_ATTR_FOUND_ROWS;
63+
public const ATTR_IGNORE_SPACE = PDO::MYSQL_ATTR_IGNORE_SPACE;
64+
public const ATTR_INIT_COMMAND = PDO::MYSQL_ATTR_INIT_COMMAND;
65+
public const ATTR_LOCAL_INFILE = PDO::MYSQL_ATTR_LOCAL_INFILE;
66+
public const ATTR_LOCAL_INFILE_DIRECTORY = \PHP_VERSION_ID >= 80100 ? \PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY : 1015;
67+
// public const ATTR_MAX_BUFFER_SIZE = PDO::MYSQL_ATTR_MAX_BUFFER_SIZE; // disabled for mysqlnd
68+
public const ATTR_MULTI_STATEMENTS = PDO::MYSQL_ATTR_MULTI_STATEMENTS;
69+
// public const ATTR_READ_DEFAULT_FILE = PDO::MYSQL_ATTR_READ_DEFAULT_FILE; // disabled for mysqlnd
70+
// public const ATTR_READ_DEFAULT_GROUP = PDO::MYSQL_ATTR_READ_DEFAULT_GROUP; // disabled for mysqlnd
71+
public const ATTR_SERVER_PUBLIC_KEY = PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY;
72+
public const ATTR_SSL_CA = PDO::MYSQL_ATTR_SSL_CA;
73+
public const ATTR_SSL_CAPATH = PDO::MYSQL_ATTR_SSL_CAPATH;
74+
public const ATTR_SSL_CERT = PDO::MYSQL_ATTR_SSL_CERT;
75+
public const ATTR_SSL_CIPHER = PDO::MYSQL_ATTR_SSL_CIPHER;
76+
public const ATTR_SSL_KEY = PDO::MYSQL_ATTR_SSL_KEY;
77+
public const ATTR_SSL_VERIFY_SERVER_CERT = PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT;
78+
public const ATTR_USE_BUFFERED_QUERY = PDO::MYSQL_ATTR_USE_BUFFERED_QUERY;
4779

48-
if (($driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME)) !== 'mysql')
80+
public function __construct(
81+
string $dsn,
82+
?string $username = null,
83+
?string $password = null,
84+
?array $options = null
85+
)
4986
{
50-
throw new PDOException("Pdo\Mysql::__construct() cannot be used for connecting to the \"$driver\" driver");
87+
parent::__construct($dsn, $username, $password, $options);
88+
89+
if (($driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME)) !== 'mysql')
90+
{
91+
throw new PDOException("Pdo\Mysql::__construct() cannot be used for connecting to the \"$driver\" driver");
92+
}
5193
}
5294
}
5395
}

tests/Php84/PdoTest.php

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,12 @@ public function testMysqlConstants()
125125
$this->assertSame(\PHP_VERSION_ID < 80500 ? 1013 : 1012, \Pdo\Mysql::ATTR_MULTI_STATEMENTS);
126126
$this->assertSame(\PHP_VERSION_ID < 80500 ? 1014 : 1013, \Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT);
127127
$this->assertSame(\PHP_VERSION_ID < 80500 ? 1015 : 1014, \Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY);
128-
}
129-
130-
/**
131-
* @requires extension pdo_mysql
132-
* @requires extension libmysqlclient
133-
*/
134-
public function testMysqlConstantsMysqlnd()
135-
{
136-
$this->assertSame(1003, \Pdo\Mysql::ATTR_READ_DEFAULT_FILE);
137-
$this->assertSame(1004, \Pdo\Mysql::ATTR_READ_DEFAULT_GROUP);
138-
$this->assertSame(1005, \Pdo\Mysql::ATTR_MAX_BUFFER_SIZE);
128+
if (defined('PDO::MYSQL_ATTR_MAX_BUFFER_SIZE') && defined('PDO::MYSQL_ATTR_READ_DEFAULT_FILE') && defined('PDO::MYSQL_ATTR_READ_DEFAULT_GROUP'))
129+
{
130+
$this->assertSame(1003, \Pdo\Mysql::ATTR_READ_DEFAULT_FILE);
131+
$this->assertSame(1004, \Pdo\Mysql::ATTR_READ_DEFAULT_GROUP);
132+
$this->assertSame(1005, \Pdo\Mysql::ATTR_MAX_BUFFER_SIZE);
133+
}
139134
}
140135

141136
/**

0 commit comments

Comments
 (0)