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

回答編集履歴

1

追記

2020/05/20 13:17

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -5,4 +5,62 @@
5
5
  ```PHP
6
6
  $memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5');
7
7
  ```
8
- LIMITの前に全角スペースが入っています
8
+ LIMITの前に全角スペースが入っています
9
+
10
+ SQL文法ミスに気づけない原因
11
+ ---
12
+
13
+ ```PHP
14
+ $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51');
15
+ ```
16
+ が学習用としては最悪なコードです。
17
+
18
+ PDOはデフォルトではSQLの文法ミスがあった場合にエラーを吐いてくれません。
19
+ [PHPマニュアル: エラーおよびエラー処理 ](https://www.php.net/manual/ja/pdo.error-handling.php)
20
+
21
+
22
+ ```PHP
23
+ <?php
24
+ $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
25
+ $user = 'dbuser';
26
+ $password = 'dbpass';
27
+
28
+ try {
29
+ $dbh = new PDO($dsn, $user, $password);
30
+ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
31
+ } catch (PDOException $e) {
32
+ echo 'Connection failed: ' . $e->getMessage();
33
+ }
34
+ ```
35
+ の様な形で、オプションを指定してげることでSQLに文法エラーがあった時に例外が発生し、エラー内容を補足することが出来るようになります。
36
+
37
+
38
+ ---
39
+ 質問にあるコードだと、`dbconnect.php`で
40
+
41
+ ```PHP
42
+ try{
43
+ $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51');
44
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
45
+ }catch(PDOException $e){
46
+ echo 'DB接続エラー:'.$e->getMessage();
47
+ }
48
+
49
+ ```
50
+
51
+ ```PHP
52
+ try{
53
+ $memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5');
54
+ $memos->bindParam(1,$_REQUEST['page'],PDO::PARAM_INT);
55
+ $memos->execute();
56
+ }catch(Exception $e){
57
+ die($e->getMessage());
58
+ }
59
+
60
+ ```
61
+
62
+ という感じにすればSQLエラーがあるという事に気づけたはずです。
63
+
64
+
65
+ ---
66
+ デバッグが出来ないコードを掲載する教材は変えた方が良いと思います。