我正在使用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
中的分号被解释为元字符。我想知道如何逃避这个角色。
答案 0 :(得分:2)
如果出于某些奇怪的原因需要这样做,请不要在dns中使用dbname
参数。而是使用您的数据库驱动程序为您选择它:
$dbh->query('use "newdatabase"'); // for mysql.
这样,您可以选择用"
括起数据库名称,因此无论驱动程序 允许,您都可以将其命名为。对于这个特定场景的MySQL,它是"
字符,但这并不意味着它与PostgreSQL或Firebase不同。
但是这种方法不是防弹的,它只允许PDO库正常解析DSN,因为我不希望 PDO库来应对这种不寻常的情况,因为它的唯一目的是与尽可能多的司机互动。
驱动程序特定的限制不应该参与PDO,所以你应该真的要求驱动程序这样做,这样你也可以检查查询是否无法执行。
答案 1 :(得分:0)
数据库,表格或列名称可以(在您的情况下应该)引用带有背景(`alpha; a = b`)。
但是,这可能还不够。 ;
在几种情况下是一个重要的角色;背景可能还不够。真正的解决方案&#39;是用这些名字中的字母,数字和下划线。