PR

 「修正処理は対象のデータを一度読み込んで,セッション変数に記憶してから入力フォームを呼び出すようにすればいいがや」と,こうしろうに既存のデータの修正処理の作成を促す。

 一覧フォームから「単語を追加する」のリンクをクリックしたときは,

 真白な入力フォームが開くのだが,更新のリンクをクリックしたときは,入力済の英単語,日本語,説明を初期表示した状態で入力フォームを開いた方が利用者には親切だ。
 そのための手順は,まず

----------------------------------------------------------

print("<td><a href= \"update_form.php?tid=".$row->tid."\">更新</a></td>");

----------------------------------------------------------
として,a hrefで指定するリンク先のスクリプトファイル名の後に「?」を付け,続けてレコードのID($row->tid)を指定する。これがURLパラメータであり,リンクされたスクリプトではスーパーグローバル変数GET配列で受け取ることができる。
----------------------------------------------------------

$id = $_GET['tid'];

----------------------------------------------------------
 そして,こんな風に変数にtidの値を代入したら,該当のレコードを一件だけ取得するSQL文を実行し,レコードセットを作成すればよい。
----------------------------------------------------------

$sql = "select * from tango_table where tid = $id ";
$rs = mysql_query($sql,$conn);
$row = mysql_fetch_object($rs);

----------------------------------------------------------
mysql_fetch_objectは結果の行をオブジェクトとして返す。この$rowから,フィールドを取り出してセッション配列に記憶すればよい。
----------------------------------------------------------
 
$_SESSION['en'] = $row->tenglish;
$_SESSION['ja'] = $row->tjapanese;
$_SESSION['intro'] = $row->tintro;

----------------------------------------------------------
 セッション配列については。189話で次のような説明をした。入力フォームのform actionに指定したスクリプトに制御が渡った後で,入力内容にエラーがあることがわかった時に,入力フォームに戻したら真白な入力フォームが開いてしまう。だから,エラーチェック前にセッション配列にPOSTメソッドで渡ってきた入力値を記憶しておいて,入力フォームを表示するスクリプトの先頭では,セッション配列から各入力項目のvalueに指定している変数に値を戻してやればよいのだと。

 その時と同じセッション配列名を使えば,同じ入力フォームで新規登録と修正ができるのである。

 だから,私は修正の時も,レコード読込み処理を介して同じ入力フォームを使うプログラミングを期待していた。

 しかし,こうしろうは追加用のスクリプトとは別に修正用のスクリプトを作成した。そして修正用のスクリプトでは,レコード読込み用のスクリプトをインクルードしていた。

 「こうしろう,ダメなわけではないけど,同じ入力フォームを作るスクリプトを2つ作るのは無駄だろう」と言ってから気づいた。読込み処理から入力フォームへ移動させる方法がわからなかったんだと。

 ページを移動させるには,先に説明したようにform actionに次に実行するスクリプトを指定する方法,それからリンクを張る方法があるが,そのどちらも適用できない場合はheader関数でlocationヘッダーを送り,指定したURLへリダイレクトする方法がある。
----------------------------------------------------------
 
header("Location: tangocho3.php?check=update&tid=$id");

----------------------------------------------------------
レコードを読み込んで,セッション変数に取ったら,header関数で入力フォームに飛ばせばよいのである。

 「それから,新規追加なのか既存の修正なのかをフラグとして渡して,新規のときはSQLのinsert文,修正のときはupdate文を実行すればいいが」と説明を続けた。
----------------------------------------------------------
 
if($checks == "add"){
 print("<form action='tango_add2.php' method='post'>");
}elseif($checks == "update"){
 print( "<form action='update_tango.php?id=");
 print($id);
 print("' method='post'>");
}

----------------------------------------------------------
 すると,こうしろうは新規追加か既存修正かによって入力フォームの次に別々のスクリプトを実行するコードを書いた。「ちがうだろう。これは」と私は語気を強めた。実行するSQL文が違うだけなのだから,一つのスクリプトの中でフラグ(このスクリプトでは$checksになっている)で判断して,insertかupdateを実行したほうが,無駄がないだろうと説明した。

 もうひとつ,この日記を書いていて気づいたのだが$checks == "update"のとき,なぜかprint文を3行も書いているのだ。
----------------------------------------------------------
 
print( "<form action='update_tango.php?id=$id method='post'>");

----------------------------------------------------------
と,1行で書けるのに。

 PHPではダブルクォートの中の変数は展開されるという仕様を忘れたようである。なかなか効率の良いプログラミングは難しい。