PHP ADOdb/PDO相当于Perl DBI quote_标识符?

PHP ADOdb/PDO相当于Perl DBI quote_标识符?,php,pdo,adodb,Php,Pdo,Adodb,在我目前的工作中,标准做法是直接使用mysql_query()和friends。在构造大型查询时,由于我们的标准部署是在MySQL上,表名只会被插入并被反勾号包围(部分,假示例): 我试图摆脱MySQL ism,作为其中的一部分,朝着和/或的方向发展。但是,与PHP相比,我更熟悉Perl,我很惊讶我无法轻松找到的等价物,它要么是一个单独的表名,要么是一整套标识信息(目录、模式、表)。我是否忽略了一些显而易见的东西?不幸的是,在PHP领域,没有任何东西可以与DBI相比。PDO是一个值得的起点 最好

在我目前的工作中,标准做法是直接使用mysql_query()和friends。在构造大型查询时,由于我们的标准部署是在MySQL上,表名只会被插入并被反勾号包围(部分,假示例):


我试图摆脱MySQL ism,作为其中的一部分,朝着和/或的方向发展。但是,与PHP相比,我更熟悉Perl,我很惊讶我无法轻松找到的等价物,它要么是一个单独的表名,要么是一整套标识信息(目录、模式、表)。我是否忽略了一些显而易见的东西?

不幸的是,在PHP领域,没有任何东西可以与DBI相比。PDO是一个值得的起点

最好的办法不是尝试创建DB特定的标识符引用,而是告诉数据库遵循标准,这意味着您可以使用双引号来标识列和表名。此标准指定格式为大多数其他数据库所接受,包括Postgres和SQLite。有些()还有类似的设置,可以从非标准默认值切换到双引号

作为警告,这意味着您在引用字符串文字值时必须始终使用单引号,而不是双引号。此外,大多数标识符不必被引用,除非它们是SQL关键字或由数据库保留

使SQL可移植还需要很多其他步骤。您可能希望进一步了解如何实际使用SQL构建器或ORM

/**
 * @param string|string[]$identifiers
 * @param string $tableName
 * @param string $dbName
 * @return string[]|string
 */
static public function quoteIdentifiers($identifiers, $tableName='', $dbName='' ){
    if( is_array($identifiers) ){
        $result = array();
        foreach( $identifiers as $identifier ){
            $result[] = self::quoteIdentifiers($identifier, $tableName, $dbName);
        }
    }else{
        $result = '`'.str_replace('`','``',$identifiers).'`'; // escape backtick with backtick
        if( $tableName ){
            $result = '`'.$tableName.'`.'.$result;
        }
        if( $dbName ){
            $result = '`'.$dbName.'`.'.$result;
        }
    }
    return $result;
}
用法:

$columns = quoteIdentifiers(array('my col1', 'my col2'), 'table');
$sql = 'SELECT '.join(',', $columns);
$sql=.' FROM '.quoteIdentifiers('table');
=> SELECT `table`.`my col1`,`table`.`my col2` FROM `table`
奖金(智能报价值,无需连接!):


很清楚,SQL可移植性远比正确引用表要复杂得多。我真的只是希望不必写类似引用的东西。考虑到当前的代码库,在游戏中启用ANSI引用已经太晚了。除非有其他人介入,否则我会接受你的答案(不,没有明显的等价物)。谢谢。我接受了“我是否忽略了一些明显的东西?”——似乎PDO或ADOdb中没有直接的等价物。
$columns = quoteIdentifiers(array('my col1', 'my col2'), 'table');
$sql = 'SELECT '.join(',', $columns);
$sql=.' FROM '.quoteIdentifiers('table');
=> SELECT `table`.`my col1`,`table`.`my col2` FROM `table`
/**
 * quote a value or values
 * @param string|string[]|int|int[] $value
 * @return string[]|string
 */
static public function quoteValues($value) {
    if( is_array($value) ){
        $result = array_map(__METHOD__, $value);
    }elseif( $value===true ){
        $result = 'TRUE';
    }elseif( $value===false ){
        $result = 'FALSE';
    }elseif( $value===null ){
        $result = 'NULL';
    }elseif( is_int($value) OR is_float($value) OR  ( is_string($value) AND $value===strval($value*1) ) ){
        $result = strval($value); // no quote needed
    }else{
        $result =  "'".str_replace(
                        array('\\',     "\0",   "\n",   "\r", "'",      '"',    "\x1a"),
                        array('\\\\',   '\\0',  '\\n', '\\r', "\\'",    '\\"',  '\\Z'),
                        strval($value)). "'";
    }
    return $result;
}