【问题标题】:Using Arrays in a PDO UPDATE Prepared statement在 PDO UPDATE Prepared 语句中使用数组
【发布时间】:2014-04-01 18:11:23
【问题描述】:

我有这一系列的标题。

$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 数组分成“对”?

解决方案

以下是有效的 SQL 语句:

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

它很大程度上基于公认的答案,并进行了一些调整以使其正常工作!

【问题讨论】:

    标签: php sql pdo


    【解决方案1】:

    你想要一个看起来像这样的查询:

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

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

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

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

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

    【讨论】:

    • 感谢正确方向的指点!在查看了这可能如何工作之后,我认为 function($v) 和 array_keys 需要反过来吗?另外我想我想要 array_values($first) 而不是 array_keys($first) 所以返回名称而不是索引?
    • 我已将我使用的确切 SQL 查询发布到 OP,这在很大程度上取决于您的回答,这就是我接受的原因。感谢您的帮助,每次我发布问题时,我都会学习另一个函数 - 这次是 array_map。我真的不知道人们是怎么记住他们的!! :)
    • 是的,几周前我在另一个问题上了解到array_map :-)
    【解决方案2】:

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

    没有。

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

    中找到此类代码的示例

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2015-07-22
      • 1970-01-01
      • 2011-06-05
      • 2012-05-24
      • 2017-03-19
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多