回答編集履歴

1

追記

2020/05/20 13:17

投稿

tanat
tanat

スコア18727

test CHANGED
@@ -13,3 +13,119 @@
13
13
  ```
14
14
 
15
15
  LIMITの前に全角スペースが入っています
16
+
17
+
18
+
19
+ SQL文法ミスに気づけない原因
20
+
21
+ ---
22
+
23
+
24
+
25
+ ```PHP
26
+
27
+ $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51');
28
+
29
+ ```
30
+
31
+ が学習用としては最悪なコードです。
32
+
33
+
34
+
35
+ PDOはデフォルトではSQLの文法ミスがあった場合にエラーを吐いてくれません。
36
+
37
+ [PHPマニュアル: エラーおよびエラー処理 ](https://www.php.net/manual/ja/pdo.error-handling.php)
38
+
39
+
40
+
41
+
42
+
43
+ ```PHP
44
+
45
+ <?php
46
+
47
+ $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
48
+
49
+ $user = 'dbuser';
50
+
51
+ $password = 'dbpass';
52
+
53
+
54
+
55
+ try {
56
+
57
+ $dbh = new PDO($dsn, $user, $password);
58
+
59
+ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
60
+
61
+ } catch (PDOException $e) {
62
+
63
+ echo 'Connection failed: ' . $e->getMessage();
64
+
65
+ }
66
+
67
+ ```
68
+
69
+ の様な形で、オプションを指定してげることでSQLに文法エラーがあった時に例外が発生し、エラー内容を補足することが出来るようになります。
70
+
71
+
72
+
73
+
74
+
75
+ ---
76
+
77
+ 質問にあるコードだと、`dbconnect.php`で
78
+
79
+
80
+
81
+ ```PHP
82
+
83
+ try{
84
+
85
+ $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51');
86
+
87
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
88
+
89
+ }catch(PDOException $e){
90
+
91
+ echo 'DB接続エラー:'.$e->getMessage();
92
+
93
+ }
94
+
95
+
96
+
97
+ ```
98
+
99
+
100
+
101
+ ```PHP
102
+
103
+ try{
104
+
105
+ $memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5');
106
+
107
+ $memos->bindParam(1,$_REQUEST['page'],PDO::PARAM_INT);
108
+
109
+ $memos->execute();
110
+
111
+ }catch(Exception $e){
112
+
113
+ die($e->getMessage());
114
+
115
+ }
116
+
117
+
118
+
119
+ ```
120
+
121
+
122
+
123
+ という感じにすればSQLエラーがあるという事に気づけたはずです。
124
+
125
+
126
+
127
+
128
+
129
+ ---
130
+
131
+ デバッグが出来ないコードを掲載する教材は変えた方が良いと思います。