您好,匿名用户
随意问技术百科期待您的加入

PDO如何处理SQL语句中对字段名以及表名的转义

0 投票

比如在一个数据表中有一个字段叫order,是专门用来做排序的,我的语句可能要这么写

$sth = $pdo->prepare('SELECT * FROM table_name ORDER BY order ASC');
$sth->execute();

但是因为order本身是一个关键字,那么在执行的时候就会报syntax错误,我知道在pdo里对字段可以用:column_name来动态绑定,它会自动处理引号等问题,也可以用$pdo->quote来转义字符串,但是对字段名和表名却没有方法来转义。

这种转义在不同的数据库系统里是一样的,比如在mysql里

SELECT * FROM table_name ORDER BY `order` ASC

而在sqlite里

SELECT * FROM table_name ORDER BY "order" ASC

有没有一种通用而又省事的办法来处理这个问题呢

更新

根据答案最后总结出一种通用的转义方法

$escapes = array(
    'mysql'    =>    array('`', '`'),
    'mssql'    =>    array('[', ']')
);

$driver = $db->getAttributes(PDO::ATTR_DRIVER_NAME);
$escape = isset($escapes[$driver]) ? $escapes[$driver] : array('"', '"');
$field = $escape[0] . $field . $escape[1];
用户头像 提问 2012年 12月1日 @ Rammus 上等兵 (334 威望)
分享到:

1个回答

0 投票
 
最佳答案

就我的经验来说,还真没有,遇到这种问题,也许你只能使用判断driver的方法来达到目的。你可以专门为此写个函数或者方法:

function add_quote_identifier($field, $driver = 'mysql')
{
    switch ($driver) {
        case 'mysql':
            return sprintf('`%s`', $field);
        case 'sqlite':
            return sprintf('"%s"', $field);
        default:
            return $field;
    }
}

然后再利用他来prepare statement:

$stmt = $dbh->prepare(sprintf('SELECT * FROM table_name ORDER BY %s ASC', add_quote_identifier('order')));
用户头像 回复 2012年 12月1日 @ Gragas 上等兵 (254 威望)
选中 2012年 12月1日 @Rammus
提一个问题:

相关问题

0 投票
1 回复 35 阅读
用户头像 提问 2012年 12月1日 @ Tryndamere 上等兵 (325 威望)
0 投票
1 回复 38 阅读
用户头像 提问 2012年 12月1日 @ Leona 上等兵 (279 威望)
0 投票
1 回复 51 阅读
用户头像 提问 2012年 12月1日 @ Poppy 上等兵 (395 威望)
0 投票
1 回复 33 阅读
+2 投票
1 回复 36 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...