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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

6035閲覧

MySQL 複数行のUPDATE

Z-TALBO

総合スコア525

MySQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/02/20 05:19

編集2016/02/22 03:48

formから配列を用いてPOSTされたデータを受け取って、UPDATEしたいのですが、、
配列を受け取るとこまではなんとかなりましたが、そこからのコードがよくわかっておりません。

とりあえず、普通にUPDATEする時(一行だけとか)のコードを書いて、そこから始めればいいかと思い、下記に記載いたします。

PHP

1// POSTの受取 2$ary = $_POST['data']; 3$row_ct = count($ary); 4 5for($i = 0; $i < $row_ct; $i++) { 6$row['data'][$i]['id'] = $_POST['data'][$i]['id']; 7$row['data'][$i]['dakoku'] = $_POST['data'][$i]['dakoku']; 8$row['data'][$i]['hour'] = $_POST['data'][$i]['hour']; 9$row['data'][$i]['minutes'] = $_POST['data'][$i]['minutes']; 10} 11// 一応確認 12// 2行データの例 13print_r($_POST); 14 15// 結果(コードとは別です。表示させただけ) 16Array([data]=>Array([0]=>Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○) 17[1]=>Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××))) 18 19// 基本的な?DBへのコード 20try{ 21$dbh = new PDO(DSN, DB_USER, DB_PASSWORD); 22$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 23$stmt = $dbh->prepare( 24"UPDATE dakokus SET dakoku = ?, hour = ?, minutes = ? WHERE id = ?"); 25 26$stmt->bindParam(1, ???(dakoku), PDO::PARAM_STR); 27$stmt->bindParam(2, ???(hour), PDO::PARAM_STR); 28$stmt->bindParam(3, ???(minutes), PDO::PARAM_STR); 29$stmt->bindParam(4, ???(id), PDO::PARAM_STR); 30 31$stmt->execute(); 32} catch(PDOException $e) { 33echo $e->getMessage(); 34exit; 35}

上記のようにまずは書きました。
配列の取得にforeachでまわすのかなと思ったのですが、、、、
まだ使ったことがほとんどないので、よくわからず、質問させていただきました。

※例外処理等は省略しています。


[追記]
回答者様に教えていただきましたコードにて変更を加えました。

PHP

