【问题标题】:PHP / SQL: Update Table C if meet condition after updated in Table A and Table BPHP / SQL:如果在表A和表B中更新后满足条件,则更新表C
【发布时间】:2020-06-25 07:42:33
【问题描述】:

我当前的代码有一些问题。例如,在 PHP 页面上,有一个表格显示所有借用用户的工具。在该表中,每个数据行都包含一个复选框。用户可以通过勾选复选框并按“返回”按钮来选择他们想要返回的任何工具。

在服务器端,点击“返回”按钮后,会跳转到名为return_selected.php的页面。在这个页面会更新Table A和Table B,这个成功了。

现在,如果所有条件都存在,我想更新表 C,例如,返回所有工具。这个我仍然做,但失败了。下面是代码

return_selected.php

<?php

    include("../../../../config/configPDO.php");
    include("../../../../config/check.php");

    $tools_id = $_POST['tools_id'];
    $borrow_id = $_POST['borrow_id'];

    $checkbox=explode( ',', $_POST['ids'][0] );

    for($i=0;$i < count($checkbox); $i++){
        $tools_id=$checkbox[$i];

        $sql="UPDATE ets_tools SET borrow_id = NULL WHERE tools_id=:tools_id";
        $query=$conn->prepare($sql);
        $query->execute(array(':tools_id' => $tools_id));

        $sql2="UPDATE ets_tools_borrow SET time_to = GETDATE() WHERE tools_id=:tools_id";
        $query3=$conn->prepare($sql2);
        $query3->execute(array(':tools_id' => $tools_id));

        // want to update table if all tools returned.

        $query2 = "
           SELECT 
              ets_tools.tools_id, ets_tools.tools_name, ets_tools.borrow_id,
              ets_borrow.time_from, ets_borrow.time_to, ets_borrow.status_id
           FROM ets_tools 
           INNER JOIN ets_borrow ON ets_tools.borrow_id = ets_borrow.borrow_id
           WHERE ets_tools.borrow_id IS NOT NULL AND ets_borrow.borrow_id = :borrow_id
        ";

        $sql2=$conn->prepare($query2);
        $sql2->execute(array(':borrow_id' => $borrow_id));

        if($sql2->rowCount() > 0)
        {

            header("Location: return.php");

        }else{

            $sql3="UPDATE ets_borrow SET time_to  = GETDATE(), status_id = 2 WHERE borrow_id=:borrow_id";
            $query3=$conn->prepare($sql3);
            $query3->execute(array(':borrow_id' => $borrow_id));

            header("Location: return.php");

        }

    }

?>

谁能知道如何解决这个问题?谢谢。

【问题讨论】:

    标签: php sql sql-server pdo


    【解决方案1】:

    您需要考虑以下几点:

    • 正如documentation 中提到的,PDOStatement::rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETEINSERTUPDATE 语句影响的行数对于大多数数据库,从SELECT 语句返回的行数没有正确返回。因此,您可以使用SELECT COUNT(*) ... 方法来获取此计数。
    • 对于您的具体情况,您可以尝试使用UPDATE ... WHERE NOT EXISTS ... 语句来更新ets_borrow 表中的行并跳过此SELECT ... FROM ... INNER JOIN ... 语句。
    • 我不确定我是否正确理解header("Location: return.php");for 循环中的使用,可能您需要在此循环之后重定向。

    示例,基于您的代码:

    <?php
    
        include("../../../../config/configPDO.php");
        include("../../../../config/check.php");
    
        $tools_id = $_POST['tools_id'];
        $borrow_id = $_POST['borrow_id'];
    
        $checkbox=explode( ',', $_POST['ids'][0] );
    
        for($i=0; $i < count($checkbox); $i++) {
            $tools_id=$checkbox[$i];
    
            $sql = "UPDATE ets_tools SET borrow_id = NULL WHERE tools_id = :tools_id";
            $query = $conn->prepare($sql);
            $query->execute(array(':tools_id' => $tools_id));
    
            $sql2 = "UPDATE ets_tools_borrow SET time_to = GETDATE() WHERE tools_id = :tools_id";
            $query2 = $conn->prepare($sql2);
            $query2->execute(array(':tools_id' => $tools_id));
    
            $sql3 = "
                UPDATE ets_borrow 
                SET time_to = GETDATE(), status_id = 2 
                WHERE 
                    (borrow_id = :borrow_id1) AND
                    NOT EXISTS (
                        SELECT 1
                        FROM ets_tools 
                        INNER JOIN ets_borrow ON ets_tools.borrow_id = ets_borrow.borrow_id
                        WHERE ets_tools.borrow_id IS NOT NULL AND ets_borrow.borrow_id = :borrow_id2
                    )
                ";
            $borrow_id1 = $borrow_id;
            $borrow_id2 = $borrow_id;
            $query3 = $conn->prepare($sql3);
            $query3->execute(array(':borrow_id1' => $borrow_id1, ':borrow_id2' => $borrow_id2));
        }
        
        header("Location: return.php");
        
    ?>
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2023-03-29
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多