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