PHP PDO 使用 IF 更新变量字段

标签 php mysql variables pdo field

我有一个函数可以更新 mysql 表中最多 3 个字段。该函数可以接收所有 3 个要更新的字段,或者仅接收 1 或 2 个字段

现在我正在这样做(它有效)来构造MySQL语句。

if ($foo1){
   $mysql_set = '`foo1` = :foo1';}
if ($foo2){
   if ($mysql_set){$mysql_set .= ', ';}
   $mysql_set .= '`foo2` = :foo2';}
if ($foo3){
   if ($mysql_set){$mysql_set .= ', ';}
   $mysql_set .= '`foo3` = :foo3';}

$update = $db->prepare("UPDATE `bar` SET $mysql_set WHERE `id` = :id");

if ($foo1){
   $update->bindValue(':foo1', $foo1, PDO::PARAM_STR);}
if ($foo2){
   $update->bindValue(':foo2', $foo2, PDO::PARAM_STR);}
if ($foo3){
   $update->bindValue(':foo3', $foo3, PDO::PARAM_STR);}
$update->bindValue(':id', $id, PDO::PARAM_INT);
$update->execute();

如您所见,我重复“if ($foo1 - $foo3){}”两次来构造此 MySQL 查询。它看起来很多余,想知道是否有更好的方法来处理这种情况。

最佳答案

您可以为 execute() 提供一个关联数组,而不是为每个参数单独调用 bindValue()

$param_array = array(':id' => $id);
$set_array = array();
if ($foo1) {
    $param_array[':foo1'] = $foo1;
    $set_array[] = "foo1 = :foo1";
}
if ($foo2) {
    $param_array[':foo2'] = $foo2;
    $set_array[] = "foo2 = :foo2";
}
if ($foo3) {
    $param_array[':foo3'] = $foo3;
    $set_array[] = "foo3 = :foo3";
}
if (!empty($set_array)) {
    $set_string = implode(", ", $set_array);
    $sql = "UPDATE bar SET $set_string WHERE id = :id";
    $update = $db->prepare($sql);
    $update->execute($param_array);
}

关于PHP PDO 使用 IF 更新变量字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356194/

相关文章:

php - 数据不进入数据库

php - 分析有关非转义查询等的 PHP 代码

具有序列 1,2,3 的 MySQL 更新值,

mysql - sqlite语法问题

json - 如何在密码中创建具有可变标签的节点?

php - 如何将许多(超过 100 个)变量传递给 PHP

php - Yii2 Rest api - Url 管理器添加参数

php - 谷歌通讯录 API : RetrivePhoto query failed - invalid contact ID

MySQL 无法选择特定字段值?

variables - Node.js 模块变量是否在多个调用之间共享?