gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:37:44 25 4
gpt4 key购买 nike

上下文:

我正在尝试使用通常的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com