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

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

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

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

PHP

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

Q&A

解決済

3回答

3213閲覧

複数の変数のupdateについて

alkeran

総合スコア29

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/02/12 00:27

編集2017/02/15 07:22

各店舗(id)のリーダー(leaders)に、なる(value=2)ならない(value=3)をupdateしたいのですが以下のコードを実行してもカラムの値が変わることはありません。
正しいコードを教えて頂きたいのですが、どなたかご教授をよろしくお願い致します。

<form method="post" action="approval.php"> <?php try { $dsn='mysql:dbname=xxx;host=xxx;charset=utf8'; $user='xxx'; $password='xxx'; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql="SELECT * FROM user_list WHERE group_name=? && leader=0"; $stmt=$dbh->prepare($sql); $data[]=$_SESSION['group_name']; $stmt -> execute($data); $dbh=null; while(true) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print '<tr><td><input type="checkbox" name="leaders['; print htmlspecialchars( $rec['id'], ENT_QUOTES); print ']" value="2" checked="checked"></td>'; print '<td><input type="checkbox" name="leaders['; print htmlspecialchars( $rec['id'], ENT_QUOTES); print ']" value="3"></td>'; print '<td>'; print $rec['name']; print '</td>'; print '<td>'; print $rec['request_day']; print '</td></tr>'; print'<input type="hidden" name="ids[]" value="'; print htmlspecialchars( $rec['id'], ENT_QUOTES); print'">'; } print '</table >'; print '<div>&nbsp;</div>'; print'<input type="submit" value="返答をメールする" name="change"/>'; print'</form>'; } catch (Exception $e) { print '<div>&nbsp;</div>'; print '<div>&nbsp;</div>'; print '<font color="green">'; print 'ただいまシステム障害により本サービスを利用することができません。</br></br>大変ご迷惑をお掛けしております。'; print '</font>'; exit(); } } ?> <input type="submit" value="返答をメールする" name="change"/> </form>

approval.php

<?php if($_SERVER["REQUEST_METHOD"] == 'POST' ) { $leaders = $_REQUEST['leaders']; $ids = $_REQUEST['ids']; $pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $ins = array(); for($i=0; $i<count($ids); $i++) { $ins[] = ":id{$i}"; } $sql = "update user_list set leader=:leader where id in (" . implode(', ',$ins) . ")"; $condition = array(":leader" => $leaders); for($i=0; $i<count($ids); $i++) { $condition[":id{$i}"] = $ids[$i]; } $statement = $pdo->prepare( $sql ); $result = $statement->execute( $condition ); } ?>

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

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

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

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

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

guest

回答3

0

ベストアンサー

approval.php

php

1<?php 2 3// 追加 4ini_set('display_errors', '1'); 5error_reporting(E_ALL); 6 7if($_SERVER["REQUEST_METHOD"] == 'POST' ) { 8$leaders = $_REQUEST['leaders']; 9$ids = $_REQUEST['ids']; 10 11$pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); 12 13// 追加 14$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 15 16$ins = array(); 17for($i=0; $i<count($ids); $i++) { 18 $ins[] = ":id{$i}"; 19} 20 21$sql = "update user_list set leader=:leader where id in (" . implode(', ',$ins) . ")"; 22$condition = array(":leader" => $leaders); 23for($i=0; $i<count($ids); $i++) { 24 $condition[":id{$i}"] = $ids[$i]; 25} 26 27// 追加 28var_dump($sql); 29var_dump($condition); 30 31$statement = $pdo->prepare( $sql ); 32$result = $statement->execute( $condition ); 33} 34?>

これで、変数$sql$conditionのデータ構造がブラウザに表示され、
さらに何らかの PDO関連のエラーが発生した場合、ただちに処理を中断し、エラーメッセージをブラウザに表示するようになります。

この状態で再度、approval.php を実行し、ブラウザに表示されるメッセージを確認してください。

追記

php

1<?php 2 3ini_set('display_errors', '1'); 4error_reporting(E_ALL); 5 6if($_SERVER["REQUEST_METHOD"] == 'POST' ) { 7 $leaders = $_REQUEST['leaders']; 8 9 $pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); 10 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 11 12 13 $sql = "update user_list set leader= :leader where id = :id"; 14 15 var_dump($sql); 16 var_dump($leaders); 17 18 $statement = $pdo->prepare( $sql ); 19 20 foreach ($leaders as $id => $leader) { 21 $statement->bindValue(':leader', (int) $leader, PDO::PARAM_INT); 22 $statement->bindValue(':id', $id, PDO::PARAM_INT); 23 $results[$id] = $statement->execute(); 24 } 25 26 var_dump($results); 27} 28?>

