这是我的功能。一个简单的函数,它有一个传递给查询的默认参数。但问题是当表名在撇号中时,sql将其视为字符串而不是表。
function toggleStatus($id, $table=content){
try{
$stmt = $this->db->prepare('UPDATE :table SET status = status+1 WHERE id=:id');
$stmt->execute( array( "table"=> $table, "id"=> $id ) );
}catch(PDOException $e){
$debug .= "<br> ERROR:".$e->getMessage();
}
}
由于此查询,我收到此错误:
错误:SQLSTATE [42000]:语法错误或访问冲突:1064您有 SQL语法中的错误;查看与您的手册相对应的手册 MySQL服务器版本,用于在“内容”SET附近使用正确的语法 status = status + 1 WHERE id = '82''在第1行
PS:当我删除参数并手动编写它然后它工作。
答案 0 :(得分:3)
默认情况下,您无法参数化列名,表名或任何非值的名称。设计参数以清理sql语句中的值。
当您将tablename作为参数传递时,它将用单引号
包围UPDATE 'content' ....
导致语法错误。尝试使用检查有效表名的函数并将其与update语句连接。例如,
$tableName = yourFunction('content');
$stmt = $this->db->prepare("UPDATE $tableName SET status = status+1 WHERE id=:id");
用户定义允许您传递标识符的类safemysql