回答編集履歴

5

追記

2019/02/06 03:14

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -279,3 +279,13 @@
279
279
  prepare→bindValueの流れは必須ですね。
280
280
 
281
281
  今回はそこまで求められていないので書いていませんが。
282
+
283
+
284
+
285
+ -------
286
+
287
+
288
+
289
+ あと、この記事は読んでいただきたい。
290
+
291
+ - [エラーメッセージの読み方と対処, 検索や質問の原則](https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5)

4

調整

2019/02/06 03:14

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -234,7 +234,7 @@
234
234
 
235
235
  try{
236
236
 
237
- $dbh = new PDO("mysql:dbname=***;host=***;charset=utf8mb4"
237
+ return new PDO("mysql:dbname=***;host=***;charset=utf8mb4"
238
238
 
239
239
  ,"***"
240
240
 
@@ -258,10 +258,6 @@
258
258
 
259
259
  }
260
260
 
261
-
262
-
263
- return $dbh;
264
-
265
261
  }
266
262
 
267
263
 

3

調整

2019/02/06 02:45

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -166,7 +166,7 @@
166
166
 
167
167
 
168
168
 
169
- var_dump(get_sql_data("select * from hosts",false));
169
+ var_dump(get_sql_data($sql,false));
170
170
 
171
171
 
172
172
 
@@ -234,11 +234,11 @@
234
234
 
235
235
  try{
236
236
 
237
- $dbh = new PDO("mysql:dbname=test;host=localhost;charset=utf8mb4"
237
+ $dbh = new PDO("mysql:dbname=***;host=***;charset=utf8mb4"
238
-
238
+
239
- ,"root"
239
+ ,"***"
240
-
240
+
241
- ,"",
241
+ ,"***",
242
242
 
243
243
  [
244
244
 
@@ -266,7 +266,7 @@
266
266
 
267
267
 
268
268
 
269
- var_dump(get_sql_data("select * from hosts",false));
269
+ var_dump(get_sql_data($sql,false));
270
270
 
271
271
  ```
272
272
 

2

調整

2019/02/06 02:41

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -114,6 +114,8 @@
114
114
 
115
115
  }
116
116
 
117
+ //dbの解放は余程でかい処理をする以外は自動でされるのでなくてもいいと思う。
118
+
117
119
  }
118
120
 
119
121
 
@@ -162,8 +164,122 @@
162
164
 
163
165
  }
164
166
 
167
+
168
+
169
+ var_dump(get_sql_data("select * from hosts",false));
170
+
171
+
172
+
165
173
  ```
166
174
 
167
175
 
168
176
 
169
177
  蛇足コメントも読んでください。
178
+
179
+
180
+
181
+ # 蛇足コード
182
+
183
+
184
+
185
+ ちなみにPDO版。結果は同じ。
186
+
187
+ ```php
188
+
189
+ <?php
190
+
191
+ function get_sql_data(String $sql,Bool $record_count = true):array{
192
+
193
+ $dbh = connect_db();
194
+
195
+
196
+
197
+ try{
198
+
199
+ $stmt = $dbh->query($sql);
200
+
201
+
202
+
203
+ //データを返す
204
+
205
+ if($record_count){
206
+
207
+ //レコード数取得
208
+
209
+ return ["count"=>$stmt->rowCount()];
210
+
211
+ } else {
212
+
213
+ //レコード返却
214
+
215
+ return $stmt->fetchAll();
216
+
217
+ }
218
+
219
+
220
+
221
+ }catch(PDOException $e){
222
+
223
+ var_dump($e);
224
+
225
+ die();
226
+
227
+ }
228
+
229
+ }
230
+
231
+
232
+
233
+ function connect_db(){
234
+
235
+ try{
236
+
237
+ $dbh = new PDO("mysql:dbname=test;host=localhost;charset=utf8mb4"
238
+
239
+ ,"root"
240
+
241
+ ,"",
242
+
243
+ [
244
+
245
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
246
+
247
+ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
248
+
249
+ ]
250
+
251
+ );
252
+
253
+ } catch (PDOException $e) {
254
+
255
+ var_dump($e);
256
+
257
+ die();
258
+
259
+ }
260
+
261
+
262
+
263
+ return $dbh;
264
+
265
+ }
266
+
267
+
268
+
269
+ var_dump(get_sql_data("select * from hosts",false));
270
+
271
+ ```
272
+
273
+
274
+
275
+ mysqli版でもpdo版でもですが、本来はSQLには色々あって、
276
+
277
+ 例えばSELECTだとwhere句がついてきたりします。
278
+
279
+ その場合だとSQLインジェクションの対策もきちんとやってるか?
280
+
281
+ というのが大事になります。
282
+
283
+ prepare→bindValueの流れは必須ですね。
284
+
285
+ 今回はそこまで求められていないので書いていませんが。

1

修正

2019/02/06 02:40

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -53,3 +53,117 @@
53
53
 
54
54
 
55
55
  できれば上記記事にあるようなPDOへの移行を強くすすめます。
56
+
57
+
58
+
59
+ # サンプルコード:
60
+
61
+
62
+
63
+ 答えは「1つ目で出ているエラーではmysqli_connect()の結果linkを第1引数に渡していない」
64
+
65
+ これは何度もコメントしています。
66
+
67
+ そこを入れればとりあえず1つ進むはず。
68
+
69
+
70
+
71
+ けど、せっかくPHP7ですし、無駄な記述も多いのでPHP7っぽい要素を入れて書き換えてみた。
72
+
73
+ ※文字コードはUTF8前提。もし違うならそこは書き加えてください。その場合の動作の保障はしませんのでエラーが出たら自身で追ってみてください。
74
+
75
+ ```php
76
+
77
+ <?php
78
+
79
+ function get_sql_data(String $sql,Bool $record_count = true):array{
80
+
81
+ $dbh = connect_db();
82
+
83
+ try{
84
+
85
+ $rs = mysqli_query($dbh,$sql);
86
+
87
+
88
+
89
+ //データを返す
90
+
91
+ if($record_count){
92
+
93
+ //レコード数取得
94
+
95
+ return ["count"=>mysqli_num_rows($rs)];
96
+
97
+ } else {
98
+
99
+ //レコード返却
100
+
101
+ //蛇足コメント:whileでfetchしても結局全行取り出すならmysqli_fetch_allで第2引数オプション指定するだけでいい
102
+
103
+ return mysqli_fetch_all($rs,MYSQLI_ASSOC);
104
+
105
+ }
106
+
107
+
108
+
109
+ }catch(mysqli_sql_exception $e){
110
+
111
+ var_dump($e);
112
+
113
+ die();
114
+
115
+ }
116
+
117
+ }
118
+
119
+
120
+
121
+ function connect_db(){
122
+
123
+ try{
124
+
125
+ //蛇足コメント:元のコードではSERVER_NAMEとかで分岐させているけどかなり古いやり方。
126
+
127
+ //それなら設定ファイルを別にもってそこから読み出すようにした方がいい。定数定義のファイルとか。「環境毎に変わらない情報」なので。コードを何度も書き換えることになるのでメンテナンス性が悪い
128
+
129
+ $dbh = mysqli_connect("***", "***", "***", "***"); //MySQL接続
130
+
131
+
132
+
133
+ //蛇足コメント:SET NAMESは基本使わない。それならmysqli()クラスでnewしてset_charset()した方が自然
134
+
135
+ /* 例:PHPマニュアルより引用
136
+
137
+ $mysqli = new mysqli("***", "***", "***", "***");
138
+
139
+ $mysqli->set_charset('utf8');
140
+
141
+ */
142
+
143
+ if (mysqli_connect_errno()) {
144
+
145
+ printf("Connect failed: %s\n", mysqli_connect_error());
146
+
147
+ die();
148
+
149
+ }
150
+
151
+ //蛇足コメント:これで捕捉できるかは未確認。でもtry-catchは必須。PDOExceptionのほうが正直扱いやすい
152
+
153
+ }catch(mysqli_sql_exception $e){
154
+
155
+ var_dump($e);
156
+
157
+ die();
158
+
159
+ }
160
+
161
+ return $dbh;
162
+
163
+ }
164
+
165
+ ```
166
+
167
+
168
+
169
+ 蛇足コメントも読んでください。