投稿2017/02/15 07:47

編集2017/02/15 10:33
KiyoshiMotoki

総合スコア4791

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

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

alkeran

2017/02/15 09:06

2店舗のleaderカラムを"2"にupdateしようと実行したら、以下のエラーが表示されました。 どうすればよろしいでしょうか? string(60) "update user_list set leader=:leader where id in (:id0, :id1)" array(3) { [":leader"]=> array(2) { [4]=> string(1) "2" [7]=> string(1) "2" } [":id0"]=> string(1) "4" [":id1"]=> string(1) "7" } Notice: Array to string conversion in .../approval.php on line xxx
KiyoshiMotoki

2017/02/15 09:36 編集

それを見やすく整形すると、以下のようになります。 ■ $sql のデータ構造  string(60) "update user_list set leader=:leader where id in (:id0, :id1)" ■ $condition のデータ構造  array(3) {    [":leader"]=> array(2) {      [4]=> string(1) "2"      [7]=> string(1) "2"    }    [":id0"]=> string(1) "4"    [":id1"]=> string(1) "7"  } ■ エラーメッセージ  Notice: Array to string conversion in .../approval.php on line xxx 「Notice: Array to string conversion」 とは、配列を文字列にキャストしようとした際に表示されるエラーメッセージです。 "in .../approval.php on line xxx" 部分により、どのソースファイルの何行目でそれが行なわれたかが分かります。 ただし、該当の箇所でキャストを実行していなくとも、 そこで呼び出しているメソッドの内部で実行されている場合もあります。 あとは、ご自分で考えてみてください。
alkeran

2017/02/15 10:08

以下のコードに直したのですが、 string(54) "update user_list set leader=:leader where id in (4, 7)" array(1) { [":leader"]=> array(2) { [4]=> string(1) "2" [7]=> string(1) "2" } } Notice: Array to string conversion in .../approval.php on line xxx というエラーが出ました。 <?php ini_set('display_errors', '1'); error_reporting(E_ALL); if($_SERVER["REQUEST_METHOD"] == 'POST' ) { $leaders = $_REQUEST['leaders']; $ids = $_REQUEST['ids']; $pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql = "update user_list set leader=:leader where id in (" . implode(', ',$ids) . ")"; $condition = array(":leader" => $leaders); var_dump($sql); var_dump($condition); $statement = $pdo->prepare( $sql ); $result = $statement->execute( $condition ); } ?>
alkeran

2017/02/15 10:12

