猿问

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

比如在一个数据表中有一个字段叫order,是专门用来做排序的,我的语句可能要这么写$sth=$pdo->prepare('SELECT*FROMtable_nameORDERBYorderASC');
$sth->execute();但是因为order本身是一个关键字,那么在执行的时候就会报syntax错误,我知道在pdo里对字段可以用:column_name来动态绑定,它会自动处理引号等问题,也可以用$pdo->quote来转义字符串,但是对字段名和表名却没有方法来转义。这种转义在不同的数据库系统里是一样的,比如在mysql里SELECT*FROMtable_nameORDERBY`order`ASC而在sqlite里SELECT*FROMtable_nameORDERBY"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];
HUWWW
浏览 343回答 2
2回答

繁星淼淼

就我的经验来说,还真没有,遇到这种问题,也许你只能使用判断driver的方法来达到目的。你可以专门为此写个函数或者方法:functionadd_quote_identifier($field,$driver='mysql'){switch($driver){case'mysql':returnsprintf('`%s`',$field);case'sqlite':returnsprintf('"%s"',$field);default:return$field;}}然后再利用他来preparestatement:$stmt=$dbh->prepare(sprintf('SELECT*FROMtable_nameORDERBY%sASC',add_quote_identifier('order')));
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答