小编典典

在PDO UPDATE Prepared语句中使用数组

sql

我有这一系列的标题。

$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查询具有数据库列标题的完整列表,然后是它们的值的完整列表,而UPDATEtitle:value对则需要它们(据我所知!)。

有没有一种方法可以使用2个单独的列表进行更新(按照INSERT),或者我必须将$first数组和POST数组拆分为“对”?

解决方案

以下是有效的SQL语句:

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

它很大程度上基于已接受的答案,并进行了一些调整才能使其正常工作!


阅读 249

收藏
2021-04-22

共1个答案

小编典典

您需要一个看起来像这样的查询:

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

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

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

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

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

2021-04-22