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

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

ただいまの
回答率

90.37%

  • PHP

    25075questions

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

  • MySQL

    7303questions

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

動的にレコードを更新するプログラムにおいて、レコードを更新するパートができない

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,204

fdaf_11111

score 10

動的にレコードを更新するプログラムをつくっています。
update2のボタンを押してレコードを選択すると、名前や値段を入力するフォームが表示され、それに入力すればレコードを更新できるようなプログラムをつくりたいです。
最後に、updateのボタンをおして新たにレコードを更新する段階で躓いています。
update2を選択したときにはGoodsIDをglobal_varという変数に格納したのですが、updateというボタンを押したときにはglobal_varが空になっておりGoodsIDが格納されなくなってしまいます。それが原因で更新することができないのですが、なぜ変数global_varがからになってしまうかがわかりません。
なのでコードの///更新処理のところに原因があると思います。
グローバル変数にしてみましたが解決しませんでした。

<?php
    $res="";
    $res2=[];
    $global_var=""; 
    $USER='root';
    $PW='****';
    $dnsinfo="mysql:dbname=salesmanagement2;host=localhost;charset=utf8";
    $pdo = new PDO($dnsinfo,$USER,$PW);



    //任意のレコードの更新ボタンが押されたときの反応
    if(isset($_POST['update2'])){
        try{
        $sql="select * from goods where GoodsID=?";
        $stmt=$pdo->prepare($sql);
        $array=array($_POST['GoodsID']);


        $stmt->execute($array);
        $row=$stmt->fetch(PDO::FETCH_ASSOC);
        $NewGoodsID=$row['GoodsID'];
        // turn into global variable
        $GLOBALS["global_var"] =$NewGoodsID;

        $NewGoodsName=$row['GoodsName'];
        $NewPrice=$row['Price'];

        }catch(PDOException $e){
            $res=$e->getMessage();
        }        
    }
    /////////


    try{
    $sql="select * from goods";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(null);
    while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
        $res .= "<table><tr><td>" .  $row['GoodsID'] . "</td><td>" . $row['GoodsName'] . "</td><td>".$row['Price']. "yen</td><td>";
        $res .= "<form action='' method='post'>
            <input type='submit' name='update2' value='update2'>
            <input type='hidden' name='GoodsID' value={$row['GoodsID']}>
           </td></form></tr></table>\n";
        }
    }catch(PDOException $e){
    $res=$e->getMessage();
}
    //////更新処理
    if(isset($_POST['update'])){
    try{
        $sql="update goods set Price=?, GoodsName=? where GoodsID=?";
        $stmt=$pdo->prepare($sql);
        $array=array($_POST['NewPrice'],$_POST['NewGoodsName'],$global_var);
        $res2=$array;
        $stmt->execute($array);

    }catch(PDOException $e){
    $ress=$e->getMessage();
    }
}
    ////



?>


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
table{
    width: 50%;
}
td{
    text-align: left;
    width: 25%;
    vertical-align: text-bottom;
}
</style>
</head>
<body>
    <h1>Update Goods Information </h1>
    <?php if(isset($_POST['update2'])){
    ?>

    <form action="" method="post" >
        <p>GoodsID=<?php echo $NewGoodsID; ?></p>
        <label>NewGoodsName<input type="text" name="NewGoodsName" value='<?php echo $NewGoodsName; ?>' size="40"></label>
        <label>NewPrice<input type="text" name="NewPrice" value='<?php echo $NewPrice; ?>'  size="20"> </label>
        <input type="submit" name="update" value="update">
    </form>
    <?php 
    }
    ?>
    <?php echo $res ;?>
    <?php print_r($res2)  ;?>

    <?php echo "global_var=" . $global_var ;?>    

</body>
</html>


ブラウザ画面
はじめの画面
update2を押してレコード選択
updateを押した後

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/10/02 18:35

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

+1

簡単なサンプルコード

<?php

function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}

/**
 * データベース接続
 * @return \PDO
 */
function connect()
{
    $dsn = 'mysql:dbname=sample;host=localhost;charset=utf8';
    $user = 'root';
    $password = 'password';
    $option = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );

    return new PDO($dsn, $user, $password, $option);
}

/**
 * 商品を全て取得
 * @return array
 */
function getAll()
{
    $objPdo = connect();
    $statement = 'SELECT id, name, price FROM goods';
    $stmt = $objPdo->prepare($statement);
    $stmt->execute();
    return $stmt->fetchAll();
}

/**
 * 選択した商品を取得する
 * @return type
 */
function getGood()
{
    $objPdo = connect();
    $statement = 'SELECT id, name, price FROM goods WHERE id=?';
    $stmt = $objPdo->prepare($statement);
    $id = filter_input(INPUT_GET, 'id');
    $stmt->execute(array($id));
    return $stmt->fetch();
}

/**
 * 選択した商品情報を更新する
 */
function updateGood()
{
    if (is_null(filter_input_array(INPUT_POST))) {
        return;
    }
    $objPdo = connect();
    $statement = 'UPDATE goods SET name=:name, price=:price WHERE id=:id';
    $stmt = $objPdo->prepare($statement);

    $stmt->bindParam(':id', filter_input(INPUT_GET, 'id'), PDO::PARAM_INT);
    $stmt->bindParam(':name', filter_input(INPUT_POST, 'name'), PDO::PARAM_STR);
    $stmt->bindParam(':price', filter_input(INPUT_POST, 'price'), PDO::PARAM_INT);
    return $stmt->execute();
}

