回答編集履歴

3

追記

2020/10/07 12:19

投稿

tanat
tanat

スコア18713

test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  - SQLに直接連結している変数のうち、空の変数があって間違った文法のSQLになっている
46
46
 
47
- - そもそもSQLの文法にミスがある
47
+ - そもそもSQLの文法にミスがある(今回のケースだと、文字列の扱いが怪しい)
48
48
 
49
49
  あたりです。
50
50
 
@@ -60,11 +60,175 @@
60
60
 
61
61
 
62
62
 
63
- 1. 想定しているSQLをphpMyAdminやMySQLWorkbench、テスト用のPHPでも何でも良いのでまずは固定値で実行して、正しい(想定する)SQLを作成します
63
+ 1.想定しているSQLをphpMyAdminやMySQLWorkbench、テスト用のPHPでも何でも良いのでまずは固定値で実行して、正しい(想定する)SQLを作成します
64
+
65
+
66
+
64
-
67
+ 例えばこんな感じ。(実際のUPDATE文は自力で作って下さい&未チェックなのでエラーが出るかもしれませんが、流れを把握して頂ければ。)
68
+
69
+ * アクセスしたら想定通りの結果になるかSELECT文を発行して確認する
70
+
71
+
72
+
73
+ ```PHP
74
+
75
+ //アクセスしたらpileのID=1のタイトルが更新されるだけのPHP
76
+
77
+ $dsn = 'mysql:host=localhost;dbname=***;charset=utf8';
78
+
79
+ $user = '**';
80
+
81
+ $password = '*';
82
+
83
+ try{
84
+
85
+ $db = new PDO($dsn, $user, $password);
86
+
87
+ $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
88
+
89
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
90
+
91
+ //プレースホルダーを使っていないので、冗長なサンプル
92
+
93
+ $stmt = $db->prepare("UPDATE `pile` SET title = 'テスト更新' WHERE id = 1");
94
+
95
+ $stmt->execute();
96
+
97
+ exit();
98
+
99
+ } catch (PDOException $e){
100
+
101
+ exit('データベースに接続できませんでした'.$e->getMessage());
102
+
103
+ }
104
+
105
+ ```
106
+
107
+
108
+
65
- 2. [PHPマニュアル](https://www.php.net/manual/ja/pdo.prepare.php)を参考にして、値部分をプレースホルダーに置換して`prepare()`する。
109
+ 2.[PHPマニュアル](https://www.php.net/manual/ja/pdo.prepare.php)を参考にして、値部分をプレースホルダーに置換して`prepare()`する。
110
+
111
+
112
+
66
-
113
+ ```PHP
114
+
115
+ //アクセスしたらpileのID=1のタイトルが更新されるだけのPHP
116
+
117
+ $dsn = 'mysql:host=localhost;dbname=***;charset=utf8';
118
+
119
+ $user = '**';
120
+
121
+ $password = '*';
122
+
123
+ try{
124
+
125
+ $db = new PDO($dsn, $user, $password);
126
+
127
+ $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
128
+
129
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
130
+
131
+ //プレースホルダーを使っていないので、冗長なサンプル
132
+
133
+ $stmt = $db->prepare("UPDATE `pile` SET title = ':title' WHERE id = :id");
134
+
135
+ //この時点ではバインドしている変数が足りない旨の例外が発生するが、SQL文法エラーは発生しない
136
+
137
+ $stmt->execute();
138
+
139
+ exit();
140
+
141
+ } catch (PDOException $e){
142
+
143
+ exit('データベースに接続できませんでした'.$e->getMessage());
144
+
145
+ }
146
+
147
+ ```
148
+
149
+
150
+
151
+
152
+
67
- 3. 2のサンプルを参考にして、値を`execute()`や`bindParam()`でバインドする
153
+ 3.[PHPマニュアル](https://www.php.net/manual/ja/pdo.prepare.php)のサンプルを参考にして、値を`execute()`や`bindParam()`でバインドする
154
+
155
+
156
+
157
+ ```PHP
158
+
159
+ //アクセスしたらpileのID=1のタイトルが更新されるだけのPHP
160
+
161
+ $dsn = 'mysql:host=localhost;dbname=***;charset=utf8';
162
+
163
+ $user = '**';
164
+
165
+ $password = '*';
166
+
167
+ try{
168
+
169
+ $db = new PDO($dsn, $user, $password);
170
+
171
+ $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
172
+
173
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
174
+
175
+ //プレースホルダーを使っていないので、冗長なサンプル
176
+
177
+ $stmt = $db->prepare("UPDATE `pile` SET title = ':title' WHERE id = :id");
178
+
179
+ $stmt->execute(array(':calories' => "テストタイトル", ':colour' => 1));
180
+
181
+ exit();
182
+
183
+ } catch (PDOException $e){
184
+
185
+ exit('データベースに接続できませんでした'.$e->getMessage());
186
+
187
+ }
188
+
189
+ ```
190
+
191
+
192
+
193
+ 4.バインド部分を変数に変更して、処理に組み込む
194
+
195
+ ```PHP
196
+
197
+ //アクセスしたらpileのID=1のタイトルが更新されるだけのPHP
198
+
199
+ $dsn = 'mysql:host=localhost;dbname=***;charset=utf8';
200
+
201
+ $user = '**';
202
+
203
+ $password = '*';
204
+
205
+ try{
206
+
207
+ $db = new PDO($dsn, $user, $password);
208
+
209
+ $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
210
+
211
+ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
212
+
213
+ //プレースホルダーを使っていないので、冗長なサンプル
214
+
215
+ $stmt = $db->prepare("UPDATE `pile` SET title = ':title' WHERE id = :id");
216
+
217
+ $stmt->execute(array(':calories' => $title, ':colour' => $id));
218
+
219
+ exit();
220
+
221
+ } catch (PDOException $e){
222
+
223
+ exit('データベースに接続できませんでした'.$e->getMessage());
224
+
225
+ }
226
+
227
+ ```
228
+
229
+
230
+
231
+
68
232
 
69
233
 
70
234
 

2

追記

2020/10/07 12:19

投稿

tanat
tanat

スコア18713

test CHANGED
@@ -40,6 +40,16 @@
40
40
 
41
41
 
42
42
 
43
+ 良くあるのは
44
+
45
+ - SQLに直接連結している変数のうち、空の変数があって間違った文法のSQLになっている
46
+
47
+ - そもそもSQLの文法にミスがある
48
+
49
+ あたりです。
50
+
51
+
52
+
43
53
  開発の流れ
44
54
 
45
55
  ---
@@ -50,7 +60,7 @@
50
60
 
51
61
 
52
62
 
53
- 1. 想定しているSQLをphpMyAdminやMySQLWorkbench、テスト用のPHPでも何でも良いのでまずは固定値で実行して、正しいSQLを作成します
63
+ 1. 想定しているSQLをphpMyAdminやMySQLWorkbench、テスト用のPHPでも何でも良いのでまずは固定値で実行して、正しい(想定する)SQLを作成します
54
64
 
55
65
  2. [PHPマニュアル](https://www.php.net/manual/ja/pdo.prepare.php)を参考にして、値部分をプレースホルダーに置換して`prepare()`する。
56
66
 

1

修正

2020/10/07 12:06

投稿

tanat
tanat

スコア18713

test CHANGED
@@ -1,11 +1,3 @@
1
- 前置き
2
-
3
- ---
4
-
5
- エラーメッセージはそのまま質問に載せてください
6
-
7
-
8
-
9
1
  回答
10
2
 
11
3
  ---