PDO是如何处理SQL语句中对字段名以及表名的转义-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

2016-06-12 14:43:51 2677 1

比如在一个数据表中有一个字段叫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];
取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 19:34:03

    遇到这种问题,也许你只能使用判断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')));

    0 0
相关问答

20

回答

【大咖问答】对话PostgreSQL 中国社区发起人之一,阿里云数据库高级专家 德哥

阿里ACE 彭飞 2019-07-10 09:36:10 1278676浏览量 回答数 20

170

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 234010浏览量 回答数 170

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 160063浏览量 回答数 145

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 341457浏览量 回答数 8

38

回答

[@饭娱咖啡][¥20]对于慢sql有没有什么比较实用的诊断和处理方法?

江小白太白 2018-10-30 18:47:38 144437浏览量 回答数 38

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 149017浏览量 回答数 22

3

回答

mySQL数据库报错You have an error in your SQL syntax

落地花开啦 2016-02-14 16:09:24 133639浏览量 回答数 3

39

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 263719浏览量 回答数 39

251

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 310447浏览量 回答数 251

2

回答

区域选择帮助

fanyue88888 2012-12-07 15:54:30 205789浏览量 回答数 2
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
问答排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载