【问题标题】:Will PDO know if mysql crashed?PDO 会知道 mysql 是否崩溃?
【发布时间】:2012-12-24 15:07:34
【问题描述】:

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

这样做:

$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 设置不正确,因此数据库拒绝连接并且没有按应有的方式运行查询,或者在至少其中一些。所以结果是,付款表中的已付款标志未设置,并且要一遍又一遍地付款。

现在上面的这段代码是查询之后的内容和 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]}";
}

【问题讨论】:

  • 不直接回答您的问题,但您还应该考虑如果 PHP 崩溃(例如内存不足)会发生什么。以我的经验,这比 MySql 崩溃要常见得多。在这种情况下,事务会有所帮助。
  • 我认为您应该在这里考虑使用事务。通常,如果关键查询依赖于先前的查询,最好使用事务,这样如果失败,所有内容都会回滚,并且您的数据库不会错位。
  • 是的,事务是一个很好的解决方案。
  • 您还应该测试您的查询是否真的会影响任何事情,并确保它们不会影响太多。使用事务,然后在出现错误时出错并回滚。
  • @GarethL 似乎交易正在获胜。我认为这就是我要走的路。但还是。是 100% 还是至少 98 呵呵,会按应有的处理?

标签: php mysql exception pdo


【解决方案1】:

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

$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 会返回 boolean false)

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 2014-01-09
    • 2015-03-10
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多