2013-05-02 55 views
0

我试图更新我的数据库使用PDO语句,我没有真正的问题,直到我尝试使用变量作为名称和字段进行更新。PDO语句,其中表和字段名称是变量

$real_function = 'top' ; 
    $value = 99 ; 
    $tableName = "twitter_control" ; 

    $stmt = $pdo->prepare("UPDATE ? SET ?=? WHERE id='control' "); 
    $stmt->execute(array($tableName, $real_function, $value)); 

如果我使用此代码都按预期工作

$stmt = $pdo->prepare("UPDATE twitter_control SET top=? WHERE id='control' "); 
    $stmt->execute(array($value)); 

我怎样才能使这项工作? ,有什么建议吗?

回答

3

你总是可以做:

$stmt = $pdo->prepare("UPDATE {$tableName} SET {$real_function}=? WHERE id='control' "); 

在你准备语句来得到它的工作。据我所知,你只能将值绑定到你的执行的输入参数或bindParam功能。如果有人可以纠正,否则我..

DINS

1

当你通过执行它将该值作为参数一个字符串,当它被转义并将其包含在引号中。这导致UPDATE 'twitter_control' SET 'top' = '99',这是无效的。

你应该尽早知道你的表和列的名字。如果它们确实必须是变量,则应在创建值的白名单之后才能在查询中插入它们。

if (!in_array($real_function, array('top')) { 
    return; 
} 
..."UPDATE twitter_control SET $real_function = ?..." 
+0

当使用实际准备好的语句(而不是仿真)时,说参数被转义并用引号括起来是不正确的。实际情况是,字符串*作为单独的变量*传递给数据库,该数据库将其直接插入* compile *查询计划中,而不是SQL语句本身。 (效果是一样的,但它解释了为什么*你不能在其他上下文中使用参数。) – IMSoP 2013-05-02 22:04:25