我有这一系列的标题。
$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 = ?";
它严重依赖于已接受的答案,并进行了一些调整以使其正常运行!
答案 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
中找到此类代码的示例