我正在尝试按下按钮时执行删除SQL语句,如果我绑定了1个参数,这是有效的,但我想使delete.php通用,因为不要将多个只用于引用不同的表:< / p>
<?php
include "header.php";
include "db.php";
$_POST['table'] = "customer";
$_POST['column'] = "cID";
$_POST['del_id'] = 26;
if(isset($_POST['del_id']))
{
if ($stmt = $conn->prepare("DELETE FROM customer WHERE ? = ?"))
{
$stmt->bind_param('si', $_POST['column'], $_POST['del_id']);
$stmt->execute();
}
else echo("Oops");
}
此绑定执行但不对表执行任何操作,仅绑定最终值'del_id',正确执行,并绑定3个参数(包括表名),只会导致prepare()失败。
我在AJAX POSTs的其他地方设置_POST变量,上面只是测试这个位是否有效。在此之前我还没有完成验证。
非常PHP非常,可能是一个简单的错误,或者只是我不知道的事情,在这种情况下,我会很好奇为什么表/列名称不能参数化,因为它一直在逃避我一段时间作为一种解决方法,是否可以使用某种形式的连接,以便能够从多个不同的位置将动态名称放入此查询中?
答案 0 :(得分:0)
是的,要实现这一目标,您需要为准备好的声明提供连接和参数的组合:
if ($stmt = $conn->prepare("DELETE FROM " . $_POST['table'] . " WHERE " . $_POST['column'] . " = ?"))
{
$stmt->bind_param('si', $_POST['del_id']);
$stmt->execute();
}
请务必注意表和列名称上需要的其他验证。这应该针对您的数据模型进行验证,而不仅仅是确保其有效的标识符。进一步,看看一些ORM / Query Builders来学习如何详细说明这个想法。这是一次很好的学习练习。
答案 1 :(得分:0)
在运行删除之前,您应该验证表名和列名。
由于您无法准备表名或列名,因此请在准备之前将它们放在sql语句中。
<?php
include "header.php";
include "db.php";
$_POST['table'] = "customer";
$_POST['column'] = "cID";
$_POST['del_id'] = 26;
// Add code to prevent SQL injection
$table = $_POST['table'] == 'customer' ? $_POST['table'] : '';
$column = $_POST['column'] == 'customer' ? $_POST['column'] : '';
if(isset($_POST['del_id']) && $table != '' && $column != '') {
if ($stmt = $conn->prepare("DELETE FROM `".$table."` WHERE `".$column."` = ?"))
{
$stmt->bind_param('i', $_POST['del_id']);
$stmt->execute();
}
else echo("Oops");
}