比如在一个数据表中有一个字段叫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];比如在一个数据表中有一个字段叫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];
就我的经验来说,还真没有,遇到这种问题,也许你只能使用判断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')));
结合 @Chris Yue 的方案,可以从连接实例里直接获取是什么driver:
// ... $driver = $db->getAttributes(PDO::ATTR_DRIVER_NAME); echo $driver; //如mysql
但我觉得更有建设性意义的问题是:“如何避免使用保留字”,因为不应该给不合法标识的存在提供便利:
避免保留字很简单:
select * from @table; set @table='sf_questions';
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号