1

这是我的功能。一个简单的函数,它有一个默认参数传递给查询。但问题是当表名在撇号中时,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();
    }   
}

由于此查询,我收到此错误:

ERROR:SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''content' SET status = status+1 WHERE id='82'' 附近使用正确的语法

PS:当我删除参数并手动编写它时,它就可以工作了。

4

1 回答 1

3

默认情况下,您不能参数化列名、表名或任何不是值的内容。参数旨在清理 sql 语句中的值。

当您将 tablename 作为参数传递时,它用单引号括起来,

UPDATE 'content' ....

导致触发语法错误。尝试使用一个函数来检查有效的表名并将其与您的更新语句连接起来。例如,

$tableName = yourFunction('content');
$stmt = $this->db->prepare("UPDATE $tableName SET status = status+1 WHERE id=:id");

用户定义类,允许您传递标识符,safemysql

于 2013-10-30T11:49:23.687 回答