try {
    updateGood();
    $selectedGood = getGood();
} catch (Exception $e) {

}
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="" method="post">
            <p>
                id <?= h(filter_input(INPUT_GET, 'id')); ?>
            </p>
            <p>
                <label for="name">name</label>
                <input type="text" name="name" id="name" value="<?= h($selectedGood['name']); ?>" />
            </p>
            <p>
                <label for="price">price</label>
                <input type="text" name="price" id="price" value="<?= h($selectedGood['price']); ?>" />
            </p>
            <p>
                <button type="submit">更新</button>
            </p>
        </form>
        <div>
            <table>
                <?php foreach (getAll() as $good) : ?>
                    <tr>
                        <td><?= h($good['id']); ?></td>
                        <td><?= h($good['name']); ?></td>
                        <td><?= h($good['price']); ?></td>
                        <td>
                            <a href="?id=<?= h($good['id']); ?>">更新</a>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </table>
        </div>
    </body>
</html>

テーブル定義

CREATE TABLE `goods` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

そりゃあ、リクエストのたびに、$global_var="";が実行されるからでしょう。
GoodsIDをhiddenで持たせてやれば・・・・ってあれ?、そうなってますね;

ここを

$array=array($_POST['NewPrice'],$_POST['NewGoodsName'],$global_var);


こうすればOKなのでは。。

$array=array($_POST['NewPrice'],$_POST['NewGoodsName'],$_POST['GoodsID']);

そういうことではなくて? 外してたらごめんなさい。。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/02 06:52

    すいません。訂正です。
    x updateのform内に
    ○ updateのform内にも

    update2のポスト時にも、GoodsIDをhiddenタグで書き出してやればOKかと。

    キャンセル

  • 2016/10/02 18:11

    解決しました。ありがとうございました

    キャンセル

  • 2016/10/03 08:56

    フォームデータはサニタイズしてくださいね

    キャンセル

-1

<?php
    $res="";
    $res2=[];
    $global_var=""; 
    $USER='root';
    $PW='****';
    $dnsinfo="mysql:dbname=salesmanagement2;host=localhost;charset=utf8";
    $pdo = new PDO($dnsinfo,$USER,$PW);
    // ++++ 追加 ++++
    $hidden_tag_for_update_form = "";

    //任意のレコードの更新ボタンが押されたときの反応
    if(isset($_POST['update2'])){
        try{
        // ++++ 追加 ++++
        $hidden_tag_for_update_form = '<input type="hidden" name="GoodsID" value="' .$_POST['GoodsID']. '">';

        $sql="select * from goods where GoodsID=?";
        $stmt=$pdo->prepare($sql);
        $array=array($_POST['GoodsID']);


        $stmt->execute($array);
        $row=$stmt->fetch(PDO::FETCH_ASSOC);
        $NewGoodsID=$row['GoodsID'];
        // turn into global variable
        $GLOBALS["global_var"] =$NewGoodsID;

        $NewGoodsName=$row['GoodsName'];
        $NewPrice=$row['Price'];

        }catch(PDOException $e){
            $res=$e->getMessage();
        }        
    }
    /////////


    try{
    $sql="select * from goods";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(null);
    while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
        $res .= "<table><tr><td>" .  $row['GoodsID'] . "</td><td>" . $row['GoodsName'] . "</td><td>".$row['Price']. "yen</td><td>";
        $res .= "<form action='' method='post'>
            <input type='submit' name='update2' value='update2'>
            <input type='hidden' name='GoodsID' value={$row['GoodsID']}>
           </td></form></tr></table>\n";
        }
    }catch(PDOException $e){
    $res=$e->getMessage();
}
    //////更新処理
    if(isset($_POST['update'])){
    try{
        $sql="update goods set Price=?, GoodsName=? where GoodsID=?";
        $stmt=$pdo->prepare($sql);
        $array=array($_POST['NewPrice'],$_POST['NewGoodsName'],$_POST['GoodsID']);
        $res2=$array;
        $stmt->execute($array);

    }catch(PDOException $e){
    $ress=$e->getMessage();
    }
}
    ////



?>


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
table{
    width: 50%;
}
td{
    text-align: left;
    width: 25%;
    vertical-align: text-bottom;
}
</style>
</head>
<body>
    <h1>Update Goods Information </h1>
    <?php if(isset($_POST['update2'])){
    ?>

    <form action="" method="post" >
        <p>GoodsID=<?php echo $NewGoodsID; ?></p>
        <label>NewGoodsName<input type="text" name="NewGoodsName" value='<?php echo $NewGoodsName; ?>' size="40"></label>
        <label>NewPrice<input type="text" name="NewPrice" value='<?php echo $NewPrice; ?>'  size="20"> </label>
        <!-- +++++ 追加 ++++ -->
        <?php echo $hidden_tag_for_update_form; ?>
        <input type="submit" name="update" value="update">
    </form>
    <?php 
    }
    ?>
    <?php echo $res ;?>
    <?php print_r($res2)  ;?>

    <?php echo "global_var=" . $global_var ;?>    

</body>
</html>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/02 07:28

    XSS脆弱性がありますよ。

    キャンセル

  • 2016/10/02 08:26

    たしかに。
    sibuyaさんのサンプル、勉強になりました。

    キャンセル

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

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • PHP

    25075questions

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

  • MySQL

    7303questions

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

  • トップ
  • PHPに関する質問
  • 動的にレコードを更新するプログラムにおいて、レコードを更新するパートができない