小编典典

使用键作为列名的PDO插入阵列

sql

我将我的PHP数组的$
_POST内容插入到具有PDO的表中。我正在看下面的代码行,而其中之一就是“必须有更好的方法来做到这一点”。如果键名与表中的列名匹配,是否有更简单的方法来插入所有键?

代码例如:

$statement = $db->prepare("INSERT INTO `applications`(`username`, `email`, `password`, `name`) VALUES (?,?,?,?)");

$statement->execute(array($_POST['username'], $_POST['email'],$_POST['password'],$_POST['name']));

这段代码很有效,但似乎有点多余(尤其是随着越来越多的列添加)。


阅读 276

收藏
2021-03-17

共1个答案

小编典典

我会这样:

首先声明列。我们将使用它们来提取$ _POST的子集以用作列。否则,用户可能会传递与表的任何列都不匹配的虚假请求参数,这会破坏我们的SQL。

$columns = array('username','email','password','name');
$column_list = join(',', $columns);

创建命名参数占位符,即:username

$param_list = join(',', array_map(function($col) { return ":$col"; }, $columns));

单独形成SQL,因为如果它在自己的变量中,则更易于阅读和调试。

$sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)";

始终 检查prepare()和返回的错误状态execute()

$statement = $db->prepare($sql);
if ($statement === false) {
  die(print_r($db->errorInfo(), true));
}

在这里,我们 采用与要插入的列匹配的$ _POST字段。

$param_values = array_intersect_key($_POST, array_flip($columns));

并将该数组传递给execute()。再次检查错误返回状态。

$status = $statement->execute($param_values);
if ($status === false) {
  die(print_r($statement->errorInfo(), true));
}
2021-03-17