我将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']));
此代码工作正常,但它似乎有点过分(特别是随着越来越多的列被添加)。
答案 0 :(得分:13)
我会这样做:
首先声明列。我们将使用它们来提取$ _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));
}