3

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

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不起作用)。

感谢您的建议,伙计们。

4

1 回答 1

2

正如本所说,您不能在准备好的语句中绑定表名。您可以通过列入白名单来清理表名。

允许使用的表名数组用于确保只能使用白名单上的表名。

$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);
}   

SHOW KEYS FROM $table仅当 table1 在列表中时才会查询SQL 。

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;
    }
}
于 2013-11-06T19:46:50.123 回答