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

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

ただいまの
回答率

90.34%

  • PHP

    21323questions

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

  • MySQL

    6167questions

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

複数の変数のupdateについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,127

alkeran

score 18

各店舗(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 );
}
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

 approval.php
<?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);

$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];
}

// 追加
var_dump($sql);
var_dump($condition);

$statement = $pdo->prepare( $sql );
$result = $statement->execute( $condition );
}
?>


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

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

 追記

<?php

ini_set('display_errors', '1');
error_reporting(E_ALL);

if($_SERVER["REQUEST_METHOD"] == 'POST' ) {
    $leaders = $_REQUEST['leaders'];

    $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 = :id";

    var_dump($sql);
    var_dump($leaders);

    $statement = $pdo->prepare( $sql );

    foreach ($leaders as $id => $leader) {
        $statement->bindValue(':leader', (int) $leader, PDO::PARAM_INT);
        $statement->bindValue(':id', $id, PDO::PARAM_INT);
        $results[$id] = $statement->execute();
    }

    var_dump($results);
}
?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 18: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

    キャンセル

  • 2017/02/15 18:34 編集

    それを見やすく整形すると、以下のようになります。

    ■ $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" 部分により、どのソースファイルの何行目でそれが行なわれたかが分かります。

    ただし、該当の箇所でキャストを実行していなくとも、
    そこで呼び出しているメソッドの内部で実行されている場合もあります。

    あとは、ご自分で考えてみてください。

    キャンセル

  • 2017/02/15 19: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 );
    }
    ?>

    キャンセル

  • 2017/02/15 19: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 );
    }
    ?>

    キャンセル

  • 2017/02/15 19:36

    惜しいけど、それも違います。

    エラーなく実行できますが、意図する結果にはなりません。
    おそらく、一番上のチェックボックスの選択内容で、全ての更新対象のレコードを更新してしまうはずです。

    正しく動作するコードを回答欄に追記しましたので、見比べてみてください。

    キャンセル

  • 2017/02/15 20:26

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

    キャンセル

  • 2017/02/15 20:39

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

    その上で、ご自分で考えてみてください。

    キャンセル

  • 2017/02/15 20:56

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

    キャンセル

  • 2017/02/15 20:59

    Good luck!

    キャンセル

+3

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

<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>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 22:17

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

    キャンセル

  • 2017/02/12 22:19 編集

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

    キャンセル

  • 2017/02/12 22:24

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

    キャンセル

  • 2017/02/12 22:28

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

    キャンセル

  • 2017/02/12 22:32

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

    キャンセル

0

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

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

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 17:23

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

    キャンセル

  • 2017/02/12 20:53

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    21323questions

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

  • MySQL

    6167questions

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