如果这是一个愚蠢的问题,请原谅我,但我处境艰难。
做这个:
$query = "SELECT `av`.`UUID`, `pay`.`amount`, `pay`.`id`
FROM `2starsglobal`.`avatars` AS av
RIGHT JOIN `payments` AS `pay` ON `av`.`id` = `pay`.`avatarId`
WHERE `pay`.`payed` = 0 AND `pay`.`verificationPending` = 0
ORDER BY `pay`.`id` ASC
LIMIT 0, 14";
$stmt = $db->query($query);
echo 'SUCCESS';
$payments = "";
while($row = $stmt->fetch(PDO::FETCH_NUM))
{
$payments .= ",{$row[0]},{$row[1]},{$row[2]}";
//echo ',', $row[0],',', $row[1],',', $row[2];
$query = "UPDATE `payments` SET `verificationPending`=1 WHERE `id`={$row[2]}";
}
try
{
$db->query($query)->closeCursor();
}
catch(PDOException $e)
{
return;
}
echo $payments;
保证php会处理下面的情况吗?
我们有一个游戏支付系统,上次我们将其用于测试时,分配内存的 mysql 设置不正确,因此数据库拒绝连接并且没有按应有的方式运行查询,或者至少有一些他们。所以结果是,付款表中的已付款标志未设置,并且要一遍又一遍地进行付款。
现在上面的这段代码是查询和成功消息(用于通信)之后的内容,我的想法是如果 mysql 崩溃或失败,则不显示应该支付的款项。上面的块在所有情况下都有效吗?
希望我让自己清楚明白
编辑:
上面的代码主要是为了演示而编写的,它不是正确的代码,因为我注意到有点晚了。但这不应该打扰你,因为最初的问题是。如果PDO
将处理数据库崩溃和所有其他问题。
我的想法是针对每个成功更新的行,针对echo
特定的付款,这不是上面的代码所做的。很乱。
更多编辑
正如你会注意到的,我渴望得到一个关于我有多安全的答案。(我希望它有状态和事实,因为我安全或为什么不安全)所以这就是我可能会保留的代码,除非另有说明。我应该对此感到安全吗?
$query = "SELECT `av`.`UUID`, `pay`.`amount`, `pay`.`id`
FROM `2starsglobal`.`avatars` AS av
RIGHT JOIN `payments` AS `pay` ON `av`.`id` = `pay`.`avatarId`
WHERE `pay`.`payed` = 0 AND `pay`.`verificationPending` = 0
ORDER BY `pay`.`id` ASC
LIMIT 0, 14";
$stmt = $db->query($query);
$payments = $stmt->fetchAll();
$query = "UPDATE `payments` SET `verificationPending`=1 WHERE ";
foreach($payments as $payment)
{
$query .= "`id`={$payment[2]} AND ";
}
$query = substr($query, 0, strlen($query-5));
try
{
$db->beginTransaction();
$db->query($query)->closeCursor();
$db->commit();
}
catch(PDOException $e)
{
$db->rollBack();
return;
}
echo "SUCCESS";
foreach($payments as $payment)
{
echo ",{$payment[0]},{$payment[1]},{$payment[2]}";
}