回答編集履歴

2

修正

2019/02/13 07:27

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -96,6 +96,8 @@
96
96
 
97
97
  $comment = $_POST['name'];;// mts10806 idを取り出すのに$comment? 紛らわしいのできちんと意味が合ったネーミングをしましょう
98
98
 
99
+ // mts10806 DBの型とか文字数決まっているのだったらここできちんと入力チェック(バリデーション)行っておかないと容赦なくDBエラーになりますし後述の通りDBエラーになってもそのエラーが拾えません。
100
+
99
101
  $sql = "INSERT INTO test (id, name) VALUES ('$name', '$comment')"; //pdo使っているならプリペアドステートメント使ってSQLインジェクション対策まですべき
100
102
 
101
103
  $res = $pdo->query($sql);// mts10806 拾った$resを使ってない。queryが絶対成功する前提で作っているので成功したかどうかわからない。

1

修正

2019/02/13 07:27

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -18,4 +18,130 @@
18
18
 
19
19
 
20
20
 
21
+ と思ったら違いましたね。
22
+
23
+ 変数名がかなり紛らわしい・・。
24
+
21
- 後ほどざと作かえたものをサンプルとして追記します。
25
+ そこでごちゃになっている可能性はあります。
26
+
27
+
28
+
29
+ --
30
+
31
+
32
+
33
+ 先に現在のコードに対する指摘
34
+
35
+ // mts10806でコード内検索してください。
36
+
37
+ ```php
38
+
39
+ <!DOCTYPE HTML>
40
+
41
+ <html lang="ja">
42
+
43
+
44
+
45
+ <head>
46
+
47
+ </head>
48
+
49
+
50
+
51
+ <body>
52
+
53
+ <form method="post" action="DB.php">
54
+
55
+ <input type="text" name="id" value=""><br>
56
+
57
+ <input type="text" name="name" value="">
58
+
59
+ <input type="submit" name="regist" value="Post">
60
+
61
+ </form>
62
+
63
+ </body> <!-- // mts10806 bodyしめた後にHTML出力書くのは文法的にNG(でるのはでるが、だからっていいわけではない) -->
64
+
65
+
66
+
67
+
68
+
69
+ <?php
70
+
71
+ //mts10806 要件は[IDとパスワードをユーザー情報としてデータベースに保存する]
72
+
73
+ //なのにidとnameでは整合性が取れない
74
+
75
+ $host = '*******';
76
+
77
+ $dbname = '********';
78
+
79
+ $dbuser = '********';
80
+
81
+ $dbpassword = '*********';
82
+
83
+ $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword");
84
+
85
+ // mts10806 変数しかないなら別に""で囲う必要なし。
86
+
87
+ //逆に変数以外の文字列があるなら{}で囲うかいったん切って文字列連結するか工夫すべき $nameという変数を定義して"$namea"と書いてあると$nameという変数として認識されません。
88
+
89
+
90
+
91
+ #データベースへの登録
92
+
93
+ if( isset($_POST['regist']) ){// mts10806 POSTされたときしか登録処理いかないんだったらこうではなく最後の方に書いてあるREQUEST_METHODの判断でいい
94
+
95
+ $name = $_POST['id'];// mts10806 idを取り出すのに$name?
96
+
97
+ $comment = $_POST['name'];;// mts10806 idを取り出すのに$comment? 紛らわしいのできちんと意味が合ったネーミングをしましょう
98
+
99
+ $sql = "INSERT INTO test (id, name) VALUES ('$name', '$comment')"; //pdo使っているならプリペアドステートメント使ってSQLインジェクション対策まですべき
100
+
101
+ $res = $pdo->query($sql);// mts10806 拾った$resを使ってない。queryが絶対成功する前提で作っているので成功したかどうかわからない。
102
+
103
+ // mts10806 「DBに何か異常が起きたとき」の対策でトランザクション→コミットorロールバック は入れるべき
104
+
105
+ // mts10806 というかIDとパスワードじゃないの?
106
+
107
+ }
108
+
109
+
110
+
111
+ #テーブル内容の表示
112
+
113
+ $sql = "SELECT * FROM test ORDER BY id DESC";
114
+
115
+ $stmt = $pdo->query($sql); // mts10806 個人的にはfetchAllのPDO::FETCH_COLUMNでざっと取ったほうが直感的
116
+
117
+ foreach ($stmt as $row) {
118
+
119
+ echo $row['id'].' '.$row['name'];// mts10806 HTMLエスケープ入れましょう
120
+
121
+ echo '<br>';
122
+
123
+ }
124
+
125
+ #リロード時の二重投稿を防止
126
+
127
+ if($_SERVER['REQUEST_METHOD'] === 'POST') {// mts10806 「二重投稿」の対応と言うのなら投稿処理も中に入れましょう。「表示処理」とは区画が違います。
128
+
129
+ header('Location:DB.php', true, 303);
130
+
131
+ }
132
+
133
+ #終了
134
+
135
+ $stmt = null;
136
+
137
+ $pdo = null;
138
+
139
+ ?>
140
+
141
+
142
+
143
+ </html>
144
+
145
+
146
+
147
+ ```