前提・実現したいこと
PHP初心者です。
現在、ブラウザ上で各セルにフォーム機能を持たせたテーブルを作り、
各フォームに値を入力し、一括でUPDATE出来るWebアプリケーションを作ろうとしています。
実際には、以下の様なコードでやりたいことは実現できているのですが、
SQL処理を二回foreachしているので、負荷がかかってあまり推奨できるやり方ではありません。。。
該当のソースコード
PHP
1//POSTする側のコードです。 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>データを更新する</title> 9</head> 10<body> 11 <pre> 12 <?php 13 $tab_name = $_POST["table_title"]; 14 $stmt = $db->query("SELECT*FROM $tab_name"); 15 echo "<p>更新したい対象データを入力し、新しいデータに書き換えてください</p>"; 16 echo "<h1>$tab_name</h1>"; 17 18 $col = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='mydb'AND TABLE_NAME='".$tab_name."'"; 19 $stmt2 =$db->query($col); 20 if(!$col){//もし、$colの内容が変だったら、エラーメッセージを出すようにする 21 echo $db->errorInfo(); 22 exit(); 23 } 24 echo '<form action="updateDetail.php" method="POST">'; 25 echo "<table border=1 style=border-collapse:collapse>"; 26 //繰り返し処理を使って、テーブルの見出しを表示 27 //配列からテーブルの見出しの情報のみを取り出し 28 echo "<tr>"; 29 while ($retu=$stmt2->fetch(PDO::FETCH_ASSOC)){ 30 foreach($retu as $koumoku){ 31 32 echo "<th>"; 33 echo"$koumoku"; 34 echo "</th>"; 35 } 36 } 37 echo "</tr>"; 38 //テーブルを繰り返しを使って描画する 39 40 echo "<tr><th></th>"; 41 echo "<th>fullname"; 42 echo "</th>"; 43 echo "<th>age"; 44 echo "</th>"; 45 echo "</tr>"; 46 foreach($stmt as $row){ 47 echo "<tr>"; 48 echo "<td>"; 49 echo '<input type="hidden" name="id[]" value='."$row[id]".'>'; 50 echo '<input type="hidden" name="tab_name" value='."$tab_name".'>'; 51 echo "</td>"; 52 53 echo "<td>"; 54 echo '<input type="text" name="fullname[]" value='."$row[fullname]".'>'; 55 echo "</td>"; 56 57 echo "<td>"; 58 echo '<input type="text" name="age[]" value='."$row[age]".'>'; 59 echo "</td>"; 60 61 echo "</tr>"; 62 63 } 64 65 ?> 66 </table> 67 <input type="submit" value="送信する"> 68 </form> 69 70 </pre> 71 72 <br><a href="updateTableSelect.php">戻る</a> 73</body> 74</html> 75 76//↓以下フォーム送信後の内容です 77 78<!DOCTYPE html> 79<html lang="en"> 80<head> 81 <meta charset="UTF-8"> 82 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 83 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 84 <title>Document</title> 85</head> 86<body> 87 <p>データを更新しました</p> 88 <?php 89 $fullname = $_POST['fullname']; 90 $age = $_POST["age"]; 91 $id= $_POST["id"]; 92 $table = $_POST["tab_name"]; 93 94 echo '<pre>'; 95 96 echo '<a href="toppage.php">戻る</a>'; 97 98 //以下の方法はSQLに負荷がかかるので推奨されない 99 //fullnameをidと紐づけて更新する 100 $Fullname=array_combine($id,$fullname); 101 foreach($Fullname as $keyid=>$valuename){ 102 $sql="UPDATE $table SET fullname=:fullname WHERE id=:id"; 103 $stm=$db->prepare($sql); 104 $stm->bindValue(':fullname',"$valuename"); 105 $stm->bindValue(':id',"$keyid"); 106 $stm->execute(); 107 } 108 109 //ageをidと紐づけて更新する 110 $Age=array_combine($id,$age); 111 foreach($Age as $keyid=>$valueage){ 112 $sql2="UPDATE $table SET age=:age WHERE id=:id"; 113 $stm=$db->prepare($sql2); 114 $stm->bindValue(':age',"$valueage"); 115 $stm->bindValue(':id',"$keyid"); 116 $stm->execute(); 117 } 118 119 ?> 120
###試したこと
例えば、以下の様な配列を作成することができれば、
PHP
1array (size=2) 2 1 => 3 array (size=2) 4 'fullname' => string 'name1' (length=5) 5 'age' => string '10' (length=2) 6 2 => 7 array (size=2) 8 'fullname' => string 'name2' (length=5) 9 'age' => string '20' (length=2)
foreach をid単位で回して、fullnameとageをいっぺんに更新することが可能だと思うのですが…
連想多次元配列を上手く組めなくて苦戦しております。。。
###一例
PHP
1for($i=0;$i<10;$i++){ 2 $array=array( 3 "id"=>"$id[$i]", 4 array( 5 "name"=>"$fullname[$i]", 6 "age"=>"$age[$i]" 7 ) 8 );
上記の様な方法を考えたりもしましたが、配列の個数を指定しなければならない(制限を設けたくない)のと、
どの様にUPDATE繰り返し処理に持ち込めば良いのか、混乱してしまいよくわからなくなってしまいました。
スマートなやり方をご存知の方いらっしゃいましたら、是非お力添えをよろしくお願いいたします。
全体的に拙い説明で申し訳ありません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/17 05:05
退会済みユーザー
2019/10/17 05:45
2019/10/17 07:46