質問編集履歴

3

ソースの追加

2018/11/10 23:44

投稿

kaya_miyoshi
kaya_miyoshi

スコア23

test CHANGED
File without changes
test CHANGED
@@ -52,12 +52,476 @@
52
52
 
53
53
 
54
54
 
55
+ /*********************************/
56
+
57
+ /* データ更新(削除、変更、追加)*/
58
+
59
+ /*********************************/
60
+
61
+
62
+
63
+ } else if (isset($_POST["func"]) && $_POST["func"] == "upd_data") {
64
+
65
+ // データ受取
66
+
67
+ $delid = $_POST["delid"];
68
+
69
+ $delid = json_decode($delid, true);
70
+
71
+ $upddata = $_POST["upddata"];
72
+
73
+ $upddata = json_decode($upddata, true);
74
+
75
+ $insdata = $_POST["insdata"];
76
+
77
+ $insdata = json_decode($insdata, true);
78
+
79
+
80
+
81
+ // トランザクション開始
82
+
83
+ $db->beginTransaction();
84
+
85
+ // データ削除
86
+
87
+ if ($delid) {
88
+
89
+ for ($i=0; $i<count($delid); $i++) {
90
+
91
+ $sql = "DELETE FROM sample WHERE id=?";
92
+
93
+ $stmt = $db->prepare($sql);
94
+
95
+ $stmt->execute(array($delid[$i]["id"]));
96
+
55
- }
97
+ }
98
+
99
+ }
100
+
101
+ // データ変更
102
+
103
+ if ($upddata) {
104
+
105
+ for ($i=0; $i<count($upddata); $i++) {
106
+
107
+ $sql = "UPDATE sample SET name=?, age=? WHERE id=?";
108
+
109
+ $stmt = $db->prepare($sql);
110
+
111
+ $stmt->execute(array($upddata[$i]["name"], $upddata[$i]["age"], $upddata[$i]["id"]));
112
+
113
+ }
114
+
115
+ }
116
+
117
+ // データ追加
118
+
119
+ if ($insdata) {
120
+
121
+ for ($i=0; $i<count($insdata); $i++) {
122
+
123
+ $sql = "INSERT INTO sample (name, age) VALUES (?, ?)";
124
+
125
+ $stmt = $db->prepare($sql);
126
+
127
+ $stmt->execute(array($insdata[$i]["name"], $insdata[$i]["age"]));
128
+
129
+ }
130
+
131
+ }
132
+
133
+ // トランザクション終了
134
+
135
+ $db->commit();
136
+
137
+ exit();
138
+
139
+ }
56
140
 
57
141
  $db = null;
58
142
 
59
143
  ?>
60
144
 
