gpt4 book ai didi

php - PDO 类的通用插入方法

转载 作者:行者123 更新时间:2023-11-29 13:43:58 25 4
gpt4 key购买 nike

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

最佳答案

您的函数有两个问题。

  1. 它容易受到 SQL 注入(inject)攻击。
  2. 它不灵活。按照这种模式,您将拥有上千个此类函数,这将使您的代码变得困惑。然而,它始终是实际 SQL 的有限子集。

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

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

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

这将花费你 3 个额外的单词(insert、to 和 set),但它会是

  • 可读。每个人都可以理解 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);

关于php - PDO 类的通用插入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17694816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com