【问题标题】:versatile insertion method for PDO classPDO 类的通用插入方法
【发布时间】:2013-07-17 08:28:35
【问题描述】:

这是我在 PDO 中的插入方法,它 100% 有效。这个“插入”方法接受表、列和值,但我想让它变得通用。 (我想插入带有或不带有列名的值)

public function insert($table, $pair = array()){
    try{
        $Sql = "INSERT INTO $table ( ";
        $Sql .= implode(", ", array_keys($pair));
        $Sql .= " )";
        $Sql .= " VALUES (";
        $Sql .= implode(", ", array_fill("0", count($pair), " ?"));
        $Sql .= " )";
        $array = array_combine(array_keys(array_fill("1", count($pair), ":")), $pair);
        $ready = $this->conn->prepare($Sql);
        foreach($array as $key => $value)
        {
            $ready->bindValue($key, $value, PDO::PARAM_STR);
        }
        $ready->execute();
    }
    catch(Exception $e){
        $this->trace .= " • ". $e->getMessage();  
    }
}


$new = new community();
echo $new->insert("table", array("Col1" => "value1", "col1" => "value1"));

【问题讨论】:

  • 每一个问题注册新账号有什么用?只是好奇。

标签: php mysql oop pdo prepared-statement


【解决方案1】:

你的函数有两个问题。

  1. 易受 SQL 注入攻击。
  2. 它不灵活。按照这种模式,你将拥有一千个这样的函数,这会使你的代码变得一团糟。然而,对于真正的 SQL,它总是有限子集。

您真正需要的是一个可以从数组和允许字段列表中创建 SET 语句的函数。
作为进一步的改进,您可以为此语句设计一个自定义 占位符

拥有这两件事,您可以制定出一个单一通用函数来运行所有 DML 查询,如下所示:

$db->query("INSERT INTO t SET %u", array("Col1" => "value1", "col1" => "value1"));

这将花费你 3 个额外的词(插入、进入和设置),但它会是

  • 可读。每个人都可以理解 SQL。虽然要阅读您的功能,但需要一份文档
  • 灵活。它可以支持任何查询和修饰符,而不仅仅是一个单一形式的插入。

您希望可以使用这个单一功能运行的每个查询:

$data = array("Col1" => "value1", "col1" => "value1");
$db->query("INSERT IGNORE INTO t SET %u", $data);
$db->query("REPLACE INTO t SET %u", $data);
$db->query("DELETE FROM t WHERE id = ?", $id);
// and so on

实际上不需要专门的功能。

此外,您必须始终对照硬编码的白名单验证一组字段,以让用户只插入他们允许的字段。不要让用户更改权限、消息计数等。

但即使没有自定义占位符,它也不需要一组 SQL 映射函数,而只需要一个创建 SET 的函数和一个通用查询执行函数:

$allowed = array("name","surname","email"); // allowed fields
$sql = "INSERT INTO users SET ".pdoSet($fields,$values);
$stm = $dbh->query($sql ,$values);

【讨论】:

  • 我已经编辑了我上面的代码,你认为它现在安全吗..我还通过点标记进行了一些验证;
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2013-12-04
  • 2012-06-27
  • 1970-01-01
相关资源
最近更新 更多