尝试创建一个删除函数,该函数将使用字段和值从任何表中删除。
问题是它不起作用,我没有从中得到任何错误,我可以添加东西到数据库但不删除它们。
if (isset($_REQUEST['delete']))
{
$table = $_POST['table'];
$field = $_POST['field'];
$value = $_POST['value'];
deleteFromTable($database, $table, $field, $value);
}
function deleteFromTable($pdo, $table, $field, $value)
{
$stmt = $pdo->prepare('DELETE FROM :table WHERE :field = :value');
$criteria = [
'table' => $table,
'field' => $field,
'value' => $value
];
$stmt->execute($criteria);
}
答案 0 :(得分:4)
表不能用作参数。虽然不安全,但只需将其放入查询中就可以了:
$stmt = $pdo->prepare("DELETE FROM `$table` WHERE $field = :value");
或
$stmt = $pdo->prepare('DELETE FROM `'.$table.'` WHERE `'.$field.'` = :value');
在继续查询之前,您确实应该检查以确保$ table是可接受的值。
您还需要冒号参数,如下所示:
$criteria = [
':value' => $value
];
答案 1 :(得分:1)
您不能使用表名参数,也不能使用列名参数。正如它当前编写的那样,当您执行准备好的语句时,无论是否可以看到它,都会产生语法错误。如果你这样做:
private static void printSquare(int size) {
char[] line = new char[size];
Arrays.fill(line, 'X');
for (int i = 0; i < size; i++)
System.out.println(line);
}
您不会生成语法错误,但它仍然不会按照您的想法执行。它不会将$stmt = $pdo->prepare("DELETE FROM `$table` WHERE :field = :value");
视为列标识符,而是将其视为值!因此,如果用户发布类似
:field
然后实际上,查询将是
$_POST = ['table' => 'table1','field' => 1, 'value' => 1]
这将 删除您表格中的每一行 ,我认为您不希望这样做。 你需要的陈述是
DELETE FROM `table1` WHERE '1' = '1'
但是像这样将用户输入连接到您的查询显然是一件危险的事情。
如果要安全地创建这样的查询,可以使用白名单方法,在其中定义可以删除哪些表以及通过哪些键,并在运行删除之前检查用户输入。这是一个基本的例子:
$stmt = $pdo->prepare("DELETE FROM `$table` WHERE `$field` = :value");