teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

加筆修正

2019/05/25 05:38

投稿

退会済みユーザー
answer CHANGED
@@ -39,6 +39,7 @@
39
39
  ```
40
40
  `!empty($_POST)`は横着がすぎるので、
41
41
  本当にほしいPOST受信パラメータを使ってisset()で判定するべきかと。
42
+ [PHP isset, empty, is_null の違い早見表 - Qiita](https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62)
42
43
 
43
44
  それと、この場面に至るまでに、ちゃんと$memberや$member['id']に値が入ってきているかも確認しないと。
44
45
  $memberを抽出するのに使っている$_SESSION['id']に値を設定している箇所がないので、

3

見直し

2019/05/25 05:38

投稿

退会済みユーザー
answer CHANGED
@@ -59,4 +59,18 @@
59
59
  ?>
60
60
  ```
61
61
  で閉じていますが、もしもその記号のあとに改行コードとかあると、
62
- 不要な文字出力が生じて header() によるリダイレクトが利かなかったりするかもしれません。
62
+ 不要な文字出力が生じて header() によるリダイレクトが利かなかったりするかもしれません。
63
+
64
+ ```
65
+ //dbconnect.php
66
+ <?php
67
+ try {
68
+ $db = new PDO('mysql:dbname=mini_bbs;host=localhost;charset=utf8', 'root', 'root', [
69
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
70
+ PDO::ATTR_EMULATE_PREPARES => false,
71
+ ]);
72
+ } catch (PDOException $e) {
73
+ echo 'DB接続エラー:' . $e->getMessage();
74
+ }
75
+ ```
76
+ とかやってデータベース操作時のエラーを例外としてキャッチできるようにするのも忘れずに。

2

見直し

2019/05/25 05:33

投稿

退会済みユーザー
answer CHANGED
@@ -19,16 +19,21 @@
19
19
  //投稿を記録する
20
20
  if (isset($_POST['message']) && isset($_POST['reply_post_id'])) {
21
21
  if (($_POST['message'] != '') && (is_numeric($_POST['reply_post_id']))) {
22
+ try {
22
- $db->beginTransaction();
23
+ $db->beginTransaction();
23
- $message = $db->prepare('INSERT INTO posts(member_id, message, reply_post_id, created) set member_id=?, message=?, reply_post_id=?, created=NOW()');
24
+ $message = $db->prepare('INSERT INTO posts(member_id, message, reply_post_id, created) set member_id=?, message=?, reply_post_id=?, created=NOW()');
24
- $message->execute(array(
25
+ $message->execute(array(
25
- $member['id'],
26
+ $member['id'],
26
- $_POST['message'],
27
+ $_POST['message'],
27
- $_POST['reply_post_id']
28
+ $_POST['reply_post_id']
28
- ));
29
+ ));
29
- $db->commit();
30
+ $db->commit();
30
31
 
31
- header('Location: index.php'); exit(); // ←これがこれでいいかどうかは保留。
32
+ header('Location: index.php'); exit(); // ←これがこれでいいかどうかは保留。
33
+ }
34
+ catch (PDOException e) {
35
+ echo e->getMessage(); // ←あくまで仮。
36
+ }
32
37
  }
33
38
  }
34
39
  ```
@@ -47,6 +52,7 @@
47
52
  同じような理由で、SELECT文においても「*」で省略せずカラム名は抽出したいものすべて記述します。
48
53
 
49
54
  念のため、beginTransaction()とcommit()も設けてデータベースへの反映を意図してみたり。
55
+ さらに念のために、try~catchで囲ってみたり。
50
56
 
51
57
  また、dbconnect.phpの末尾で
52
58
  ```

1

見直し

2019/05/25 05:31

投稿

退会済みユーザー
answer CHANGED
@@ -19,12 +19,14 @@
19
19
  //投稿を記録する
20
20
  if (isset($_POST['message']) && isset($_POST['reply_post_id'])) {
21
21
  if (($_POST['message'] != '') && (is_numeric($_POST['reply_post_id']))) {
22
+ $db->beginTransaction();
22
23
  $message = $db->prepare('INSERT INTO posts(member_id, message, reply_post_id, created) set member_id=?, message=?, reply_post_id=?, created=NOW()');
23
24
  $message->execute(array(
24
25
  $member['id'],
25
26
  $_POST['message'],
26
27
  $_POST['reply_post_id']
27
28
  ));
29
+ $db->commit();
28
30
 
29
31
  header('Location: index.php'); exit(); // ←これがこれでいいかどうかは保留。
30
32
  }
@@ -44,6 +46,8 @@
44
46
  のちにテーブルが拡張されてカラムが追加されたりしたとき、エラーになるのを防ぐために。
45
47
  同じような理由で、SELECT文においても「*」で省略せずカラム名は抽出したいものすべて記述します。
46
48
 
49
+ 念のため、beginTransaction()とcommit()も設けてデータベースへの反映を意図してみたり。
50
+
47
51
  また、dbconnect.phpの末尾で
48
52
  ```
49
53
  ?>