如何转义 PDO 连接字符串中的特殊字符?

How can I escape special characters in a PDO connection string?

我正在使用 PDO 扩展从 PHP 连接到 MariaDB 数据库。我想知道如何转义连接字符串中使用的特殊字符。

明显的尝试(URL-编码,用单引号引起来)都失败了。

我目前不需要连接到例如一个名字奇怪的数据库,但我想知道万一我这样做。

具体来说:假设我有以下PHP代码

<?php
$username = 'some user';
$password = 'some password';
$host = 'dummy.example.com';
$port = 1 << 16;
$dbname= 'alpha;a=b';
$PDO = new PDO("mysql:host=$host;port=$port;dbname=$dbname", 
                $username, $password, []);

这不起作用,因为 $dbname 中的分号被解释为元字符。我想知道如何转义这个字符。

如果出于某些奇怪的原因需要这样做,请不要在 dns 中使用 dbname 参数。相反,使用您的数据库 driver 到 select 它为您服务:

$dbh->query('use "newdatabase"'); // for mysql.

这样,您可以选择用 " 括起数据库名称,因此您可以将其命名为 无论 driver 允许。对于此特定场景的 MySQL,它是 " 字符,但这并不意味着它与 PostgreSQL 或 Firebase 不同。

但是这种方法不是万无一失的,它只允许 PDO 库正常解析 DSN,因为我不 期望 PDO 库能够处理这种异常情况,因为它的唯一目的是与尽可能多的 driver 互动。

Driver特定的津贴不应该参与PDO,所以你真的应该问driver这个,这样你也可以检查查询是否执行失败。

数据库、table 或列名可以(并且在您的情况下应该)用反引号 (`alpha;a=b`) 引用

但是,这可能还不够。 ; 是几个上下文中的重要字符; backtics 可能还不够。 'real fix' 就是在这样的名字中坚持使用字母、数字和下划线。

Xorifelse 的回答指出了一种可能的情况,即靠背可能不够用。