我正在使用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
参数。相反,使用数据库驱动程序为您选择它:
$dbh->query('use "newdatabase"'); // for mysql.
这样,您可以选择将数据库名称包含在"
中,因此您可以将其命名为,无论驱动程序允许。对于MySQL这个特定的场景,它是"
字符,但这并不意味着它不同于PostgreSQL或Firebase。
但是这个方法不是万无一有的,它只允许PDO库解析DSN正常,因为我不期望 PDO库处理这种不寻常的情况,因为它的唯一目的是与尽可能多的驱动程序交互。
Driver specific allowances不应该参与PDO,所以你应该向Driver询问这个,这样你也可以检查查询是否执行失败
数据库名、表名或列名可以(而且应该在您的情况下)用引号加反引号(' alpha; A =b ')。
但是,这可能还不够。;
在一些语境中是重要的字符;光靠后移可能还不够。"真正的解决办法"是在这样的名字中坚持使用字母、数字和下划线。
Xorifelse的回答指出了一种可能的情况,即backtics是不够的。