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

回答編集履歴

2

修正

2019/02/13 07:27

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -47,6 +47,7 @@
47
47
  if( isset($_POST['regist']) ){// mts10806 POSTされたときしか登録処理いかないんだったらこうではなく最後の方に書いてあるREQUEST_METHODの判断でいい
48
48
  $name = $_POST['id'];// mts10806 idを取り出すのに$name?
49
49
  $comment = $_POST['name'];;// mts10806 idを取り出すのに$comment? 紛らわしいのできちんと意味が合ったネーミングをしましょう
50
+ // mts10806 DBの型とか文字数決まっているのだったらここできちんと入力チェック(バリデーション)行っておかないと容赦なくDBエラーになりますし後述の通りDBエラーになってもそのエラーが拾えません。
50
51
  $sql = "INSERT INTO test (id, name) VALUES ('$name', '$comment')"; //pdo使っているならプリペアドステートメント使ってSQLインジェクション対策まですべき
51
52
  $res = $pdo->query($sql);// mts10806 拾った$resを使ってない。queryが絶対成功する前提で作っているので成功したかどうかわからない。
52
53
  // mts10806 「DBに何か異常が起きたとき」の対策でトランザクション→コミットorロールバック は入れるべき

1

修正

2019/02/13 07:27

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -8,4 +8,67 @@
8
8
 
9
9
  ひとまず原因の1つとして。
10
10
 
11
+ と思ったら違いましたね。
12
+ 変数名がかなり紛らわしい・・。
11
- 後ほどざと作りかえたものをサンプルとし追記します。
13
+ そこでごちゃになっいる可能性はあります。
14
+
15
+ --
16
+
17
+ 先に現在のコードに対する指摘
18
+ // mts10806でコード内検索してください。
19
+ ```php
20
+ <!DOCTYPE HTML>
21
+ <html lang="ja">
22
+
23
+ <head>
24
+ </head>
25
+
26
+ <body>
27
+ <form method="post" action="DB.php">
28
+ <input type="text" name="id" value=""><br>
29
+ <input type="text" name="name" value="">
30
+ <input type="submit" name="regist" value="Post">
31
+ </form>
32
+ </body> <!-- // mts10806 bodyしめた後にHTML出力書くのは文法的にNG(でるのはでるが、だからっていいわけではない) -->
33
+
34
+
35
+ <?php
36
+ //mts10806 要件は[IDとパスワードをユーザー情報としてデータベースに保存する]
37
+ //なのにidとnameでは整合性が取れない
38
+ $host = '*******';
39
+ $dbname = '********';
40
+ $dbuser = '********';
41
+ $dbpassword = '*********';
42
+ $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword");
43
+ // mts10806 変数しかないなら別に""で囲う必要なし。
44
+ //逆に変数以外の文字列があるなら{}で囲うかいったん切って文字列連結するか工夫すべき $nameという変数を定義して"$namea"と書いてあると$nameという変数として認識されません。
45
+
46
+ #データベースへの登録
47
+ if( isset($_POST['regist']) ){// mts10806 POSTされたときしか登録処理いかないんだったらこうではなく最後の方に書いてあるREQUEST_METHODの判断でいい
48
+ $name = $_POST['id'];// mts10806 idを取り出すのに$name?
49
+ $comment = $_POST['name'];;// mts10806 idを取り出すのに$comment? 紛らわしいのできちんと意味が合ったネーミングをしましょう
50
+ $sql = "INSERT INTO test (id, name) VALUES ('$name', '$comment')"; //pdo使っているならプリペアドステートメント使ってSQLインジェクション対策まですべき
51
+ $res = $pdo->query($sql);// mts10806 拾った$resを使ってない。queryが絶対成功する前提で作っているので成功したかどうかわからない。
52
+ // mts10806 「DBに何か異常が起きたとき」の対策でトランザクション→コミットorロールバック は入れるべき
53
+ // mts10806 というかIDとパスワードじゃないの?
54
+ }
55
+
56
+ #テーブル内容の表示
57
+ $sql = "SELECT * FROM test ORDER BY id DESC";
58
+ $stmt = $pdo->query($sql); // mts10806 個人的にはfetchAllのPDO::FETCH_COLUMNでざっと取ったほうが直感的
59
+ foreach ($stmt as $row) {
60
+ echo $row['id'].' '.$row['name'];// mts10806 HTMLエスケープ入れましょう
61
+ echo '<br>';
62
+ }
63
+ #リロード時の二重投稿を防止
64
+ if($_SERVER['REQUEST_METHOD'] === 'POST') {// mts10806 「二重投稿」の対応と言うのなら投稿処理も中に入れましょう。「表示処理」とは区画が違います。
65
+ header('Location:DB.php', true, 303);
66
+ }
67
+ #終了
68
+ $stmt = null;
69
+ $pdo = null;
70
+ ?>
71
+
72
+ </html>
73
+
74
+ ```