145
+
146
+
147
+ <html>
148
+
149
+ <center>
150
+
151
+ <head>
152
+
153
+ <script type="text/javascript">
154
+
155
+
156
+
157
+ var Ajax = new XMLHttpRequest();
158
+
159
+
160
+
161
+ // 削除対象IDを格納する配列
162
+
163
+ var delid = [];
164
+
165
+
166
+
167
+ // 変更データを格納する配列
168
+
169
+ var upddata = [];
170
+
171
+
172
+
173
+ // 新規登録データを格納する配列
174
+
175
+ var insdata = [];
176
+
177
+
178
+
179
+ window.onload = getSample;
180
+
181
+
182
+
183
+ /************/
184
+
185
+ /* 一覧表示 */
186
+
187
+ /************/
188
+
189
+
190
+
191
+ function getSample() {
192
+
193
+ var rows, row, i, out;
194
+
195
+ var url = "sample.php" + "?dummy=" + new Date().getTime() + "&func=" + "get_data";
196
+
197
+ Ajax.open("GET", url, true);
198
+
199
+ Ajax.send(null);
200
+
201
+ Ajax.onreadystatechange = function() {
202
+
203
+ if (Ajax.readyState == 4 && Ajax.status == 200) {
204
+
205
+ out = '<table border="1" id="sampletb">';
206
+
207
+ out += '<tr>';
208
+
209
+ out += '<th>削除</th>';
210
+
211
+ out += '<th>ID</th>';
212
+
213
+ out += '<th>氏名</th>';
214
+
215
+ out += '<th>年齢</th>';
216
+
217
+ out += '</tr>';
218
+
219
+ var res = Ajax.responseText;
220
+
221
+ if (res) {
222
+
223
+ rows = JSON.parse(res);
224
+
225
+ for (i in rows) {
226
+
227
+ out += '<tr>';
228
+
229
+ out += '<td><input type="checkbox" id="'+i+':0" onClick="delCheck(this);"></td>';
230
+
231
+ out += '<td><input type="text" id="'+i+':1" value='+rows[i]["id"]+' disabled></td>';
232
+
233
+ out += '<td><input type="text" id="'+i+':2" value="'+rows[i]["name"]+'" onChange="updCheck(this)";></td>';
234
+
235
+ out += '<td><input type="text" id="'+i+':3" value="'+rows[i]["age"]+'" onChange="updCheck(this)";></td>';
236
+
237
+ out += '</tr>';
238
+
239
+ }
240
+
241
+ }
242
+
243
+ out += '</table>';
244
+
245
+ out += '<p>';
246
+
247
+ out += '<button type="button" onClick="addRow();">'+"行追加"+'</button>';
248
+
249
+ out += '<button type="button" onClick="Upd();">'+"更新"+'</button>';
250
+
251
+ out += '</p>';
252
+
253
+ document.getElementById("result").innerHTML = out;
254
+
255
+ }
256
+
257
+ }
258
+
259
+ }
260
+
261
+
262
+
263
+ /**********/
264
+
265
+ /* 行追加 */
266
+
267
+ /**********/
268
+
269
+
270
+
271
+ function addRow() {
272
+
273
+ var el = document.getElementById('sampletb');
274
+
275
+ var i = el.rows.length;
276
+
277
+ var insertRow = el.insertRow(i);
278
+
279
+ var insertCell0 = insertRow.insertCell(0);
280
+
281
+ var insertCell1 = insertRow.insertCell(1);
282
+
283
+ var insertCell2 = insertRow.insertCell(2);
284
+
285
+ var insertCell3 = insertRow.insertCell(3);
286
+
287
+ insertRow.style.backgroundColor = 'blue';
288
+
289
+ // 1:insid, 2:name, 3:age
290
+
291
+ insertCell0.innerHTML = '<td><input type="checkbox"></td>';
292
+
293
+ insertCell1.innerHTML = '<input type="text" id="'+i+':1" value="'+i+'" style="width:20px;">';
294
+
295
+ insertCell2.innerHTML = '<input type="text" id="'+i+':2" value="" onChange="insCheck(this)";>';
296
+
297
+ insertCell3.innerHTML = '<input type="text" id="'+i+':3" value="" onChange="insCheck(this)";>';
298
+
299
+ }
300
+
301
+
302
+
303
+ /************/
304
+
305
+ /* 新規登録 */
306
+
307
+ /************/
308
+
309
+
310
+
311
+ function insCheck(e) {
312
+
313
+ var index = e.id.indexOf(":");
314
+
315
+ var row = e.id.substring(0, index);
316
+
317
+ var insid = document.getElementById(row+':1').value;
318
+
319
+ var name = document.getElementById(row+':2').value;
320
+
321
+ var age = document.getElementById(row+':3').value;
322
+
323
+ // 最初の登録処理
324
+
325
+ if (insdata.length == 0) {
326
+
327
+ insdata.push({"insid":insid, "name":name, "age":age});
328
+
329
+ return;
330
+
331
+ }
332
+
333
+ // 2件目以降の登録処理
334
+
335
+ // 重複がある場合の登録処理
336
+
337
+ for (var i=0; i<insdata.length; i++) {
338
+
339
+ if (insdata[i]["insid"] == insid) {
340
+
341
+ // 配列から除外
342
+
343
+ insdata.splice(i, 1);
344
+
345
+ // 配列に追加
346
+
347
+ insdata.push({"insid":insid, "name":name, "age":age});
348
+
349
+ return;
350
+
351
+ }
352
+
353
+ }
354
+
355
+ // 重複がない場合の登録処理
356
+
357
+ insdata.push({"insid":insid, "name":name, "age":age});
358
+
359
+ }
360
+
361
+
362
+
363
+ /********/
364
+
365
+ /* 変更 */
366
+
367
+ /********/
368
+
369
+
370
+
371
+ function updCheck(e) {
372
+
373
+ e.parentNode.style.backgroundColor = 'yellow';
374
+
375
+ var row = e.id.substr(0, e.id.indexOf(":"));
376
+
377
+ var tid = document.getElementById(row+':1').value;
378
+
379
+ var name = document.getElementById(row+':2').value;
380
+
381
+ var age = document.getElementById(row+':3').value;
382
+
383
+ // 最初の変更処理
384
+
385
+ if (upddata.length == 0) {
386
+
387
+ upddata.push({"id":tid, "name":name, "age":age});
388
+
389
+ return;
390
+
391
+ }
392
+
393
+ // 2件目以降の変更処理
394
+
395
+ // 重複がある場合の変更処理
396
+
397
+ for (var i=0; i<upddata.length; i++) {
398
+
399
+ if (upddata[i]["id"] == tid) {
400
+
401
+ // 配列から除外
402
+
403
+ upddata.splice(i, 1);
404
+
405
+ // 配列に追加
406
+
407
+ upddata.push({"id":tid, "name":name, "age":age});
408
+
409
+ return;
410
+
411
+ }
412
+
413
+ }
414
+
415
+ // 重複がない場合の変更処理
416
+
417
+ upddata.push({"id":tid, "name":name, "age":age});
418
+
419
+ }
420
+
421
+
422
+
423
+ /********/
424
+
425
+ /* 削除 */
426
+
427
+ /********/
428
+
429
+
430
+
431
+ function delCheck(e) {
432
+
433
+ var tid = document.getElementById(e.id.replace(':0',':1')).value;
434
+
435
+ // チェック入れたとき
436
+
437
+ if (e.checked == true) {
438
+
439
+ e.parentNode.parentNode.style.backgroundColor = 'red';
440
+
441
+ delid.push({"id":tid});
442
+
443
+ // チェック外したとき
444
+
445
+ } else if (e.checked == false) {
446
+
447
+ e.parentNode.parentNode.style.backgroundColor = '';
448
+
449
+ for (var i=0; i<delid.length; i++) {
450
+
451
+ if (delid[i]["id"] == tid) {
452
+
453
+ delid.splice(i, 1);
454
+
455
+ }
456
+
457
+ }
458
+
459
+ }
460
+
461
+ }
462
+
463
+
464
+
465
+ /************/
466
+
467
+ /* 更新処理 */
468
+
469
+ /************/
470
+
471
+
472
+
473
+ function Upd() {
474
+
475
+ delid2 = JSON.stringify(delid);
476
+
477
+ upddata2 = JSON.stringify(upddata);
478
+
479
+ insdata2 = JSON.stringify(insdata);
480
+
481
+ url = "sample.php";
482
+
483
+ Ajax.open("POST", url, true);
484
+
485
+ Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
486
+
487
+ Ajax.send("func=" + "upd_data" + "&delid=" + delid2 + "&upddata=" + upddata2 + "&insdata=" + insdata2);
488
+
489
+ Ajax.onreadystatechange = function() {
490
+
491
+ if (Ajax.readyState == 4 && Ajax.status == 200) {
492
+
493
+ getSample();
494
+
495
+ // 配列初期化
496
+
497
+ delid.length=0;
498
+
499
+ upddata.length=0;
500
+
501
+ insdata.length=0;
502
+
503
+ }
504
+
505
+ }
506
+
507
+ }
508
+
509
+
510
+
511
+ </script>
512
+
513
+ </head>
514
+
515
+ <body>
516
+
517
+ <div id="result"></div>
518
+
519
+ </body>
520
+
521
+ </center>
522
+
523
+ </html>
524
+
61
525
  ```
62
526
 
63
527
 

2

文字の訂正

2018/11/10 23:44

投稿

kaya_miyoshi
kaya_miyoshi

スコア23

test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
 
72
72
 
73
- ・fetchAll() を使うと Call to undefined method mysqli_result::fetchAll() のエラーになる。
73
+ ・fetchAll() を使うと Call to undefined method mysqli_result::fetchAll() のエラーになる。
74
74
 
75
75
 
76
76
 

1

環境の追加

2018/11/10 22:24

投稿

kaya_miyoshi
kaya_miyoshi

スコア23

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 下記コードで、
1
+ 下記コードで(MySQL8.0PHP7、Windows 10、sampledb にはデータを格納済み)、
2
2
 
3
3
 
4
4