PHP MYSQL可重用删除查询

时间:2016-01-21 18:04:12

标签: php mysql

尝试创建一个删除函数,该函数将使用字段和值从任何表中删除。

问题是它不起作用,我没有从中得到任何错误,我可以添加东西到数据库但不删除它们。

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);
}

2 个答案:

答案 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");