我想将交易 table 和 post 中的记录更新为已批准 table,同时将交易批准的状态从 0 更新为 1
I want to update a record from Transactions table and post it to Approved table whilst updating the status of the Transaction approval from 0 to 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>
approve.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'); ?>
交易和批准 table 类似,我的查询只是插入交易 table 中的数据,但没有将批准的列从 0 更新为 1批准 table
首先,正如 Magnus Eriksson 所提到的,您正在检查 $approve 是否本质上不是 false 或 null,因此,它将始终作为 true 通过,因为您将 $approve 设置为 SQL 查询(作为一个字符串)。我认为您的意思是检查是否如 Magnus 所述($运行)。其次,您的 INSERT INTO sql 语句语法不正确。语法应该是这样的:
INSERT INTO table ({column_name}, {another_column_name}) VALUES ({value}, {value});
您不需要在插入中使用 WHERE 子句,因为插入实际上会将记录附加到您的 table(并且不会检查条件是否为真利用它)并且 SELECT 语句无法以您尝试的方式嵌入到您的 INSERT 语句中(我不太确定您为什么要在那里尝试 SELECT 数据,所以我要假设您只是试图插入 transaction_id,因此,给您一个有效的 INSERT sql 语句来插入该数据——我稍后将在此处演示)。第三,您的 UPDATE 语句使用了一个 TRUE 值:请仔细检查该列的数据类型是否创建为布尔值,否则它不起作用(还要确保布尔数据类型甚至是可能的,因为我不相信 SQL 服务器或 MySQL 具有该数据类型——它们使用 BIT 或 TINYBIT,但我可能会弄错)。第四,我想指出您的代码的一个更大问题:它容易 SQL 注入。如果你在 mysqli_query() 上访问官方 PHP documentation,你会注意到一条红色的大警告消息,说明如果你正在插入参数(例如你的$transaction_id).怀有恶意的人可能会为您的 '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(因此我也建议您也绑定您的更新语句)。
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>
approve.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'); ?>
交易和批准 table 类似,我的查询只是插入交易 table 中的数据,但没有将批准的列从 0 更新为 1批准 table
首先,正如 Magnus Eriksson 所提到的,您正在检查 $approve 是否本质上不是 false 或 null,因此,它将始终作为 true 通过,因为您将 $approve 设置为 SQL 查询(作为一个字符串)。我认为您的意思是检查是否如 Magnus 所述($运行)。其次,您的 INSERT INTO sql 语句语法不正确。语法应该是这样的:
INSERT INTO table ({column_name}, {another_column_name}) VALUES ({value}, {value});
您不需要在插入中使用 WHERE 子句,因为插入实际上会将记录附加到您的 table(并且不会检查条件是否为真利用它)并且 SELECT 语句无法以您尝试的方式嵌入到您的 INSERT 语句中(我不太确定您为什么要在那里尝试 SELECT 数据,所以我要假设您只是试图插入 transaction_id,因此,给您一个有效的 INSERT sql 语句来插入该数据——我稍后将在此处演示)。第三,您的 UPDATE 语句使用了一个 TRUE 值:请仔细检查该列的数据类型是否创建为布尔值,否则它不起作用(还要确保布尔数据类型甚至是可能的,因为我不相信 SQL 服务器或 MySQL 具有该数据类型——它们使用 BIT 或 TINYBIT,但我可能会弄错)。第四,我想指出您的代码的一个更大问题:它容易 SQL 注入。如果你在 mysqli_query() 上访问官方 PHP documentation,你会注意到一条红色的大警告消息,说明如果你正在插入参数(例如你的$transaction_id).怀有恶意的人可能会为您的 '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(因此我也建议您也绑定您的更新语句)。