回答編集履歴

7

見直し

2019/05/30 12:32

投稿

退会済みユーザー
test CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  SQL文に余計な文字や記号(特にTAB)が含まれていないかを確認するのかなと。
16
16
 
17
+ もしかしたら可能性の問題として、$db自体もあやしいですが。
18
+
17
19
 
18
20
 
19
21
  それにしても大丈夫なのかその教本。

6

見直し

2019/05/30 12:32

投稿

退会済みユーザー
test CHANGED
@@ -3,3 +3,23 @@
3
3
  正確に写経できているかの確認と、
4
4
 
5
5
  もしもTABコードがSQL文に混ざっているようなら回避するように書き換えると良いかと。
6
+
7
+
8
+
9
+ あのエラーが出てるってことは、`$stmt`がFALSEであろうと察します。
10
+
11
+ `var_dump($stmt);`とか書けば確認できるでしょう。
12
+
13
+ つまり、prepare()に失敗しているので、
14
+
15
+ SQL文に余計な文字や記号(特にTAB)が含まれていないかを確認するのかなと。
16
+
17
+
18
+
19
+ それにしても大丈夫なのかその教本。
20
+
21
+ bindParam()は往々にしてバグりやすいのでふつうはbindValue()を使うし、
22
+
23
+ 接続時にエラーを例外でスローするように書くべきところをスルーされてるし、
24
+
25
+ それで出版年度が3年以上古かったら焼き捨てたほうが良いのでは?(あくまで独断と偏見による。)

5

どうぞ教本を正確に写経してください

2019/05/30 12:30

投稿

退会済みユーザー
test CHANGED
@@ -1,87 +1,5 @@
1
- bindParamじゃくbindValueじゃと。
1
+ 書籍の印字上、TABコードのか空白もあるので、
2
2
 
3
- ```php
3
+ 正確に写経できているかの確認と、
4
4
 
5
- // パラメータを割り当て
6
-
7
- $stmt->bindValue(':name', $name, PDO::PARAM_STR);
8
-
9
- $stmt->bindValue(':title', $title, PDO::PARAM_STR);
10
-
11
- $stmt->bindValue(':body', $body, PDO::PARAM_STR);
12
-
13
- $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
14
-
15
- ```
16
-
17
- そして、POST受信まわりも気になる。
18
-
19
- ```php
20
-
21
- $name = $_POST['name'];
22
-
23
- $title = $_POST['title'];
24
-
25
- $body = $_POST['body'];
26
-
27
- $pass = $_POST['pass'];
28
-
29
- ```
30
-
31
- でPOST受信したパラメータを変数に格納しているけど、
32
-
33
- これにデータが入ったかどうかの検証をせず
34
-
35
- データベースに格納するのは無謀すぎる。
36
-
37
- ```php
38
-
39
- $name = filter_input(INPUT_POST, 'name');
40
-
41
- $title = filter_input(INPUT_POST, 'title');
42
-
43
- $body = filter_input(INPUT_POST, 'body');
44
-
45
- $pass = filter_input(INPUT_POST, 'pass');
46
-
47
- ```
48
-
49
- みたいにするとPOST受信できなかったパラメータも文字列長ゼロ文字列(カラ文字列)にはなりますが、
50
-
51
- データベースにカラ文字列のまま格納していいのかっていう次の話もあります。
52
-
53
-
54
-
55
- ```php
56
-
57
- if ($name !== '' && $title !== '' && $body !== '' && $pass !== '') {
58
-
59
- // データベースに格納する処理をここに置く
60
-
61
- }
62
-
63
- else {
64
-
65
- // エラー表示の処理を別途実装する
66
-
67
- }
68
-
69
- ```
70
-
71
- もう一つ。せっかくtry~catchで括っているけど、
72
-
73
- エラ発生時例外をスローするように設定されてない
5
+ TABコドがSQL文混ざっているようなら回避するように書き換えると良かと
74
-
75
- ```php
76
-
77
- $db = new PDO($dsn, $user, $password, [
78
-
79
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
80
-
81
- PDO::ATTR_EMULATE_PREPARES => false,
82
-
83
- ]);
84
-
85
- ```
86
-
87
- などとする。

