【解決済】PHPerの方HELP! ~『気づけばプロ並みPHP』を使った学習①~
【解決しました!ありがとうございます。後学のために記事は残します】
Webアプリケーション開発の勉強をしたく、『気づけばプロ並み PHP(改訂版)』を使って学習中です。
超初歩的な部分かと思いますが、下記の点で詰んだため、親切なPHPerの方がいらっしゃいましたらお助けください(`;ω;´)!
システム概要
スタッフの情報登録や削除を行うページを作成中です。
下記1~3の順に推移しますが、情報の受け渡しがうまくできていないように見受けられます。
1.スタッフ一覧(staff_list.php)
2.分岐ページ (staff_branch.php)
3.編集ページ (staff_edit.php)
※参考画面(1,3)-------------------------------
↓分岐ページで編集か削除を選択し・・・
問題点
1)分岐ページでGETでeditかdeleteを渡したいが、URLに表示されていない
(想定ではstaff_edit.php?staffcode=10 となるはずが、staffcode= で終わってしまっている)
2)編集ページでは、選択した方の名前がテキストボックスに自動的に入るようにしたいが、入らない
3)データの受け渡しできていないため、編集も完了しない。
(エラーは出ないがデータベース自体が変更されない。)
コード
スタッフ一覧(staff_list.php)
<body>
<?php
try{
$dsn = "mysql:dbname=shop;host=localhost;charset=utf8";
$user= "root";
$password = "";
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql="SELECT code,name FROM mst_staff WHERE 1";
$stmt = $dbh->prepare($sql);
$stmt ->execute();
$dbh=null;
print "スタッフ一覧<br><br>";
print "<form method='post' action='staff_branch.php'>";
while(true){
$rec = $stmt ->fetch(PDO::FETCH_ASSOC);
if($rec==false){
break;
}
print"<input type='radio' name='staffcode' value='".$rec['code']."'>";
print $rec["name"];
print"<br>";
}
print "<input type='submit' name='edit' value='修正'>";
print "<input type='submit' name='delete' value='削除'>";
print "</form>";
}catch(Exception $e){
print "ただいま障害により大変ご迷惑をおかけしております";
exit();
}
?>
</body>
分岐ページ(staff_branch.php)
<?php
if(isset($_POST['edit'])){
$staff_code == $_POST['staffcode'];
header('Location:staff_edit.php?staffcode='.$staff_code);
exit();
}
if(isset($_POST['delete'])){
$staff_code == $_POST['staffcode'];
header('Location:staff_delete.php?staffcode='.$staff_code);
exit();
}
?>
編集ページ(staff_edit.php)
<body>
<?php
try{
//前回からのPOSTデータを受け取る
$staff_code = $_GET["staffcode"];
//データベースに接続
$dsn = "mysql:dbname=shop;host=localhost;charset=utf8";
$user= "root";
$password = "";
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//該当ユーザの情報をデータベースからもってくる
$sql="SELECT name FROM mst_staff WHERE code=?";
$stmt = $dbh->prepare($sql);
$data[] = $staff_code;
$stmt ->execute($data);
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$staff_name = $rec["name"];
//切断する
$dbh = null;
}catch(Exception $e){
print'障害によりご迷惑をおかけしております';
exit();
}
?>
スタッフ修正<br><br>
スタッフコード<br>
<?php print$staff_code;?><br>
<br>
<form method="post" action="staff_edit_check.php">
<input type=hidden name="code" value="<?php print $staff_code;?>">
スタッフ名<br>
<input type=text name="name" style="width:200px" value="<?php print$staff_name;?>"><br>
パスワードを入力してください。<br>
<input type=password name="pass" style="width:100px"><br>
パスワードをもう一度入力してください。<br>
<input type="password" name="pass2" style="width:100px"><br>
<BR>
<input type=button onclick=history.back() value="戻る">
<input type=submit value="OK">
</form>
</body>
解決方法
<body>
<?php
try{
$dsn = "mysql:dbname=shop;host=localhost;charset=utf8";
$user= "root";
$password = "";
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql="SELECT code,name FROM mst_staff WHERE 1";
$stmt = $dbh->prepare($sql);
$stmt ->execute();
$dbh=null;
print "スタッフ一覧<br><br>";
print "<form method='post' action='staff_branch.php'>";
while(true){
$rec = $stmt ->fetch(PDO::FETCH_ASSOC);
if($rec==false){
break;
}
print"<input type='radio' name='staffcode' value='".$rec['code']."'>";
print $rec["name"];
print"<br>";
}
print "<input type='submit' name='edit' value='修正'>";
print "<input type='submit' name='delete' value='削除'>";
print "</form>";
}catch(Exception $e){
print "ただいま障害により大変ご迷惑をおかけしております";
exit();
}
?>
</body>
<?php
if(isset($_POST['edit'])){
$staff_code == $_POST['staffcode'];
header('Location:staff_edit.php?staffcode='.$staff_code);
exit();
}
if(isset($_POST['delete'])){
$staff_code == $_POST['staffcode'];
header('Location:staff_delete.php?staffcode='.$staff_code);
exit();
}
?>
<body>
<?php
try{
//前回からのPOSTデータを受け取る
$staff_code = $_GET["staffcode"];
//データベースに接続
$dsn = "mysql:dbname=shop;host=localhost;charset=utf8";
$user= "root";
$password = "";
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//該当ユーザの情報をデータベースからもってくる
$sql="SELECT name FROM mst_staff WHERE code=?";
$stmt = $dbh->prepare($sql);
$data[] = $staff_code;
$stmt ->execute($data);
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$staff_name = $rec["name"];
//切断する
$dbh = null;
}catch(Exception $e){
print'障害によりご迷惑をおかけしております';
exit();
}
?>
スタッフ修正<br><br>
スタッフコード<br>
<?php print$staff_code;?><br>
<br>
<form method="post" action="staff_edit_check.php">
<input type=hidden name="code" value="<?php print $staff_code;?>">
スタッフ名<br>
<input type=text name="name" style="width:200px" value="<?php print$staff_name;?>"><br>
パスワードを入力してください。<br>
<input type=password name="pass" style="width:100px"><br>
パスワードをもう一度入力してください。<br>
<input type="password" name="pass2" style="width:100px"><br>
<BR>
<input type=button onclick=history.back() value="戻る">
<input type=submit value="OK">
</form>
</body>
本件解決しましたので、切り分け方法と結論をメモります。
結論
=と==の、typo でした!!!(土下座)
分岐のページで、 POSTで受け取ったデータを代入しているはずが、代入になってなかった。゚(゚´Д`゚)゚。
切り分け
有識者の方に「curlを使うといいよ!」と教えて頂き、使った結果、下記のような結果になりました。
$ curl -i -X POST -F "staffcode=10" -F "edit=修正" http://[serverIP]/staff/staff_branch.php
HTTP/1.1 302 Found
Date: Sat, 18 May 2019 00:37:41 GMT
Server: Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.1
X-Powered-By: PHP/7.3.1
Location: staff_edit.php?staffcode=
Content-Length: 252
Content-Type: text/html; charset=UTF-8
Notice: Undefined variable: staff_code in C:\xampp\htdocs\staff\staff
_branch.php on line 3
Notice: Undefined variable: staff_code in C:\xampp\htdocs\staff\staff
_branch.php on line 4
エラーで、「Undefined Variable」が出ているので、変数のあたりを見ていた結果、気づきました。。。(`;ω;´)
Author And Source
この問題について(【解決済】PHPerの方HELP! ~『気づけばプロ並みPHP』を使った学習①~), 我々は、より多くの情報をここで見つけました https://qiita.com/harapeco_nya/items/619bc61e26f962d1362b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .