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

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

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

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

PHP

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

Q&A

解決済

3回答

4155閲覧

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

fdaf_11111

総合スコア16

MySQL

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

PHP

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

0グッド

1クリップ

投稿2016/10/01 20:59

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

php

1<?php 2 $res=""; 3 $res2=[]; 4 $global_var=""; 5 $USER='root'; 6 $PW='****'; 7 $dnsinfo="mysql:dbname=salesmanagement2;host=localhost;charset=utf8"; 8 $pdo = new PDO($dnsinfo,$USER,$PW); 9 10 11 12 //任意のレコードの更新ボタンが押されたときの反応 13 if(isset($_POST['update2'])){ 14 try{ 15 $sql="select * from goods where GoodsID=?"; 16 $stmt=$pdo->prepare($sql); 17 $array=array($_POST['GoodsID']); 18 19 20 $stmt->execute($array); 21 $row=$stmt->fetch(PDO::FETCH_ASSOC); 22 $NewGoodsID=$row['GoodsID']; 23 // turn into global variable 24 $GLOBALS["global_var"] =$NewGoodsID; 25 26 $NewGoodsName=$row['GoodsName']; 27 $NewPrice=$row['Price']; 28 29 }catch(PDOException $e){ 30 $res=$e->getMessage(); 31 } 32 } 33 ///////// 34 35 36 try{ 37 $sql="select * from goods"; 38 $stmt=$pdo->prepare($sql); 39 $stmt->execute(null); 40 while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ 41 $res .= "<table><tr><td>" . $row['GoodsID'] . "</td><td>" . $row['GoodsName'] . "</td><td>".$row['Price']. "yen</td><td>"; 42 $res .= "<form action='' method='post'> 43 <input type='submit' name='update2' value='update2'> 44 <input type='hidden' name='GoodsID' value={$row['GoodsID']}> 45 </td></form></tr></table>\n"; 46 } 47 }catch(PDOException $e){ 48 $res=$e->getMessage(); 49} 50 //////更新処理 51 if(isset($_POST['update'])){ 52 try{ 53 $sql="update goods set Price=?, GoodsName=? where GoodsID=?"; 54 $stmt=$pdo->prepare($sql); 55 $array=array($_POST['NewPrice'],$_POST['NewGoodsName'],$global_var); 56 $res2=$array; 57 $stmt->execute($array); 58 59 }catch(PDOException $e){ 60 $ress=$e->getMessage(); 61 } 62} 63 //// 64 65 66 67?> 68 69 70<!DOCTYPE html> 71<html> 72<head> 73<meta charset="utf-8"> 74<style> 75table{ 76 width: 50%; 77} 78td{ 79 text-align: left; 80 width: 25%; 81 vertical-align: text-bottom; 82} 83</style> 84</head> 85<body> 86 <h1>Update Goods Information </h1> 87 <?php if(isset($_POST['update2'])){ 88 ?> 89 90 <form action="" method="post" > 91 <p>GoodsID=<?php echo $NewGoodsID; ?></p> 92 <label>NewGoodsName<input type="text" name="NewGoodsName" value='<?php echo $NewGoodsName; ?>' size="40"></label> 93 <label>NewPrice<input type="text" name="NewPrice" value='<?php echo $NewPrice; ?>' size="20"> </label> 94 <input type="submit" name="update" value="update"> 95 </form> 96 <?php 97 } 98 ?> 99 <?php echo $res ;?> 100 <?php print_r($res2) ;?> 101 102 <?php echo "global_var=" . $global_var ;?> 103 104</body> 105</html>

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

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

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

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

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

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

guest

回答3

0

簡単なサンプルコード

html

