PHP - 多个bind_params失败

时间:2017-04-04 21:24:24

标签: php mysql ajax

我正在尝试按下按钮时执行删除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非常,可能是一个简单的错误,或者只是我不知道的事情,在这种情况下,我会很好奇为什么表/列名称不能参数化,因为它一直在逃避我一段时间作为一种解决方法,是否可以使用某种形式的连接,以便能够从多个不同的位置将动态名称放入此查询中?

2 个答案:

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