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

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

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

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

PHP

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

Q&A

解決済

4回答

1524閲覧

1ユーザー複数レコードの更新の方法が分かりません。

earnest_gay

総合スコア615

SQL

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

PHP

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

0グッド

0クリップ

投稿2016/07/11 08:18

1ユーザー複数レコードの更新の方法が分かりません。

下記だと、 WHERE user_id = ?で誰の情報かは分かっています。
ここではAさんだとしましょう。

Aさんはuser_vitaeテーブルに4つのレコードを持っています。
下記では、どのレコードかまでは特定できていないので
すべてのレコードが
最後にUPDATEをかけた内容になってしまいます。

この場合、どうやって各レコードに対して修正をかけれるようになるでしょうか?

言葉ではなく実際のコードがあると理解しやすいと思います。
すいませんが宜しくお願いします。

$sql = "UPDATE user_vitae SET projectTitle = ?, projectsContents = ?, scale = ?, distance = ?, serverOS = ?, DBserver = ?, middleware = ?, programLanguage = ?, contractStart = ?, contractEnd = ?, responsible = ?, learningSkills = ?, comment = ?, checkPlanning = ?, checkRequirement = ?, checkBasicDesign = ?, checkDetailedDesign = ?, checkConstruction = ?, checkTest = ?, checkOperation = ?, businessContent = ? WHERE user_id = ? "; for($i=0;$i<count($_POST['projectTitle']);$i++) { $stmt = $this->pdo->prepare($sql); $stmt->execute([ $_POST['projectTitle'][$i], $_POST['projectsContents'][$i], $_POST['scale'][$i], $_POST['distance'][$i], $_POST['serverOS'][$i], $_POST['DBserver'][$i], $_POST['middleware'][$i], $_POST['programLanguage'][$i], $_POST['contractStartYear'][$i].'-'.$_POST['contractStartMonth'][$i].'-00', $_POST['contractEndYear'][$i].'-'.$_POST['contractEndMonth'][$i].'-00', $_POST['responsible'][$i], $_POST['learningSkills'][$i], $_POST['comment'][$i], $_POST['checkPlanning'][$i], $_POST['checkRequirement'][$i], $_POST['checkBasicDesign'][$i], $_POST['checkDetailedDesign'][$i], $_POST['checkConstruction'][$i], $_POST['checkTest'][$i], $_POST['checkOperation'][$i], $_POST['businessContent'][$i], $_SESSION['id'] ]);

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

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

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

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

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

guest

回答4

0

ベストアンサー

WHERE user_id = ?
だけではどの文書を修正していいかわからないので無理でしょ

しつこいようですが、「修正」をしたいなら、文書を特定するための
文書IDもしくは、user_idと projectTitle の組み合わせを指定しないと・・・

#追記
たとえばこんな受け渡しをするなら

HTML

1<form method="post"> 2<input type="hidden" name="info[record_id][0]" value="53"> 3<ul> 4<li>タイトル:<input type="text" name="info[projectTitle][0]" value="aaa1"></li> 5<li>コンテンツ:<input type="text" name="info[projectsContents][0]" value="aaa2"></li> 6</ul> 7<input type="hidden" name="info[record_id][1]" value="52"> 8<ul> 9<li>タイトル:<input type="text" name="info[projectTitle][1]" value="bbb1"></li> 10<li>コンテンツ:<input type="text" name="info[projectsContents][1]" value="bbb2"></li> 11</ul> 12<input type="hidden" name="info[record_id][2]" value="51"> 13<ul> 14<li>タイトル:<input type="text" name="info[projectTitle][2]" value="ccc1"></li> 15<li>コンテンツ:<input type="text" name="info[projectsContents][2]" value="ccc2"></li> 16</ul> 17<input type="hidden" name="info[record_id][3]" value="50"> 18<ul> 19<li>タイトル:<input type="text" name="info[projectTitle][3]" value="ddd1"></li> 20<li>コンテンツ:<input type="text" name="info[projectsContents][3]" value="ddd2"></li> 21</ul> 22<input type="submit" value="go"> 23</form>

こうやって修正プログラムを回してみてください

PHP

1<?PHP 2$info=filter_input(INPUT_POST,"info", FILTER_DEFAULT , FILTER_REQUIRE_ARRAY); 3foreach($info["record_id"] as $key=>$rec){ 4 $sql ="UPDATE user_vitae "; 5 $sql.="SET projectTitle= ?, "; 6 $sql.="projectsContents= ? "; 7 $sql.="WHERE record_id= ?"; 8 $datas=array( 9 $info["projectTitle"][$key], 10 $info["projectsContents"][$key], 11 $rec, 12 ); 13 print sprintf(str_replace("?","'%s'",$sql),$datas[0],$datas[1],$datas[2]).";<br>\n"; //デバッグ用(エスケープなし) 14 $stmt = $pdo->prepare( $sql); 15 $stmt->execute($datas); 16} 17?>

投稿2016/07/11 08:25

編集2016/07/11 09:30
yambejp

総合スコア114775

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

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

earnest_gay

2016/07/11 08:27

>>文書IDもしくは、user_idと projectTitle の組み合わせを指定 これがどういうことなのかが分からないのです...
yambejp

2016/07/11 08:33

単純にuser_vitaeテーブルに、ユニークなidを振るのです auto_incrementのprimary keyでrecord_idとでもしておけばよいでしょう update user_vitae set ・・・ where record_id=xxx として特定の文書を更新するわけです。 primary keyというのはそのため(文書を特定するため)にあるのですから 文書idをもちたくないなら、前回申し上げたとおり、user_idとprojectTitleの 複合unique(もしくはそれをprimary keyとする)として、 update user_vitae set ・・・ where user_id=xxx and projectTitle=yyy のようにして文書を確定させます。
earnest_gay

2016/07/11 08:52

>>auto_incrementのprimary keyでrecord_idとでもしておけばよいでしょう 文章では理解できますが、そのSQLの組み立てが分からないのです... この本質問の内容でいくと Aさんの4つのレコードには id projectTitle 53 4つめ 52 3つめ 51 2つめ 50 1つめ となっているので、idで判別できるところまでは分ります。 レコードが1つだけなら下記のようにすればいいのは分かるのですが、 レコードが複数になったときのSQLの組み方が分からないのです... $sql = "SELECT * FROM user_vitae WHERE user_id = ?"; $stmtVitae = $pdo->prepare($sql); $stmtVitae->execute([ $_SESSION['id'] ]); $VitaeRow = $stmtVitae->fetch(); $sql = "INSERT INTO user_vitae( ・ ・ ・ ・ ) VALUES (?, ?, ?, ?) WHERE id = ? "; for($i=0;$i<count($_POST['projectTitle']);$i++) { $stmt = $this->pdo->prepare($sql); $stmt->execute([ ・ ・ ・ ・ $VitaeRow['id'] ]);
yambejp

2016/07/11 09:29

具体的な処理を追記しておきました
earnest_gay

2016/07/11 10:24

ありがとうございます! テストしてみたらできました! まだ理解が追い付いていないですが、 じっくり見させていただきたいと思います。
earnest_gay

2016/07/11 13:01

forに捉われていました。 メインファイルでidをhiddenで渡し foreachのkeyも使うことで解決しました。 yambejpさんからたくさんのヒントを頂けました。 ありがとうございます。 function update(){ $sql = "SELECT * FROM user_vitae WHERE user_id = ?"; $stmtVitae = $this->pdo->prepare($sql); $stmtVitae->execute([ $_SESSION['id'] ]); $sql = "UPDATE user_vitae SET projectTitle = ?, projectsContents = ?, scale = ?, distance = ?, serverOS = ?, DBserver = ?, middleware = ?, programLanguage = ?, contractStart = ?, contractEnd = ?, responsible = ?, learningSkills = ?, comment = ?, checkPlanning = ?, checkRequirement = ?, checkBasicDesign = ?, checkDetailedDesign = ?, checkConstruction = ?, checkTest = ?, checkOperation = ?, businessContent = ? WHERE id = ? "; foreach ($stmtVitae as $key => $VitaeRows) { $stmt = $this->pdo->prepare($sql); $stmt->execute([ $_POST['projectTitle'][$key], $_POST['projectsContents'][$key], $_POST['scale'][$key], $_POST['distance'][$key], $_POST['serverOS'][$key], $_POST['DBserver'][$key], $_POST['middleware'][$key], $_POST['programLanguage'][$key], $_POST['contractStartYear'][$key].'-'.$_POST['contractStartMonth'][$key].'-00', $_POST['contractEndYear'][$key].'-'.$_POST['contractEndMonth'][$key].'-00', $_POST['responsible'][$key], $_POST['learningSkills'][$key], $_POST['comment'][$key], $_POST['checkPlanning'][$key], $_POST['checkRequirement'][$key], $_POST['checkBasicDesign'][$key], $_POST['checkDetailedDesign'][$key], $_POST['checkConstruction'][$key], $_POST['checkTest'][$key], $_POST['checkOperation'][$key], $_POST['businessContent'][$key], $_POST['id'][$key] ]); } }
guest

0

下記では、どのレコードかまでは特定できていないので・・・

であるならばdelete & insert が良いと思います。 もし画面上でテーブル項目が足りないので
有れば、Hiddenでデータ渡しを考える方法があります。

投稿2016/07/11 08:29

A.Ichi

総合スコア4070

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

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

earnest_gay

2016/07/11 13:03

回答ありがとうございます。 みなさんのおかげで解決できました!
guest

0

UPDATEのWHERE句にuser_idだけでなく、ほかの条件も指定すると、更新する行を絞り込めます。

WHERE句の条件追加の方法は、SELECTと同様です。

sql

1UPDATE user_vitae SET 2... 3... 4... 5WHERE user_id = ? AND checkTest ?

などなど。

投稿2016/07/11 08:28

A-pZ

総合スコア12011

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

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

earnest_gay

2016/07/11 13:03

回答ありがとうございます。 みなさんのおかげで解決できました!
guest

0

UPDATEはWHERE句に一致したレコード全てに更新をかけます。
更新対象はSELECT句で確認してください。

select * from user_vitae where user_id = 1 ※例です

投稿2016/07/11 08:24

moonphase

総合スコア6621

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

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

earnest_gay

2016/07/11 13:03

回答ありがとうございます。 みなさんのおかげで解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問