我正在尝试基于在laracast上的Jeffery的INSERT查询在PHP中编写可重用的UPDATE查询

这是杰夫的插入查询

public function insert($table, $parameters)
{
$sql = sprintf(
        'INSERT INTO %s (%s) VALUES (%s)',
        $table,
        implode(', ', array_keys($parameters)),
        ':' . implode(', :', array_keys($parameters))

    );
    try {
        $statement = $this->pdo->prepare($sql);
        $statement->execute($parameters);
    } catch (Exception $exception) {
        die("Something Went Wrong");
    }
}


这是我尝试编写的更新代码

public function update($table, $parameters, $Condition)
{
    $sql = sprintf(
        'UPDATE %s SET %s=%s WHERE ' . $Condition,
        $table,
        implode('=,', array_keys($parameters))
        ,
        ':' . implode(', :', array_keys($parameters))

    );


    try {
        $statement = $this->pdo->prepare($sql);
        $statement->execute($parameters);
    } catch (Exception $exception) {
        die("Something Went Wrong");
    }

}


我想通过仅将数据传递给它,使其与插入查询一样可重用。

高度重视所有帮助

最佳答案

这真是个坏主意。不要这样

相反,我建议为您的实体创建自定义data mappers,其中将包含带有适当绑定的参数/值的手工SQL。

但是作为实验,这是我想出的:

public function update($table, $parameters, $conditions)
{
    $sql = sprintf(
        'UPDATE %s SET %s WHERE %s',
        $table,
        implode(', ',array_map(
            function ($key) {
                return "{$key} = :s_{$key}";
            },
            array_keys($parameters)
        )),
        implode(' AND ',array_map(
            function ($key) {
                return "{$key} = :w_{$key}";
            },
            array_keys($conditions)
        ))
    );

    $parameters = array_combine(
        array_map(function($key){ return ":s_{$key}"; }, array_keys($parameters)),
        $parameters
    ) + array_combine(
        array_map(function($key){ return ":w_{$key}"; }, array_keys($conditions)),
        $conditions
    );

    try {
        $statement = $this->pdo->prepare($sql);
        $statement->execute($parameters);
    } catch (Exception $exception) {
        die("Something Went Wrong");
    }

}


请记住,如果您的“用户”可以某种方式影响$parameters$conditions数组的键,那么此代码将容易受到SQL注入攻击。


  附言
  在原始示例中,您已将$Condition参数简单地连接到查询的末尾。这将带来SQL注入攻击的巨大风险。

10-08 05:30
查看更多