php - 我想更新 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
解决方案
首先,正如 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(因此我也建议您也绑定您的更新语句)。
推荐阅读
- android - 用两个动画替换一个框架布局
- git - git:设置临时缓存文件夹以避免权限错误?
- list - prolog如何从列表中删除一个元素?
- android - Android 房间迁移 NonNull 原始类型
- django - 在 Django 中维护活动选项卡
- docker - 重命名 docker-compose 项目而不删除卷
- variables - Netlogo 中图形变量中的指数值
- html - 如何使用悬停弹出窗口
- java - RecyclerView 不显示来自 firebase 的数据
- python - Tornado PipeIOStream: OSError: [Errno 9] 错误的文件描述符