使用pdo参数更新sql数据库 - 没有错误 - 什么都不做

时间:2014-03-03 19:44:41

标签: php sql pdo

我知道这个主题已经在stackoverflow中进行了很多讨论,但我已经阅读了所有找不到解决方案的主题。

我有这个函数应该更新一个mysql数据库。它只是不做任何事情,并没有显示任何错误。如你所见,我使用的是PDO。我在stackoverflow中看到了很多与我类似的问题,并尝试了他们的解决方案,但似乎没有一个工作。

我已经检查过所有传递给此函数的变量是否正确。

public function updateValues($coreID, $table, $name, $time){
    if ($this->databaseConnection()) {        
    $query_edit_user_name = $this->db_connection->prepare("UPDATE :tableT SET time = :timeT, name = :nameT WHERE id = :coreID");
    $query_edit_user_name->bindValue(':coreID', trim($coreID), PDO::PARAM_STR);
    $query_edit_user_name->bindValue(':tableT', trim($table), PDO::PARAM_STR);
    $query_edit_user_name->bindValue(':nameT', trim($name), PDO::PARAM_STR);
    $query_edit_user_name->bindValue(':timeT', trim($time), PDO::PARAM_INT);
    $query_edit_user_name->execute();
}
}

我一直试图将''或''添加到不同的行名称或值,但没有奏效。它“工作”的唯一方法是,如果没有单个PDO参数:

    $query_edit_user_name = $this->db_connection->prepare("UPDATE table1 SET time = '55', name = 'name1' WHERE id = 'core2'");

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您不能对表名使用绑定值或参数。

$query_edit_user_name = $this->db_connection->prepare("UPDATE :tableT SET time...
                                                              ^^^^^^^

请改为尝试:

public function updateValues($coreID, $table, $name, $time){
if ($this->databaseConnection()) {
$query_edit_user_name = $this->db_connection->prepare("UPDATE `$table` SET time = :timeT, name = :nameT WHERE id = :coreID");
$query_edit_user_name->bindValue(':coreID', trim($coreID), PDO::PARAM_STR);
$query_edit_user_name->bindValue(':nameT', trim($name), PDO::PARAM_STR);
$query_edit_user_name->bindValue(':timeT', trim($time), PDO::PARAM_INT);
$query_edit_user_name->execute();

正如评论中指出的那样,动态表名称可能会被注入,具体取决于表名的派生位置。

要么在准备语句之前转义表名,例如:

$table = str_replace(array('\\',"\0" ,'`'), '', $table);

或者,使用白名单方法:

$allowed = array('table1', 'table2');
if (in_array($table, $allowed)) {
    // prepare and execute query
}