2016-11-18 232 views
1

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

明显的尝试(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

你试过'$ dbname ='alpha \; a = b';'? –

+0

我不认为任何人都会使用特殊字符作为数据库名称 - 如果它甚至被允许的话。至少 - 还有,UTF编码和定期转义应该照顾这个? –

+5

btw,变量不会在单引号中被解析''mysql:host = $ host; port = $ port; dbname = $ dbname''。 SooOOoooo'“mysql:host = $ host; port = $ port; dbname = $ dbname”'。可能是这里的重头戏。 –

回答

2

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

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

这样一来,你有"附上数据库名称的选项,这样你就可以将其命名无论司机允许。对于这种特定情况下的MySQL,它是"字符,但这并不意味着PostgreSQL或Firebase的不同。

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

驱动程序特定的配额不应该参与到PDO中,所以您应该向驱动程序询问这一点,这样您还可以检查查询是否无法执行。

0

数据库,表格或列名称可以(并且应该在你的情况下)为,带有backtics(`a = b`)的引用

但是,这可能是不够的。 ;在几种情况下是重要的人物;背景可能不够。 “真正的解决办法”是坚持使用这些名字的字母,数字和下划线。

Xorifelse的答案指出了一种可能的情况,即反演不足。