php - 当绑定(bind)变量的数量是动态的时,解决绑定(bind)变量和标记之间的不平等问题。 (PDO/PHP MySQL)

标签 php mysql sql database pdo

上下文:

我正在尝试使用通常的 UPDATE 语法,通过将 token 绑定(bind)到数据的 PDO 方法,用一组值更新 MySQL 数据库中的记录。

问题:

要更新的字段数是动态的,并根据已发布到页面的数据进行调整。使用 if(isset($_POST[])) 过滤掉对可能已经有数据但我不想被空数据覆盖的字段的更新。

这意味着我创建的 token 数量不同,但我将数据绑定(bind)到 token 的语法是静态的,我不确定如何调整它。

这当然会导致:SQLSTATE[HY093]:参数编号无效:绑定(bind)变量的数量与标记的数量不匹配

我的代码:

请注意 $data 是我数据库中所有列名的数组。它也是可以发布的变量的名称属性集,这样 $_POST[x] 应该更新到给定记录中的列 x,并且 x 是 $data 的成员。

$sql_b =    "UPDATE `temp_data` SET ";  
            foreach($data as $value)
            {
            if(isset($_POST[$value]))
            $sql_b .="$value = :$value, ";
            }

            $sql_b = rtrim($sql_b,', ');    
            $sql_b .=" WHERE UID = '$uid'";

try     
{
$pdo = new PDO('mysql:host=localhost; dbname=db01', $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
$stmt = $pdo->prepare($sql_b);

foreach($data as $value)
{
$stmt->bindParam(":$value", $_POST[$value]);
}

$stmt->bindParam(":sv_215_hidden", $_POST[sv_215_hidden]);
$stmt->bindParam(":sv_216_hidden", $_POST[sv_216_hidden]);

$stmt->execute();       

# 受影响的行? echo $stmt->rowCount();//1 } catch (PDOException $e){ echo “错误:”。 $e->getMessage();

要突出显示此问题的区域:

这段代码:

foreach($data as $value)
            {
            if(isset($_POST[$value]))
            $sql_b .="$value = :$value, ";
            }

创建可能的 UPDATE 请求的子集

这段代码在哪里:

foreach($data as $value)
{
$stmt->bindParam(":$value", $_POST[$value]);
}

始终在所有可能的标记之间创建一整套绑定(bind)。

中心问题:

如何调整绑定(bind)的数量以仅匹配正在更新的字段?

最佳答案

你已经在那里了;您正在检查生成 SQL 语句时设置了哪些字段:

foreach($data as $value)
        {
        if(isset($_POST[$value]))
        $sql_b .="$value = :$value, ";
        }

因此您可以在调用 bindParam() 时使用完全相同的逻辑:

foreach($data as $value)
        {
        if(isset($_POST[$value]))
        $stmt->bindParam(":$value", $_POST[$value]);
        }

关于php - 当绑定(bind)变量的数量是动态的时,解决绑定(bind)变量和标记之间的不平等问题。 (PDO/PHP MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572992/

相关文章:

php - 无法在 Silex 应用程序中找到 Controller

php - 在 EntityRepository 中获取 Symfony 容器

javascript - pdftron webviewer - 如何使用 php 将整个编辑后的 ​​pdf 保存到服务器

php - html 数据到数组以进行 mySQL 插入

php - sql中的事件通知错误

java - 如何允许多个用户同时连接到我的 H2 数据库?

php - jp图 : how set label for group bar column chart in php

mysql - 如何从数据库表中获取值作为数组并将其返回到下拉列表中?

php - 如何从一个表中获取所有值,该表将自身作为同一个表中的另一个值邻居字段包含在内?

php - 检查数组值是否存在于 mysql 表中