場当たりな対処を施したコード
php
1 <! DOCTYPE   html > 
 2 < html > 
 3 	 < head > 
 4 		 < meta   charset = " UTF-8 " > 
 5 		 < title > タイトル </ title > 
 6 	 </ head > 
 7 	 < body > 
 8 
9 		 <?php 
 10 		 try   { 
 11 
12 			 /*
 13 			 * グローバル変数に直接アクセスしない
14 			 * 
15 			  $staff_code = $_POST['code'];
16 			  $staff_name = $_POST['name'];
17 			  $staff_pass = $_POST['pass'];
18 			 */ 
 19 
20 			 $staff_code   =   filter_input ( INPUT_POST ,   'code' ) ; 
 21 			 $staff_name   =   filter_input ( INPUT_POST ,   'name' ) ; 
 22 			 $staff_pass   =   filter_input ( INPUT_POST ,   'pass' ) ; 
 23 
24 			 /*
 25 			 *  SQLに渡す変数を htmlspecialchars 使うのは論外
26 			 *
27 			  $staff_name = htmlspecialchars($staff_name);
28 			  $staff_pass = htmlspecialchars($staff_pass);
29 			 */ 
 30 
31 
32 			 34 
 35 			 $options   =   array ( 
 36 				 PDO :: ATTR_ERRMODE   =>   PDO :: ERRMODE_EXCEPTION 
 37 			 ) ; 
 38 
39 			 $dsn   =   'mysql:dbname=shop;host=localhost;charset=utf8;' ; 
 40 			 $user   =   'root' ; 
 41 			 $password   =   '' ; 
 42 			 $dbh   =   new   PDO ( $dsn ,   $user ,   $password ,   $options ) ; 
 43 
44 			 /*
 45 			 * 文字コードは $dsn で
46 			  $dbh->query('SET NAMES utf8');
47 			 */ 
 48 
49 			 $sql   =   'UPDATE mst_staff SET name=?,password=? WHERE code=?' ; 
 50 			 $stmt   =   $dbh -> prepare ( $sql ) ; 
 51 			 $data [ ]   =   $staff_name ; 
 52 			 $data [ ]   =   $staff_pass ; 
 53 			 $data [ ]   =   $staff_code ; 
 54 			 $stmt -> execute ( $data ) ; 
 55 
56 			 59 
 60 		 }   catch   ( Exception   $e )   { 
 61 			 print   'ただいま障害により大変ご迷惑をおかけしております。' ; 
 62 
63 			 65 
 66 			 // exit(); 
 67 		 } 
 68 		 ?> 
 69 
70 		修正しました。 < br /> 
 71 		 < br /> 
 72 		 < a   href = " staff_list.php " > 戻る </ a > 
 73 
74 	 </ body > 
 75 </ html > 
欲を言えばこうしたい
php
1 <?php 
 2 try   { 
 3 	 if   ( null   !=   filter_input_array ( INPUT_POST ) )   { 
 4 		 $staff_code   =   filter_input ( INPUT_POST ,   'code' ) ; 
 5 		 $staff_name   =   filter_input ( INPUT_POST ,   'name' ) ; 
 6 		 $staff_pass   =   filter_input ( INPUT_POST ,   'pass' ) ; 
 7 
8 		 $options   =   array ( 
 9 			 PDO :: ATTR_ERRMODE   =>   PDO :: ERRMODE_EXCEPTION 
 10 		 ) ; 
 11 
12 		 $dsn   =   'mysql:dbname=shop;host=localhost;charset=utf8;' ; 
 13 		 $user   =   'root' ; 
 14 		 $password   =   '' ; 
 15 		 $dbh   =   new   PDO ( $dsn ,   $user ,   $password ,   $options ) ; 
 16 
17 		 $sql   =   'UPDATE mst_staff SET name=?,password=? WHERE code=?' ; 
 18 		 $stmt   =   $dbh -> prepare ( $sql ) ; 
 19 		 $data [ ]   =   $staff_name ; 
 20 		 $data [ ]   =   $staff_pass ; 
 21 		 $data [ ]   =   $staff_code ; 
 22 		 $stmt -> execute ( $data ) ; 
 23 	 } 
 24 }   catch   ( Exception   $e )   { 
 25 	 $err   =   'ただいま障害により大変ご迷惑をおかけしております。' ; 
 26 } 
 27 ?> 
 28 <! DOCTYPE   html > 
 29 < html > 
 30 	 < head > 
 31 		 < meta   charset   =   " UTF-8 " > 
 32 		 < title > タイトル </ title > 
 33 	 </ head > 
 34 	 < body > 
 35 		 <?php   if   ( isset ( $err ) )   :   ?> 
 36 			 < p > <?=   $err ;   ?> </ p > 
 37 		 <?php   elseif   ( null   !=   filter_input_array ( INPUT_POST ) )   :   ?> 
 38 			 < p > 更新しました。 </ p > 
 39 		 <?php   endif ;   ?> 
 40 		 < a   href   =   " staff_list.php " > 戻る </ a > 
 41 	 </ body > 
 42 </ html > 
グローバル変数に直接アクセスしない
 
ご指摘ありがとございます。
ちなみにグローバル変数に直接アクセスしないのは、プログラミング
 
ここでグローバル変数と言っているのは、$_POST['xxxx']の事です。スーパーグローバル 」と表現されています。
また、filter_input()
 
そうですね。同時に、
$val = (isset($_POST['key'])) ? $_POST['key'] : null;
という冗長な書き方をせずに済みます。
SQLに渡す変数を htmlspecialchars 使うのは論外http://php-archive.net/php/htmlspecialchars/ 
 
 
いいえ。これは全く無関係です。
とある、PHPの初心者向けの書籍のせいで、誤用が広まっている…
そもそも、これがSQLインジェクションに有用な関数なのであれば、PHPの開発チームは htmlspecialchars って関数名はつけないでしょう。おかしいと思いません?(→ 某書籍の作者さん、どうですか?)
文字コードは「$dsn」で「$dbh->query('SET NAMES utf8');」
 
 
今のバージョンでは、そうすべきです。古いバージョンのPHPでは、SET NAMES utf8 を使うことは許容されます。(それ以外に方法がないから)
いらない「$dbh=null;」
 
 
こちらは、接続が切れたら勝手に NULL になります。あえて書く必要はありません。
ここで exit すると、htmlが崩れる
 
 
exit; で処理が止まるので、<html> 以下は表示されるが、</body></html> の部分は出力されなくなりますね。
html
1 < html > 
 2 < body > 
 3 ...
4 
となって、</body> や </html> がないって、気持ち悪いですよね…
欲を言えばこうしたい
 
 
php
1 if   ( null   !=   filter_input_array ( INPUT_POST ) )   { 
 2 ... 
 3 } 
の部分ですね。$sql = 'UPDATE mst_staff SET name=?,password=? WHERE code=?';
以下の部分も実行され、UPDATE mst_staff SET name='',password='' WHERE code='' というSQLが実行されてしまいます。