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

时间:2016-11-18 18:14:39

标签: php mysql pdo mariadb

我正在使用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中的分号被解释为元字符。我想知道如何逃避这个角色。

2 个答案:

答案 0 :(得分:2)

如果出于某些奇怪的原因需要这样做,请不要在dns中使用dbname参数。而是使用您的数据库驱动程序为您选择它:

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

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

但是这种方法不是防弹的,它只允许PDO库正常解析DSN,因为我不希望 PDO库来应对这种不寻常的情况,因为它的唯一目的是与尽可能多的司机互动。

驱动程序特定的限制不应该参与PDO,所以你应该真的要求驱动程序这样做,这样你也可以检查查询是否无法执行。

答案 1 :(得分:0)

数据库,表格或列名称可以(在您的情况下应该)引用带有背景(`alpha; a = b`)。

但是,这可能还不够。 ;在几种情况下是一个重要的角色;背景可能还不够。真正的解决方案&#39;是用这些名字中的字母,数字和下划线。

Xorifelse的回答指出了一个可能的情况,即后卫不足以满足。