在PDO UPDATE准备语句中使用数组

时间:2014-04-01 18:11:24

标签: php sql pdo

我有这一系列的标题。

$first = array('title','first_name','surname','phone','email',
'add1','add2','add3','add4','add5');

这些都是数据库中的列标题,以及网页上不同表单项的名称。通过在$first中列出它们,我可以使用此数组链接到数据库以及使用以下代码在表单提交时创建的POST值。

$sql = "INSERT INTO first_page_data (" . implode(',',$first) . ") VALUES (" . implode(',', array_fill(0, count($first), '?')) . ")";
$stmt = $db->prepare($sql);
foreach($first as $key=>$val){
    $stmt->bindValue($key+1, $_POST[$val], PDO::PARAM_STR);

$stmt->execute();

此代码将使用$first数组创建有效的SQL查询(并且还将为未命名的占位符创建正确数量的问号)。然后它将遍历数组,将POST值绑定到正确的问号。

此代码没有任何问题,但我现在正在尝试将其调整为UPDATE查询而不是INSERT,这是我遇到绊脚石的地方:

INSERT查询有一个完整的数据库列标题列表,然后是它们的值的完整列表,而UPDATE需要它们的标题:值对(据我所知,无论如何! )。

是否有使用2个单独列表进行更新的方式(根据INSERT)或者我必须将$first数组和POST数组拆分为'对& #39;

解决方案

以下是有效的SQL语句:

$sql = "UPDATE first_page_data SET " . implode(", ", array_map(function($v){ return "$v=?"; }, array_values($combined))) . " WHERE email = ?";

它严重依赖于已接受的答案,并进行了一些调整以使其正常运行!

2 个答案:

答案 0 :(得分:2)

您想要一个类似于以下内容的查询:

UPDATE table SET title=?, first_name=?, ... WHERE id=?;

要构建SET表达式,您可以执行以下操作:

implode(", ", array_map(function($v){ return "$v=?"; }, array_keys($first)));

然后,您可以像在代码中一样添加参数。

请务必记住,WHERE子句的查询中有一个额外的参数,因此请务必添加该参数。参数的顺序很重要,因此请确保最后一个是WHERE条件。

答案 1 :(得分:1)

  

是否有使用2个单独列表进行更新的方法(根据INSERT)

没有

但是,如果您使用的是mysql,则可能会执行相反的操作。因此,您仍然可以使用单个过程进行插入和更新查询,两者都使用field = value格式。可以在tag wiki

中找到此类代码的示例