我有这一系列的标题。
$first = array('title','first_name','surname','phone','email', 'add1','add2','add3','add4','add5');
这些既是数据库中的列标题,又是网页上不同表单项的名称。通过在其中列出它们,$first我可以使用以下数组使用此数组链接到数据库以及POST在表单提交时创建的值。
$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,这是我遇到绊脚石的地方:
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 = ?";
它很大程度上基于已接受的答案,并进行了一些调整才能使其正常工作!
您需要一个看起来像这样的查询:
UPDATE table SET title=?, first_name=?, ... WHERE id=?;
要构建SET表达式,您可以执行以下操作:
SET
implode(", ", array_map(function($v){ return "$v=?"; }, array_keys($first)));
然后,您可以像在代码中一样添加参数。
重要的是要记住,该WHERE子句的查询中还有一个额外的参数,因此请确保也添加该参数。参数的顺序很重要,因此请确保最后一个是您的WHERE条件。
WHERE