【问题标题】:PDO Insert Array Using Key As Column NamePDO 使用键作为列名插入数组
【发布时间】:2012-11-12 18:26:15
【问题描述】:

我将 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']));

此代码有效,但似乎有点过头了(尤其是添加了越来越多的列时)。

【问题讨论】:

标签: php mysql sql pdo


【解决方案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));
}

【讨论】:

  • 使用array_intersect_key 来“最小化”$_POST 数组有什么好处?
  • @Blazemonger,以确保用户无法欺骗 POST 参数并破坏您的应用程序。
  • 我有同样的问题,但我在一个类中工作并且值不是从 $_POST 它作为参数得到的,知道吗?请。
  • @MasoudMustamandi,你不能用函数参数代替 $_POST 数组吗?
  • 不,我做了这样的事情,现在它可以工作了 $param_values = array_combine($columns, $values);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多