1<?php 2 3function h($string) 4{ 5 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 6} 7 8/** 9 * データベース接続 10 * @return \PDO 11 */ 12function connect() 13{ 14 $dsn = 'mysql:dbname=sample;host=localhost;charset=utf8'; 15 $user = 'root'; 16 $password = 'password'; 17 $option = array( 18 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 19 , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 20 ); 21 22 return new PDO($dsn, $user, $password, $option); 23} 24 25/** 26 * 商品を全て取得 27 * @return array 28 */ 29function getAll() 30{ 31 $objPdo = connect(); 32 $statement = 'SELECT id, name, price FROM goods'; 33 $stmt = $objPdo->prepare($statement); 34 $stmt->execute(); 35 return $stmt->fetchAll(); 36} 37 38/** 39 * 選択した商品を取得する 40 * @return type 41 */ 42function getGood() 43{ 44 $objPdo = connect(); 45 $statement = 'SELECT id, name, price FROM goods WHERE id=?'; 46 $stmt = $objPdo->prepare($statement); 47 $id = filter_input(INPUT_GET, 'id'); 48 $stmt->execute(array($id)); 49 return $stmt->fetch(); 50} 51 52/** 53 * 選択した商品情報を更新する 54 */ 55function updateGood() 56{ 57 if (is_null(filter_input_array(INPUT_POST))) { 58 return; 59 } 60 $objPdo = connect(); 61 $statement = 'UPDATE goods SET name=:name, price=:price WHERE id=:id'; 62 $stmt = $objPdo->prepare($statement); 63 64 $stmt->bindParam(':id', filter_input(INPUT_GET, 'id'), PDO::PARAM_INT); 65 $stmt->bindParam(':name', filter_input(INPUT_POST, 'name'), PDO::PARAM_STR); 66 $stmt->bindParam(':price', filter_input(INPUT_POST, 'price'), PDO::PARAM_INT); 67 return $stmt->execute(); 68} 69 70try { 71 updateGood(); 72 $selectedGood = getGood(); 73} catch (Exception $e) { 74 75} 76?> 77<!DOCTYPE HTML> 78<html lang="ja"> 79 <head> 80 <meta charset="UTF-8"> 81 <title></title> 82 </head> 83 <body> 84 <form action="" method="post"> 85 <p> 86 id <?= h(filter_input(INPUT_GET, 'id')); ?> 87 </p> 88 <p> 89 <label for="name">name</label> 90 <input type="text" name="name" id="name" value="<?= h($selectedGood['name']); ?>" /> 91 </p> 92 <p> 93 <label for="price">price</label> 94 <input type="text" name="price" id="price" value="<?= h($selectedGood['price']); ?>" /> 95 </p> 96 <p> 97 <button type="submit">更新</button> 98 </p> 99 </form> 100 <div> 101 <table> 102 <?php foreach (getAll() as $good) : ?> 103 <tr> 104 <td><?= h($good['id']); ?></td> 105 <td><?= h($good['name']); ?></td> 106 <td><?= h($good['price']); ?></td> 107 <td> 108 <a href="?id=<?= h($good['id']); ?>">更新</a> 109 </td> 110 </tr> 111 <?php endforeach; ?> 112 </table> 113 </div> 114 </body> 115</html>

テーブル定義

sql

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

投稿2016/10/01 22:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

php,html

