PDO:显示表键无法正确绑定参数[重复]

Posted

技术标签:

【中文标题】PDO:显示表键无法正确绑定参数[重复]【英文标题】:PDO: Show table keys fails to bindparam properly [duplicate] 【发布时间】:2013-11-17 15:48:48 【问题描述】:

我想用这个方法从指定的表中获取键数组(主键、外键、...):

public function getTableKeys($table)
    //OBTAIN TABLE KEYS
    try 
        $conn = $this->db->_pdo;    
        $conn->beginTransaction();

        $query = $this->db->_pdo->prepare('SHOW KEYS FROM :table');
        $query->bindParam(':table', $table, PDO::PARAM_STR);
        $query->execute();
        $keys = $query->fetchAll(PDO::FETCH_ASSOC);

        $conn->commit();
        return $keys;
    catch (Exception $e) 
        $conn->rollback();
        echo 'Caught exception: ',  $e->getMessage(), "\n";
        return false;
    

问题是,抛出了一个错误:

捕获异常:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的“ps_customer”附近使用正确的语法

现在,如果我在 phpMyAdmin 中手动运行 SQL,它会成功返回一组键。问题是它必须采用以下格式:

SHOW KEYS FROM ps_customers

采用这种格式(带引号):

SHOW KEYS FROM "ps_customers"

我的问题是:我如何将bindParam 参数插入到不带引号的SQL 中,但它是一个快速字符串(使用PDO::PARAM_INT 不起作用)。

谢谢大家的建议。

【问题讨论】:

您不能将表名或列名绑定到准备好的参数。 谢谢回答。 ...那么除了这样做之外,这个“问题”是否有任何有效的解决方案:$query = $this->db->_pdo->prepare('SHOW KEYS FROM '.$table); 你必须在语句中传递变量,确保它被正确清理。 【参考方案1】:

正如 Ben 所说,您不能在准备好的语句中绑定表名。您可以通过whitelisting 清理表名。

一组允许的表名用于确保只有白名单上的表名可以使用。

$table = "table1";//Your table name
$allowed_tables = array('table1', 'table2');//Array of allowed tables to sanatise query
if (in_array($table, $allowed_tables)) 
    getTableKeys($table);
   

只有 table1 在列表中时才会查询 SQL SHOW KEYS FROM $table

public function getTableKeys($table)
    //OBTAIN TABLE KEYS
    try 
        $conn = $this->db->_pdo;    
        $conn->beginTransaction();
        $query = $this->db->_pdo->prepare('SHOW KEYS FROM $table');
        $query->execute();
        $keys = $query->fetchAll(PDO::FETCH_ASSOC);

        $conn->commit();
        return $keys;
    catch (Exception $e) 
        $conn->rollback();
        echo 'Caught exception: ',  $e->getMessage(), "\n";
        return false;
    

【讨论】:

以上是关于PDO:显示表键无法正确绑定参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PDO 无效参数 [重复]

MySQL IN 语句的 PDO 绑定值 [重复]

使用 LIKE 和绑定值的 PDO 准备语句未找到任何结果 [重复]

什么是正确的 PDO 语法 [重复]

Pdo - 将值插入数据库错误 SQLSTATE [HY093] [重复]

PDO LIMIT 和 OFFSET [重复]