为PDO类通用的插入方法(versatile insertion method for PDO cl

2019-11-02 07:18发布

这是我的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"));

Answer 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映射功能,但只是一个函数来创建一组和通用查询执行功能:

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


文章来源: versatile insertion method for PDO class