我想使用此方法从指定的表中获取键数组(primary,foreign,...):
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
不起作用)。
感谢你们提出的建议。
答案 0 :(得分:2)
正如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;
}
}