我知道这个主题已经在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'");
有什么想法吗?
答案 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
}