以下のコードで成功することができました。 ありがとうございました。 <?php ini_set('display_errors', '1'); error_reporting(E_ALL); if($_SERVER["REQUEST_METHOD"] == 'POST' ) { $leaders = $_REQUEST['leaders']; $ids = $_REQUEST['ids']; $pdo = new PDO("mysql:host=xxx; dbname=xxx; charset=utf8", "xxx", "xxx", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql = "update user_list set leader=:leader where id in (" . implode(', ',$ids) . ")"; $condition = array(":leader" => implode(', ',$leaders)); var_dump($sql); var_dump($condition); $statement = $pdo->prepare( $sql ); $result = $statement->execute( $condition ); } ?>
KiyoshiMotoki

2017/02/15 10:36

惜しいけど、それも違います。 エラーなく実行できますが、意図する結果にはなりません。 おそらく、一番上のチェックボックスの選択内容で、全ての更新対象のレコードを更新してしまうはずです。 正しく動作するコードを回答欄に追記しましたので、見比べてみてください。
alkeran

2017/02/15 11:26

ありがとうございます。 $ids = $_REQUEST['ids']; は不必要でしょうか?
KiyoshiMotoki

2017/02/15 11:39

approval.php に  var_dump($_REQUEST['leaders']); という一行を追加し、リクエストパラメータ 'leaders' がどのような構造になっているか 確認してみてください。 その上で、ご自分で考えてみてください。
alkeran

2017/02/15 11:56

本当にありがとうございます。 成功しましたが、idsという変数を渡しているのに、$idで認識されるのが不思議です。 じっくり考えたいと思います。
guest

0

とりあえずですが、不要な括弧を取り除きました。これでどうでしょうか?

PHP

1<form method="post" action="approval.php"> 2 3 <?php 4 try { 5 6 $dsn = 'mysql:dbname=xxx;host=xxx;charset=utf8'; 7 $user = 'xxx'; 8 $password = 'xxx'; 9 $dbh = new PDO($dsn, $user, $password); 10 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 11 12 $sql = "SELECT * FROM user_list WHERE group_name=? && leader=0"; 13 $stmt = $dbh->prepare($sql); 14 $data[] = $_SESSION['group_name']; 15 $stmt->execute($data); 16 17 $dbh = null; 18 19 while (true) { 20 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 21 if ($rec == false) { 22 break; 23 } 24 25 print '<tr><td><input type="checkbox" name="leaders['; 26 print htmlspecialchars($rec['id'], ENT_QUOTES); 27 print ']" value="2" checked="checked"></td>'; 28 print '<td><input type="checkbox" name="leaders['; 29 print htmlspecialchars($rec['id'], ENT_QUOTES); 30 print ']" value="3"></td>'; 31 print '<td>'; 32 print $rec['name']; 33 print '</td>'; 34 35 print '<td>'; 36 print $rec['request_day']; 37 print '</td></tr>'; 38 print'<input type="hidden" name="ids[]" value="'; 39 print htmlspecialchars($rec['id'], ENT_QUOTES); 40 print'">'; 41 } 42 print '</table >'; 43 print '<div>&nbsp;</div>'; 44 print'<input type="submit" value="返答をメールする" name="change"/>'; 45 print'</form>'; 46 } catch (Exception $e) { 47 print '<div>&nbsp;</div>'; 48 print '<div>&nbsp;</div>'; 49 print '<font color="green">'; 50 print 'ただいまシステム障害により本サービスを利用することができません。</br></br>大変ご迷惑をお掛けしております。'; 51 print '</font>'; 52 exit(); 53 } 54 ?> 55 56 <input type="submit" value="返答をメールする" name="change"/> 57</form>

投稿2017/02/12 08:53

s8_chu

総合スコア14731

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

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

alkeran

2017/02/12 13:17

ありがとうございます。 できませんでした。すみません。
s8_chu

2017/02/12 13:19 編集

エラーが発生しているならば、それを掲載すると良いと思いますが、エラーは出ていないのでしょうか?
alkeran

2017/02/12 13:24

エラーは出ていません。 DBは何も変化がありません。
s8_chu

2017/02/12 13:28

実行できないということはエラーが発生していると考えられるのですが、PHPでエラーを表示する設定はしているのですか?
alkeran

2017/02/12 13:32

はい。onにしています。 それぞれのidごとにleaderのデータを上書きしたいのですが...。
guest

0

「実行することができません」とは具体的にどうなるのでしょうか?
-> エラーがでる? or
-> 無反応? or
-> 意図しないデータが挿入されている? or
-> 意図したelementと異なるものの値が更新されている?

またこの質問で得たい情報は何でしょう?
-> 何故動かないのかの理由?
-> 何が問題なのか?
-> 正しいコード?

とりあえず理由に関して
原因と思われる部分は以下です。

php

1$sql = "update user_list set leader=:leader where id in (" . implode(', ',$ins) . ")"; //*3 2$condition = array(":leader" => $leaders); //*1 3for($i=0; $i<count($ids); $i++) { 4 $condition[":id{$i}"] = $ids[$i]; //*2 5}

*1 では$conditionの値は次のようになってるはずです。
array(":leader" => array(xxx,yyy,zzz)) ※中の配列には$leadersが入っている
2 $conditionの中は上記の通りで、[':id{$i}']の展開は[':id1']のようなデータだと思いますが、なんてキーは無いはずなので、恐らく何も起きないでしょう。
最終的に
3のsqlの内容は次のようになると思われ、この通りだとSQLは正常に実行されないので、エラーになるか、何も実行しないかだと思います。

sql

1UPDATE user_list 2SET leader=[:learer => array-object] 3WHERE id IN ("1,2,3,4,5")

投稿2017/02/12 02:07

hrk_

総合スコア14

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

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

alkeran

2017/02/12 08:23

無反応です。カラムの leader が何も変化しません。2 or 3 をupdateしたいのですが...。
alkeran

2017/02/12 11:53

正しいコードを教えて頂きたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問