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

回答編集履歴

3

加筆修正

2020/09/15 14:14

投稿

退会済みユーザー
answer CHANGED
@@ -38,4 +38,28 @@
38
38
  `PDO::PARAM_STR`でなく`PDO::PARAM_INT`を使ったりします。
39
39
 
40
40
  参考:
41
- [PHPでデータベースに接続するときのまとめ - Qiita](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)
41
+ [PHPでデータベースに接続するときのまとめ - Qiita](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)
42
+
43
+ あと、
44
+
45
+ ```php
46
+ if(($_POST['shots']=='')||(!isset($_POST['shots']))){
47
+ echo "<p>データが未入力です。<br/>入力画面に戻ってください。</p>";
48
+ }else{
49
+ ```
50
+ の箇所もちょっと気になる。
51
+ ```php
52
+ if ( (!isset($_POST['shots'])) || ($_POST['shots']=='') ) {
53
+ echo "<p>データが未入力です。<br/>入力画面に戻ってください。</p>";
54
+ }
55
+ else {
56
+ ```
57
+ isset()での評価を前に持ってくれば、
58
+ もしもPOST送信データにshotsが含まれていないときに
59
+ Notice: Undefined index
60
+ のエラーを回避できそう。
61
+
62
+ 他のフォーム入力データも、データの存在チェックをしっかり厳しく行ってください。
63
+ 面倒なら、
64
+ [filter_input](https://www.php.net/manual/ja/function.filter-input.php)
65
+ を駆使したほうがいいです。

2

見直し

2020/09/15 14:14

投稿

退会済みユーザー
answer CHANGED
@@ -9,5 +9,33 @@
9
9
  エラー対策が甘いと言わざるを得ません。
10
10
  今一度ご確認ください。
11
11
 
12
+ ```
13
+ $sql='INSERT INTO num_of_shots(性別,年代,職業,種類,撮影枚数)
14
+ VALUES("'.$gender.'","'.$age.'","'
15
+ .$job.'","'.$kind.'",'.$shots.');';
16
+ ```
17
+
18
+ これ、SQLインジェクション攻撃される、やってはいけないやり方になります。
19
+ SQL文をプリペアドステートメントで与えるようにします。
20
+
21
+ ```php
22
+ $sql = <<<EOT
23
+ INSERT INTO `num_of_shots`(`性別`,`年代`,`職業`,`種類`,`撮影枚数`)
24
+ VALUES(:gender, :age, :job, :kind, :shots);
25
+ EOT;
26
+
27
+ $stmt = $dbh->prepare($sql);
28
+ $stmt->bindValue(':gender', $gender, PDO::PARAM_STR);
29
+ $stmt->bindValue(':age', $age, PDO::PARAM_STR);
30
+ $stmt->bindValue(':job', $job, PDO::PARAM_STR);
31
+ $stmt->bindValue(':kind', $kind, PDO::PARAM_STR);
32
+ $stmt->bindValue(':shots', $shots, PDO::PARAM_STR);
33
+ $stmt->execute();
34
+ ```
35
+
36
+ などと机上のコードですが直してみました。
37
+ もちろん、テーブルの構造によっては、文字列でなく数値データであれば
38
+ `PDO::PARAM_STR`でなく`PDO::PARAM_INT`を使ったりします。
39
+
12
40
  参考:
13
41
  [PHPでデータベースに接続するときのまとめ - Qiita](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)

1

加筆修正

2020/09/15 14:08

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,13 @@
1
1
  `$dsn='mysql:host=localhost;bdname=digicam_q;charset=utf8';`
2
2
 
3
3
  `$dsn='mysql:host=localhost;dbname=digicam_q;charset=utf8';`
4
- とか?
4
+ とか?
5
+
6
+ new PDO()するあたりでtry~catchせず、
7
+ データベースに接続が成功しているか検証せずに処理を進めていて、
8
+ INSERT INTO文だけtry~catchで囲むのは
9
+ エラー対策が甘いと言わざるを得ません。
10
+ 今一度ご確認ください。
11
+
12
+ 参考:
13
+ [PHPでデータベースに接続するときのまとめ - Qiita](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)