PDO会知道mysql崩溃了吗?

时间:2013-01-10 09:18:10

标签: php mysql exception pdo

如果这是一个愚蠢的问题,请原谅我,但我处境艰难。

这样做:

$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设置不正确,所以db拒绝连接并且没有按原样运行查询,或者在至少其中一些。结果是,付款表中的付费标志未设置,付款一次又一次。

现在这个代码块跟在查询后面有一个 SUCCESS 消息(用于通信)我的想法是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]}";
}

1 个答案:

答案 0 :(得分:2)

它可能不是您要寻找的解决方案,但您应该随时检查您的代码。在这种情况下,如果记录存在,您希望返回成功...

$query = '...';
$stmt = $db->query($query);

if($stmt === false)
    // Query failed to execute

while($row = $db->fetch(PDO::FETCH_NUM))
{
    ...
}

$stmt = $db->query($query);
if($stmt === false)
    // Update failed

$stmt->closeCursor();
// NOW you can echo

http://php.net/manual/en/pdo.query.php (如果查询失败,PDO返回布尔值false)