4

見直し

2019/05/30 12:25

投稿

退会済みユーザー
test CHANGED
@@ -67,3 +67,21 @@
67
67
  }
68
68
 
69
69
  ```
70
+
71
+ もう一つ。せっかくtry~catchで括っているけど、
72
+
73
+ そもそもエラー発生時に例外をスローするように設定されていない。
74
+
75
+ ```php
76
+
77
+ $db = new PDO($dsn, $user, $password, [
78
+
79
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
80
+
81
+ PDO::ATTR_EMULATE_PREPARES => false,
82
+
83
+ ]);
84
+
85
+ ```
86
+
87
+ などとする。

3

typo修正

2019/05/30 12:09

投稿

退会済みユーザー
test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  ```
48
48
 
49
- みたいにするとPOST受信できなかったも文字列長ゼロ文字列(カラ文字列)にはなりますが、
49
+ みたいにするとPOST受信できなかったパラメータも文字列長ゼロ文字列(カラ文字列)にはなりますが、
50
50
 
51
51
  データベースにカラ文字列のまま格納していいのかっていう次の話もあります。
52
52
 
@@ -60,4 +60,10 @@
60
60
 
61
61
  }
62
62
 
63
+ else {
64
+
65
+ // エラー表示の処理を別途実装する
66
+
67
+ }
68
+
63
69
  ```

2

見直し

2019/05/30 11:59

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,20 @@
1
1
  bindParamじゃなくbindValueじゃないかと。
2
2
 
3
+ ```php
3
4
 
5
+ // パラメータを割り当て
6
+
7
+ $stmt->bindValue(':name', $name, PDO::PARAM_STR);
8
+
9
+ $stmt->bindValue(':title', $title, PDO::PARAM_STR);
10
+
11
+ $stmt->bindValue(':body', $body, PDO::PARAM_STR);
12
+
13
+ $stmt->bindValue(':pass', $pass, PDO::PARAM_STR);
14
+
15
+ ```
16
+
17
+ そして、POST受信まわりも気になる。
4
18
 
5
19
  ```php
6
20
 

1

見直し

2019/05/30 11:55

投稿

退会済みユーザー
test CHANGED
@@ -1 +1,49 @@
1
1
  bindParamじゃなくbindValueじゃないかと。
2
+
3
+
4
+
5
+ ```php
6
+
7
+ $name = $_POST['name'];
8
+
9
+ $title = $_POST['title'];
10
+
11
+ $body = $_POST['body'];
12
+
13
+ $pass = $_POST['pass'];
14
+
15
+ ```
16
+
17
+ でPOST受信したパラメータを変数に格納しているけど、
18
+
19
+ これにデータが入ったかどうかの検証をせず
20
+
21
+ データベースに格納するのは無謀すぎる。
22
+
23
+ ```php
24
+
25
+ $name = filter_input(INPUT_POST, 'name');
26
+
27
+ $title = filter_input(INPUT_POST, 'title');
28
+
29
+ $body = filter_input(INPUT_POST, 'body');
30
+
31
+ $pass = filter_input(INPUT_POST, 'pass');
32
+
33
+ ```
34
+
35
+ みたいにするとPOST受信できなかった文も文字列長ゼロ文字列(カラ文字列)にはなりますが、
36
+
37
+ データベースにカラ文字列のまま格納していいのかっていう次の話もあります。
38
+
39
+
40
+
41
+ ```php
42
+
43
+ if ($name !== '' && $title !== '' && $body !== '' && $pass !== '') {
44
+
45
+ // データベースに格納する処理をここに置く
46
+
47
+ }
48
+
49
+ ```