首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO会知道mysql是否崩溃吗?

PDO会知道mysql是否崩溃吗?
EN

Stack Overflow用户
提问于 2013-01-10 09:18:10
回答 1查看 161关注 0票数 4

如果这是个愚蠢的问题,请原谅我,但我现在处境很困难。

这是:

代码语言:javascript
复制
$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拒绝连接,没有按它应该运行的方式运行查询,或者至少运行其中的一些查询。因此,结果是,支付表中的付费标志没有被设置,而支付需要一次又一次地进行。

现在,这段代码后面是查询和成功消息(用于通信),我的想法是,如果mysql崩溃或失败,就不会显示应该支付的款项。在所有情况下,上面的部分都会起作用吗?

希望我把自己说清楚了

编辑:上面的代码主要是为了演示而编写的,这是不正确的代码,因为我注意到有点晚了。但这不应该困扰你因为最初的问题是。如果PDO将处理db崩溃和所有其他问题。

我的想法是,对于每个成功更新的行,对echo进行特定的支付,而这不是上面代码所做的。搞砸了。

更多地编辑

你会注意到,我渴望得到一个关于我有多安全的答案(我希望它会有状态和事实,因为我为什么安全或者为什么不安全)所以在这里,我可能会保留作为我的代码,除非告诉其他明智的。我应该觉得安全吗?

代码语言:javascript
复制
$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]}";
}
EN

回答 1

Stack Overflow用户

发布于 2013-01-10 09:24:54

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

代码语言:javascript
复制
$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 (如果查询失败,则返回布尔值false )

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14254362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档