質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

3回答

10766閲覧

【PHPmySQL】複数行をUPDATEするSQL文【PDO】

phiilo_

総合スコア85

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/08/17 07:02

編集2017/08/17 08:20

イメージ説明

図のように、表の1つ1つのセルに入力(input)できるようになっており、UPDボタンを押すと、
データベースに入っている値がアップデートできるようにしたいと考えています。
(下記URLでHTMLをご確認いただけます)

JSFiddle
https://jsfiddle.net/knxuq305/

1行ずつであれば下記UPDATE文で良いかと思います。

PHP

1<?php 2 //DB接続済($dbh) 3 $ID01 = "1"; 4 $ID02 = "2"; 5 $ID03 = "3"; 6 7 $NAME1 = "ごりら"; 8 $NAME2 = "らっぱ"; 9 $NAME3 = "ぱんだ"; 10 $NAME4 = "だんご"; 11 12 $var1 = $_POST['d01']; 13 $var2 = $_POST['d02']; 14 $var3 = $_POST['d03']; 15 $var4 = $_POST['d04']; 16 $var5 = $_POST['d05']; 17181920 21 //1行目の値をアプデ 22 $sql = "UPDATE `テーブル` SET `$NAME1` = '$var1', `$NAME2` = '$var2', `$NAME3` = '$var3', `$NAME4` = '$var4', WHERE ID = '$ID01'"; 23 $stmt = $dbh -> prepare( $sql ); 24 $stmt -> execute(); 25 26?> 27 28<html> 29 <form action="" method="post" > 30 <table> 31 <tbody> 32 33 <tr> 34 <td>ID</td> 35 <td>ごりら</td> 36 <td>らっぱ</td> 37 <td>ぱんだ</td> 38 <td>だんご</td> 39 </tr> 40 41 <tr> 42 <td>1</td> 43 <td><input type="text" name="d01" value="452"></td> 44 <td><input type="text" name="d02" value="545"></td> 45 <td><input type="text" name="d03" value="452"></td> 46 <td><input type="text" name="d04" value="245"></td> 47 </tr> 48 49 <tr> 50 <td>2</td> 51 <td><input type="text" name="d05" value="842"></td> 52 <td><input type="text" name="d06" value="585"></td> 53 <td><input type="text" name="d07" value="882"></td> 54 <td><input type="text" name="d08" value="335"></td> 55 </tr> 56 57 <tr> 58 <td>3</td> 59 <td><input type="text" name="d09" value="452"></td> 60 <td><input type="text" name="d10" value="545"></td> 61 <td><input type="text" name="d11" value="452"></td> 62 <td><input type="text" name="d12" value="245"></td> 63 </tr> 64 65 </tbody> 66 </table> 67 68 <center><input type="submit" value="UPD"></center> 69 </form> 70</html> 71

例えばこれが1000行あって、それぞれのフィールドに異なる値をいれたい場合、
1行ずつSQL文を記述しては冗長になってしまいます。

もう少し簡潔に記述できれば教えていただきたいです。
質問内容が意味不明であれば、お手数ですがご指摘ください。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

SQL文について考え方が2つあります

  • insert on duplicateで処理する

idに紐づくデータが元テーブルない場合は追加されてしまいますが
それでもいいなら以下がラクです

SQL

1create table tbl1(id int unique key,gorira int,rappa int,panda int,dango int); 2insert into tbl1(id) values(1),(2),(3); 3insert into tbl1 4select 1,452,545,452,245 5union all select 2,842,585,882,335 6union all select 3,452,545,452,245 7on duplicate key update gorira=values(gorira),rappa=values(rappa),panda=values(panda),dango=values(dango)
  • FILED/ELTで処理

idが存在しなければ無視する純粋なupdateです
絡むごとにidを指定するのが煩雑ですが、insert updateより
効率はよいです

SQL

1create table tbl2(id int unique key,gorira int,rappa int,panda int,dango int); 2insert into tbl2(id) values(1),(2),(3); 3update tbl2 set 4gorira=COALESCE(ELT(FIELD(id,1,2,3),452,842,452),gorira) 5,rappa=COALESCE(ELT(FIELD(id,1,2,3),545,585,545),rappa) 6,panda=COALESCE(ELT(FIELD(id,1,2,3),452,882,452),panda) 7,dango=COALESCE(ELT(FIELD(id,1,2,3),245,335,245),dango) 8

投稿2017/08/30 02:26

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その前に、このコードではPHPがフォームからの入力のうち最後の1件しか取得できません(この場合はID3)。
また、IDをフォームから受け取れていません。

<tr> <td>1<input type="hidden" name="id[]" value="1"></td> <td><input type="text" name="d02[]" value="452"></td> <td><input type="text" name="d03[]" value="545"></td> <td><input type="text" name="d04[]" value="452"></td> <td><input type="text" name="d05[]" value="245"></td> </tr>

nameに[]を付けると複数の値を受け取れます(PHP限定だと思いますが)。
IDなど、編集させたくない内容はhiddenで隠したりします。

また、POSTされた値をPHPが受け取るための記述が抜け落ちています。
POSTされた値は$_POST変数に格納されています。

後は、要素の数だけforループで回せば良いでしょう。
同じSQLを値を代えて使いまわすにはプリペアドステートメントという機能を使います。$stmt->bindValue()で値をはめ込みます。

$sql = "UPDATE `テーブル` SET `$NAME1` = :name1, `$NAME2` = :name2, `$NAME3` = :name3, `$NAME4` = :name4, WHERE ID = :id; $stmt = $dbh -> prepare( $sql ); $stmt->bindValue(':name1', $name1); $stmt->bindValue(':name1', $name2); $stmt->bindValue(':name1', $name3); $stmt->bindValue(':name1', $name4); $stmt->bindValue(':name1', $id); $stmt -> execute();

書き方を洗練させる事を考える前に、まず動かしてみる事から始めるのを強くおすすめします。
動いたコードを洗練させるアドバイスであればできますが、
動きもしないものを洗練させることはできません。

投稿2017/08/17 07:37

tsuemura

総合スコア663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phiilo_

2017/08/17 08:04

HTMLを他に記述したのがいけなかったですね。 $NAME1 =$_POST['name1']; $NAME2 =$_POST['name2']; ・ ・ ・ というように質問を書き換えます。 name属性に配列が使えたり、bindValueとprepareの違いがイマイチよくわからなかったので勉強になりました。頑張ってみます。
guest

0

各行のinputに行数と通し番号でIDをつけて、
forで行数分繰り返し処理してやれば良いのでは。
下記の例ですと、例えば1行目1マス目のIDを$v1001、2マス目を$v1002という変数に格納します。

PHP

1for ($i = 1; $i <= 10; $i++) { 2 ${"v".$i."001"}=[n行1マス目]; 3 ${"v".$i."002"}=[n行2マス目]; 4 $sql = "UPDATE `テーブル` SET `$NAME1` = ${"v".$i."001"}, `$NAME2` = ${"v".$i."001"} WHERE ID = '$ID01'"; 5 $stmt = $dbh -> prepare( $sql ); 6 $stmt -> execute(); 7}

//他に良いやり方があれば皆様お願い致します。

投稿2017/08/17 07:21

nora_kuragen

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phiilo_

2017/08/17 08:06

たしかにfor文で行数分のSQL文を繰り返せば実行できますね。ちょっとやってみますー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問