4

これがばかげた質問なら許してください、しかし私は困難な状況にあります。

これを行います:

$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がクラッシュまたは失敗した場合、支払われるべき支払いを表示しないことです。上記のチャンクはすべての場合に機能しますか?

私が自分自身を明確にしてタイにしたことを願っています

編集: 上記のコードは主にデモンストレーション用に書かれたもので、少し遅れて気付いたので、正しいコードではありません。しかし、元の質問はであるため、それはあなたを悩ませるべきではありません。PDOdbのクラッシュと残りすべてを処理する場合。

私の考えは、正常に更新された行ごとに、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]}";
}
4

1 に答える 1

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を返します)

于 2013-01-10T09:24:54.740 に答える