将所有发布数据插入MySQL数据库

时间:2013-07-01 18:49:10

标签: php mysql pdo mysqli prepared-statement

以下主题与我想要提出的内容很接近,但考虑到现在在php中不推荐使用mysql函数并且有预防语句注入的预备语句,它已经过时了。 insert all $_POST data into mysql using PHP?

基本上,我的数据库中有大量列,当我提交此表单时,所有列都需要填写。表单使用相同名称的输入字段匹配每个列(输入字段上的name属性与其所属的列名称相同。因此$_POST['firstName']位于firstName列中,因此上)。

有没有办法使用mysqli或PDO我可以轻松地获取所有的POST数据并自动将其插入MySQL表而无需手动遍历每个字段?我可以使用准备好的语句对它们进行全部编码,但是有很多列,如果可能的话,我希望一次完成它们。

这是我不想完成的长版本的开始。

$stmt = $connection->prepare("INSERT INTO area_retreat 
(user,firstName,lastName,...etc) 
VALUES 
(?,?,?,...etc)
ON DUPLICATE KEY UPDATE 
user=VALUES(user),
firstName=VALUES(firstName),
lastName=VALUES(lastName),
...etc
");
$stmt->bind_param("sss",
    $username,
    $_POST['firstName'],
    $_POST['lastName']
 );

$stmt->execute();

2 个答案:

答案 0 :(得分:1)

INSERT INTO area_retreat VALUES (?, ?, ...) - 但是,您必须匹配数据库中显示的所有列。

如果您有自动增量ID,则需要按正确的列顺序为该列提供NULL。

答案 1 :(得分:0)

为避免错误,您肯定需要以某种方式存储变量列表。它可以像数组一样简单:

$fields = array('firstName', etc.);

然后,您可以循环遍历数组以动态生成sql语句,并使用命名占位符而不是问号,您只需将它们绑定一次。您还可以将值存储在数组中,并将该数组作为参数发送到execute()

// start of query
$values = array();
$query = '...';
foreach ($fields as $field)
{
  if (isset($_POST[$field]))
  {
    // add to query
    $query .= "...";
    // add value to array so that you can feed the array to `execute`
    $values[':' . $field] = $_POST[$field];
  }
}
// add end of query
$query .= '...';

$stmt->execute($values);

如果要在ON DUPLICATE KEY UPDATE部分中使用相同的变量,可以执行另一个循环或构建一个插入部分,在循环一次后可以使用两次。