【问题标题】:PHP PDO Update multiple rows I just can't work it outPHP PDO 更新多行我无法解决
【发布时间】:2015-11-16 01:19:17
【问题描述】:

大家好,我正在尝试使用 PDO 方法通过 PHP 更新我的数据库,我的脚本连接到我的数据库并根据设置的 clientID 选择所需的所有数据,然后计算出今天日期和创建日期之间的差异.

然后它继续根据年龄(1 到 6 之间的数字)为每个结果分配一个权重

我需要它做的是用新的权重更新数据库中clientID相同的所有记录。

这就是我出错的地方所有工作都很好,直到这一点!我的 UPDATE 语句只更新最后一个(最高)ID(如果有多个记录返回相同的 clientID)

$hostdb = '';
$namedb = '';
$userdb = '';
$passdb = '';
try{
    $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
    $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8
    $sql = "UPDATE parked SET weight = :weight  
            WHERE ID = :ID";
$stmt = $conn->prepare($sql);                                  
$stmt->bindParam(':ID', $ID, PDO::PARAM_INT); 
$stmt->bindParam(':weight', $weight, PDO::PARAM_INT);  


$stmt->execute(); 
$conn = null;        // Disconnect
}

catch(PDOException $e) {
  echo $e->getMessage();
}

?>

由于我之前从未一次更新过一条以上的记录,而且通常是通过 $_POST 而不是脚本本身,我真的很挣扎。

数据库映像

注意事项: 我没有收到任何错误消息!

【问题讨论】:

  • 这是很多代码和很多细节,大部分是不必要的。如果你把它归结为一个简单的例子,你会得到更好的帮助。见:How to create a Minimal, Complete, and Verifiable example.
  • 另外,如果您想在单个语句中更新具有不同值的多行,您正在寻找CASE ... WHEN ... 语法。
  • 为了方便调试,因为您的问题没有更新,请尝试回显您的更新语句并在您的 SQL 上运行它
  • @mike1992 问题下方有一个edit 链接。
  • 为了避免 SQL 注入,请为此使用准备好的语句: $sql = $conn->query("SELECT * FROM parked WHERE clientID = $clientID");

标签: php sql mysqli pdo


【解决方案1】:

您的更新查询仅更新一条记录,因为您只传递了一条记录,即前一个 select 语句中的最后一条。要传递多条记录,您需要创建一个$weight[] 数组,计算 select 语句的每一行,将值推送到数组中,然后通过更新查询迭代循环每个项目。

但是,您在 PHP 中所做的一切都可以在 MySQL Update SQL 查询中完成,因为 MySQL 带有 DateDiff() 和 Now() 函数,以及嵌套的逻辑 CASE/WHEN 语句(实际上,甚至是 IF/THEN)。因此,您只需连接一次即可运行操作查询:

try{
    $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
    $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8
    $sql = "UPDATE parked 
            SET weight =
              CASE 
                WHEN DATEDIFF(NOW(), datecreated) <= 21 THEN 1 
                WHEN DATEDIFF(NOW(), datecreated) >= 22 AND DATEDIFF(NOW(), datecreated) < 42 THEN 2 
                WHEN DATEDIFF(NOW(), datecreated) >= 43 AND DATEDIFF(NOW(), datecreated) < 63 THEN 3 
                WHEN DATEDIFF(NOW(), datecreated) >= 63 AND DATEDIFF(NOW(), datecreated) < 84 THEN 4 
                WHEN DATEDIFF(NOW(), datecreated) >= 84 AND DATEDIFF(NOW(), datecreated) < 105 THEN 5 
                WHEN DATEDIFF(NOW(), datecreated) >= 105 THEN 6 
              END;";
    $stmt = $conn->execute($sql);                                         
    $conn = null;  
}

 catch(PDOException $e) {
    echo $e->getMessage();
}

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多