dポイントプレゼントキャンペーン実施中!

1、dbの例外処理ってなぜするのですか?接続できなかったらコンパイルエラー?が起きるだけなのではないのでしょうか?
2.例外処理は下記のコードで合ってますか?

try{

$db=new SQLite3("test.db");
//例外に投げる処理
if (empty($db)) {
throw new Exception();
}

// トランザクション開始
$db->exec('begin');

//実行したい処理

// コミット
$db->exec('commit');

}
$db->close();
}

catch (Exception $e) {
echo 'エラーが発生しました: ' . $e->getMessage();
// ロールバック
$db->exec('rollback');
}

質問者からの補足コメント

  • なるほど。ありがとうございます。
    では、if文を省いたもので大丈夫でしょうか?

    よくかよく考えたらトランザクション処理で
    // トランザクション開始
    $db->exec('begin');のexecの返り値がfalseになったときの処理ってした方がよいのでしょうか?もしした方がよい場合、処理の方法を教えてください。

    https://www.php.net/manual/ja/pdo.begintransacti
    マニュアルの
    return $this->transactionCounter >= 0;
    で大丈夫でしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/03/15 21:30

A 回答 (2件)

> では、if文を省いたもので大丈夫でしょうか?


マニュアルにはnullを返すような説明はありませんからね。

> $db->exec('begin');のexecの返り値がfalseになったときの処理ってした
> 方がよいのでしょうか?もしした方がよい場合、処理の方法を教えてくだ
> さい。
exec()の実行結果はboolで返すようなのでそうですね。
失敗したら失敗した時のコードを書けばいいだけです。
if (!$db->exec('begin')) {
// 失敗時のコード
}

https://www.php.net/manual/ja/pdo.begintransaction
こちらはPDOクラスを利用した場合の命令です。
SQLite3クラスを利用している場合には無関係です。
ユーザー寄稿メモの提示コードにある$this->transactionCounterは、
その人のコードであって、PDOで提供されているものではありません。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございました

お礼日時:2021/03/16 10:52

https://www.php.net/manual/ja/sqlite3.construct. …

戻り値はemptyになることはなさそうだし、失敗時は例外が発行されるので、if (empty()〜)は不要ですね。

また、発行してるクエリに誤りがあれば、それも例外が発行されるはずです。

このままの処理の場合、catchでは$dbの内容が確定しているとは限らないため、$dbにSqLite3オブジェクトが格納されていることを判断する必要があります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

なるほど。ありがとうございます。
では、if文を省いたもので大丈夫でしょうか?

よくかよく考えたらトランザクション処理で
// トランザクション開始
$db->exec('begin');のexecの返り値がfalseになったときの処理ってした方がよいのでしょうか?もしした方がよい場合、処理の方法を教えてください。

https://www.php.net/manual/ja/pdo.begintransacti …
マニュアルの
return $this->transactionCounter >= 0;
で大丈夫でしょうか?

お礼日時:2021/03/15 20:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!