首页 > 解决方案 > 我想更新 Transactions 表中的记录并将其发布到 Approved 表,同时将 Transaction 批准的状态从 0 更新为 1

问题描述

pending_approvals.php

<table id="example" class="display" style="width:100%">
    <thead>
      <tr>
        <th>Transaction ID</th>
        <th>Agent Email</th>
        <th>Sender</th>
        <th>Receiver</th>
        <th>Amount</th>
        <th>Actions</th>
      </tr>
    </thead>
    <tbody>
      <?php
          $trans = "SELECT * FROM transactions";
          $get_trans = mysqli_query($db, $trans);
          while($row = mysqli_fetch_array($get_trans)){?>
          <tr>
             <td><?php echo $row['transaction_id']; ?></td>
             <td><?php echo $row['agent_email'] ;?></td>
             <td><?php echo $row['sender']; ?></td>
             <td><?php echo $row['receiver']; ?></td>
             <td><?php echo $row['amount']; ?></td>
             <td>
               <a class="btn btn-success ti-eye" href="view_transaction.php?transaction_id=<?php echo $row['transaction_id']; ?>"></a>
               <a class="btn btn-info" href="approve.php?transaction_id=<?php echo $row['transaction_id']; ?>"
               onclick="return confirm('Are you sure you would like to confirm this transaction ?');"> Approve</a>
             </td>
          </tr>
      <?php } ?>
   </tbody>
</table>

批准.php

<?php 
include('config.php');
include_once('_header.php');

    $transaction_id = $_GET['transaction_id'];
    $approve = "INSERT INTO approvals SELECT * FROM transactions WHERE transaction_id = '$transaction_id'";
    $run = mysqli_query($db, $approve);
    if($approve){
        $approved = "UPDATE approvals SET approved = TRUE WHERE transaction_id = '$transaction_id'";
        $run = mysqli_query($db, $approve);
    }
?>

<?php include_once('_footer.php'); ?>

交易和批准表是相似的,我的查询只是从交易表中插入数据,但没有将批准表中的批准列从 0 更新为 1

标签: phpmysqlisql-updatemysql-insert-id

解决方案


首先,正如 Magnus Eriksson 所提到的,您正在检查 $approve 是否本质上不是 false 或 null,因此,它将始终作为 true 传递,因为您将 $approve 设置为 SQL 查询(作为字符串)。正如 Magnus 所提到的,我认为您的意思是检查 if ($run)。其次,您的 INSERT INTO sql 语句语法不正确。语法应该是这样的:

INSERT INTO table ({column_name}, {another_column_name}) VALUES ({value}, {value});

您不需要在插入中使用 WHERE 子句,因为插入实际上会将记录附加到您的表中(并且在您如何使用它的情况下不会检查条件是否为真)并且 SELECT 语句不能以您尝试执行的方式嵌入到您的 INSERT 语句中(我不太确定您为什么要在那里尝试 SELECT 数据,所以我假设您只是尝试插入 transaction_id,因此,给您一个有效的INSERT 插入该数据的 sql 语句——我将在这里稍作演示)。第三,您的 UPDATE 语句使用 TRUE 值:请仔细检查该列的数据类型是否创建为布尔值,否则这不应该工作(还要确保布尔数据类型甚至可能,因为我不这样做' 不相信 SQL Server 或 MySQL 具有那种数据类型——它们使用 BIT 或 TINYBIT,但我可能会弄错)。第四,我想指出你的代码的一个更大的问题:它很容易发生 SQL 注入。如果你去官方关于 mysqli_query() 的PHP 文档,您会注意到一条红色的大警告消息,说明如果您正在插入参数(例如 $transaction_id),则不应使用 mysqli_query()。有恶意的人可能会为您的“transaction_id”GET 参数发送恶意值并成功地 SQL 注入内容。要解决此问题,我建议您对参数进行数据绑定,如下所示:

    // Make a connection to the DB:
    $conn = new mysqli($db_server_name, $db_username, $db_pswd, $db_name);

    // Check if connection was successful:    
    if ($conn->connect_error){
         die("Connection failed");
    }

    $sql = "INSERT INTO approvals SELECT * FROM transactions WHERE transaction_id = ?;";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('s', $transaction_id);
    $stmt->execute();

    // See if it inserted successfully:
    if ($stmt->affected_rows > 0){
        // Success!
    } else {
        // Failed... ):
    }
    
    // Close connections:
    $stmt->close();
    $conn->close();

使用 bind_param() 绑定您的参数可确保它们被视为字符串,因此永远不会被视为 SQL(因此我也建议您也绑定您的更新语句)。


推荐阅读