1try{ 2$dbh = new PDO(DSN, DB_USER, DB_PASSWORD); 3$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 4// 変更点 5foreach($ary as $row) { // 質問上部で$ary = $_POST['data']としていたので、$aryでもいいのかと思い、、、 6$stmt = $dbh->prepare( 7"UPDATE dakokus SET dakoku = ?, hour = ?, minutes = ? WHERE id = ?"); 8 9$stmt->bindValue(1, $row['dakoku'], PDO::PARAM_STR); 10$stmt->bindValue(2, $row['hour'], PDO::PARAM_INT); 11$stmt->bindValue(3, $row['minutes'], PDO::PARAM_INT); 12$stmt->bindValue(4, $row['id'], PDO::PARAM_INT); 13 14$stmt->execute(); 15} 16} catch(PDOException $e) { 17echo $e->getMessage(); 18exit; 19} 20

下記のようにコードを書き直してみました。
結果なのですが、、、どうもUPDATEされておりません。。。
エラー的なものは表示されませんが、、、、
わからないのですが、print $ary . "/" . $row;のようにしてみると
ArrayArrayArray / Arrayと表示されました。

使い方などが間違っているのかもしれません。。。ご指摘ください。


[追記]
ハードルが高いものの中回答いただきありがとうございます。
さて、現在悩んでいるのは教えていただいたコードを入れていくだけではなぜか、値まで辿り着かないという部分です。
頭をリセットするために、最初から少しずつprint_rしながらやってみました。

PHP

1// formからのname(確認のために記載だけ。。。) 2name=data[添字]['dakoku'] 3 4$ary = $_POST['data']; 5print_r($ary); 6// 結果 7// Array([0]=>Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)[1]=>Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××))) 8 9$row_ct = count($ary); 10print_r($row_ct); 11// 結果 12// 2 13 14for($i = 0; $i < $row_ct; $i++) { 15$row = $_POST; 16} 17print_r($row); 18// 結果 19// Array([data]=>Array([0]=>Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)[1]=>Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××))) 20 21foreach($row['data'] as $key) { 22print_r($key); 23// Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××) 24 25print_r($row); 26// for文の結果と同じだが、2行2行の4行で表示 27 28print_r($key['data']); 29print_r($key['data'][0]); 30print_r($key['data'][0]['dakoku']); 31print_r($key['dakoku']);// ['hour']なども同様 32// Null(画面に何も表示なし) 33 34print_r($row['data']); 35// Array([0]=>Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)[1]=>Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××))Array([0]=>Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)[1]=>Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××)) 36 37print_r($row['data'][0]); 38// Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○) 39 40print_r($row['data'][0]['dakoku']); 41// Null(表示なし) 42 43

たぶん、変なことしてるんだと思うのですが、、、、
上記のようにいろいろやってみました。
他にも、いろいろやってると、なんか表示されたりしてましたが、、、
配列エラー?のようなものとか、、、、

forやforeachの動きから見ればと思ってこんな感じでやってしまいました。

どうも、値がヒットしないんですよね。。。

PHP

1foreach($row['data'] as $key) { 2print_r($key); 3print "<br><br>\n"; 4print "key['dakoku']=" . $key['dakoku'] . "<br>";

上記もやってみました。
// 結果
Array(['dakoku']=>○○['hour']=>○○['minutes']=>○○['id']=>○○)

key['dakoku']=
Array(['dakoku']=>××['hour']=>××['minutes']=>××['id']=>××)

key['dakoku']=

となりました。

また、、、for文のところを少し変えてみました

PHP

1for($i = 0; $i < $row_ct; $i++) { 2$row['data'][$i]['dakoku'] = $_POST['data'][$i]['dakoku']; 3$row['data'][$i]['hour'] = $_POST['data'][$i]['hour']; 4$row['data'][$i]['minutes'] = $_POST['data'][$i]['minutes']; 5$row['data'][$i]['id'] = $_POST['data'][$i]['id']; 6}

上記のfor文の場合は、上記のforeachの結果に○○や××が無い状態でした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

POSTデータで複数行分を一気に取るのは初心者には結構ハードルが高いかもしれません。

勉強で作るなら最初は1行分だけ更新するページから作成されて、それが動いてから複数行の更新ページに進んだ方が理解しやすいかと思います。

複数行更新のPOSTデータから取った同じ構造の$rowの中は以下のように参照可能です。

$row['data'] //配列です。 $row['data'][0] //配列です。 $row['data'][0]['name'] //値です。

foreachで処理するならforeach( $row['data'] as $key ) { と書けば、$keyの変数は1次元の配列になります。

PHP

1print_r($key); 2//結果 3Array ( [name] => 山田 太郎 [dakoku] => 出勤 [hour] => 07 [minutes] => 48 ) 4

$row['data']の中の配列($row['data'][0]、$row['data'][1]、$row['data'][2]‥‥)が$keyに格納されます。
したがって$key['name']や$key['dakoku']のように1次元の配列として参照できるようになります。

食事しながらなので手抜きのprint文のサンプルですみません。

PHP

1<? 2 foreach( $row['data'] as $key ) { 3 print_r($key); 4 print "<br><br>\n"; 5 print "key['name']=" . $key['name'] . "<br>"; 6 print "key['dakoku']=" . $key['dakoku'] . "<br>"; 7 } 8?>

投稿2016/02/20 07:22

chinyato

総合スコア241

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

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

Z-TALBO

2016/02/22 03:50

ハードルがたかいのですね。。。 今回とは関係ないものですが、別のサイトでは、一行でのupdateはなんとかできております。 一行だけと、ちょっと複数になるだけで、わからなくなってしまうのは勉強不足ではありますが、、、 ぜひとも解決していきたいのでよろしくお願いします。
Z-TALBO

2016/02/23 03:06

一度BAをつけさせていただきます。 やはり、現状のレベルでは難しい部分もあるかと思ったので、発想をかえたやり方を考えていきますので、またお知恵を拝借できればと思います! 複数行の操作に関しては少しずつ勉強していきます。
guest

0

いい線まで書けています、あと一歩です!

lang

1<?php 2$data = $_POST['data']; 3foreach ($data as $row) { 4 $stmt = $dbh->prepare("UPDATE `dakokus` SET `dakoku` = ?, `hour` = ?, `minutes` = ? WHERE `id` = ?"); 5 $stmt->bindValue(1, $row['dakoku'], PDO::PARAM_STR); 6 $stmt->bindValue(2, $row['hour'], PDO::PARAM_INT); 7 $stmt->bindValue(3, $row['minutes'], PDO::PARAM_INT); 8 $stmt->bindValue(4, $row['id'], PDO::PARAM_INT); 9 $stmt->execute(); 10}

このコードでテーブルにデータを挿入できます。
bindParam は変数の参照を保持して execute が呼び出された時に値の処理が行われるため、bindValue の方がやや直感的だと思います。

例外処理は省略されているとのことですが、$_POST に対する isset 処理など、漏れがちなのでお気をつけください。

投稿2016/02/20 05:30

chitoku

総合スコア1610

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

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

Z-TALBO

2016/02/20 06:04

ありがとうございます! といっても、だいたい人のコードとか見つつなのですが>< 回答内容確認いたしました。 上記の通りに変更を加えてみたのですが、その分を編集で追記いたしますので、確認していただけますか? ちなみに、ちょっとうまくいってなくて、エラーとかは無かったのですが、、、
chitoku

2016/02/20 06:33

$row[dakoku] ではなく $row['dakoku'] です。 PHP の文法では配列の添字に取れるのは文字列か、数値で、dakoku 定数は定義されていないのでエラーになります。
Z-TALBO

2016/02/20 06:35

コメントありがとうございます。 確認しました。質問の編集が間違っておりました。申し訳ございません>< 実際は$row['dakoku']とコードは書いてありましたが、うまくいっていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問