回答編集履歴
7
見直し
test
CHANGED
@@ -14,6 +14,8 @@
|
|
14
14
|
|
15
15
|
SQL文に余計な文字や記号(特にTAB)が含まれていないかを確認するのかなと。
|
16
16
|
|
17
|
+
もしかしたら可能性の問題として、$db自体もあやしいですが。
|
18
|
+
|
17
19
|
|
18
20
|
|
19
21
|
それにしても大丈夫なのかその教本。
|
6
見直し
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
どうぞ教本を正確に写経してください
test
CHANGED
@@ -1,87 +1,5 @@
|
|
1
|
-
|
1
|
+
書籍の印字上、TABコードなのか空白なのかもあるので、
|
2
2
|
|
3
|
-
|
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
見直し
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修正
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
見直し
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
見直し
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
|
+
```
|