1<?php 2 $res=""; 3 $res2=[]; 4 $global_var=""; 5 $USER='root'; 6 $PW='****'; 7 $dnsinfo="mysql:dbname=salesmanagement2;host=localhost;charset=utf8"; 8 $pdo = new PDO($dnsinfo,$USER,$PW); 9 // ++++ 追加 ++++ 10 $hidden_tag_for_update_form = ""; 11 12 //任意のレコードの更新ボタンが押されたときの反応 13 if(isset($_POST['update2'])){ 14 try{ 15 // ++++ 追加 ++++ 16 $hidden_tag_for_update_form = '<input type="hidden" name="GoodsID" value="' .$_POST['GoodsID']. '">'; 17 18 $sql="select * from goods where GoodsID=?"; 19 $stmt=$pdo->prepare($sql); 20 $array=array($_POST['GoodsID']); 21 22 23 $stmt->execute($array); 24 $row=$stmt->fetch(PDO::FETCH_ASSOC); 25 $NewGoodsID=$row['GoodsID']; 26 // turn into global variable 27 $GLOBALS["global_var"] =$NewGoodsID; 28 29 $NewGoodsName=$row['GoodsName']; 30 $NewPrice=$row['Price']; 31 32 }catch(PDOException $e){ 33 $res=$e->getMessage(); 34 } 35 } 36 ///////// 37 38 39 try{ 40 $sql="select * from goods"; 41 $stmt=$pdo->prepare($sql); 42 $stmt->execute(null); 43 while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ 44 $res .= "<table><tr><td>" . $row['GoodsID'] . "</td><td>" . $row['GoodsName'] . "</td><td>".$row['Price']. "yen</td><td>"; 45 $res .= "<form action='' method='post'> 46 <input type='submit' name='update2' value='update2'> 47 <input type='hidden' name='GoodsID' value={$row['GoodsID']}> 48 </td></form></tr></table>\n"; 49 } 50 }catch(PDOException $e){ 51 $res=$e->getMessage(); 52} 53 //////更新処理 54 if(isset($_POST['update'])){ 55 try{ 56 $sql="update goods set Price=?, GoodsName=? where GoodsID=?"; 57 $stmt=$pdo->prepare($sql); 58 $array=array($_POST['NewPrice'],$_POST['NewGoodsName'],$_POST['GoodsID']); 59 $res2=$array; 60 $stmt->execute($array); 61 62 }catch(PDOException $e){ 63 $ress=$e->getMessage(); 64 } 65} 66 //// 67 68 69 70?> 71 72 73<!DOCTYPE html> 74<html> 75<head> 76<meta charset="utf-8"> 77<style> 78table{ 79 width: 50%; 80} 81td{ 82 text-align: left; 83 width: 25%; 84 vertical-align: text-bottom; 85} 86</style> 87</head> 88<body> 89 <h1>Update Goods Information </h1> 90 <?php if(isset($_POST['update2'])){ 91 ?> 92 93 <form action="" method="post" > 94 <p>GoodsID=<?php echo $NewGoodsID; ?></p> 95 <label>NewGoodsName<input type="text" name="NewGoodsName" value='<?php echo $NewGoodsName; ?>' size="40"></label> 96 <label>NewPrice<input type="text" name="NewPrice" value='<?php echo $NewPrice; ?>' size="20"> </label> 97 <!-- +++++ 追加 ++++ --> 98 <?php echo $hidden_tag_for_update_form; ?> 99 <input type="submit" name="update" value="update"> 100 </form> 101 <?php 102 } 103 ?> 104 <?php echo $res ;?> 105 <?php print_r($res2) ;?> 106 107 <?php echo "global_var=" . $global_var ;?> 108 109</body> 110</html>

投稿2016/10/01 22:11

編集2016/10/01 22:27
fromageblanc

総合スコア2724

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

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

退会済みユーザー

退会済みユーザー

2016/10/01 22:28

XSS脆弱性がありますよ。
fromageblanc

2016/10/01 23:26

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

0

ベストアンサー

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

ここを

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

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

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

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

投稿2016/10/01 21:20

fromageblanc

総合スコア2724

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

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

fdaf_11111

2016/10/01 21:32

そのように直したら直した箇所がUndefined index: GoodsIDというエラーがでます。GoodsIDがサーバー側に送られるのはupdate2をおした時なのでupdateを押したときには反応しないからと思います。
fromageblanc

2016/10/01 21:38

よくみると、、、 <input type='hidden' name='GoodsID' value={$row['GoodsID']}>は、 updateのform内に書き出さないとダメじゃないですかね。
fromageblanc

2016/10/01 21:52

すいません。訂正です。 x updateのform内に ○ updateのform内にも update2のポスト時にも、GoodsIDをhiddenタグで書き出してやればOKかと。
fdaf_11111

2016/10/02 09:11

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

2016/10/02 23:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問