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

开发者社区> 问答> 正文

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

2016-06-12 14:43:51 2744 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
相关问答

1

回答

咨询下flink sql-client怎么处理DDL后,fink sql里面映射表加字段以及JOb?

2022-07-25 16:08:04 110浏览量 回答数 1

0

回答

flink sql-client,怎么处理源端与目标增加端,sql-client包括映射表与JOB如

2022-07-25 16:08:04 98浏览量 回答数 0

1

回答

flink sql源表定义字段列表有问题怎么办?

2021-12-02 11:03:46 155浏览量 回答数 1

0

回答

跟踪业务执行日志时发现一SQL执行异常报错:ORA-0001 违反了唯一约束,该如何处理呢?

2021-10-28 23:52:30 190浏览量 回答数 0

1

回答

SQL语句中表的别名要怎么处理?

2021-03-08 21:46:23 190浏览量 回答数 1

1

回答

OSS 图片处理遇到 错误,如何排查?

2021-03-10 20:11:34 496浏览量 回答数 1

1

回答

您可以在ORDER BY中添加if语句吗??mysql

2020-05-17 19:30:15 365浏览量 回答数 1

1

回答

[@wangccsy][¥20]Java工程师如何规划自己的职业生涯?

2018-12-10 15:50:02 1651浏览量 回答数 1

1

回答

如何下载 url中没有带文件名的文件

2016-02-19 16:02:22 3195浏览量 回答数 1

7

回答

做个调查CENTOS,REDHAT,SERVER2003你们用的是哪个

2012-10-30 23:22:07 8226浏览量 回答数 7
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载