PHP レッスン — レッスン 3.3 — MySQL DB の操作。UPDATE によるデータの更新。
私たちはすでに SELECT、INSERT INTO といった MySQL の演算子に触れました。今度は、DB にすでに入力されたデータをどう更新するか学ぶ時です。そのために SQL の UPDATE 演算子を使います。ただしまず、index.php ファイルを変更して、もう 1 つのパスの処理を追加しましょう。次のコードを見つけてください:
if( $_GET['admin'] == 1 ){ // URL に admin 変数があれば
print $obj->display_admin(); // 変数があれば、フォームを表示する
}else{
print $obj->display_public(); // 変数がなければ、メッセージを表示する
}
そして、次のコードに置き換えてください:
switch ($_GET['admin']){
case 'add':
print $obj->display_admin(); // 変数が add なら、追加フォームを表示する
break;
case 'update':
print $obj->display_update(); // 変数が update なら、変更フォームを表示する
break;
default:
print $obj->display_public(); // 変数がなければ、メッセージを表示する
}
条件演算子 if を、$_GET['admin'] 変数の値を一度に複数選択できる別の演算子 switch に変えました。後で delete も出てきます。ひとまず 1 を add に変え、もう 1 つの選択肢 update を追加しました。1 を add に変えたので、simpleCMS.php ファイルのリンク出力を変更する必要があります:
$content .= '<p><a href="/index.php?admin=1">メッセージを追加</a></p>';
これを次に変えてください:
$content .= '<p><a href="/index.php?admin=add">メッセージを追加</a></p>';
また、get リクエストに値が update の admin 変数があるときに呼び出す新しいメソッド display_update() も追加する必要があります。新しいメソッド display_update() を追加します:
public function display_update(){
}
さて、新しいメソッド display_update() が呼び出されるパスの処理を作りました。あとは、メソッドを呼び出すページへのリンクを追加し、display_update() メソッドを実装するだけです。
まず、レコードの更新をどう実装するか考えましょう。更新すべきレコードがまさにそれだと明確に指定できるよう、WHERE 条件付きの特定のクエリを DB に投げる必要があります。これは、そのレコードの id、つまり私たちの場合は mid 列を指定すれば、正確に行えます。ですから、display_update() メソッドの呼び出し時に mid の値を渡す必要があります。どうすればいいでしょう? admin=update と一緒に、get リクエストで値を渡せます。例えばこのように:
http://test/index.php?admin=update&mid=3
あるいは、display_update() メソッドのパラメーターを使うこともできます。例えばこのように:
public function display_update($mid){
}
そしてメソッドを次のように呼び出します:
switch ($_GET['admin']){
case 'add':
print $obj->display_admin(); // 変数が add なら、追加フォームを表示する
break;
case 'update':
$mid = 1; // またはここに $_GET['mid'] を入れられる
print $obj->display_update($mid); // 変数が update なら、変更フォームを表示する
break;
default:
print $obj->display_public(); // 変数がなければ、メッセージを表示する
}
いずれにせよ mid の値を渡す必要があり、おそらく get リクエストを通じてです。ですから、より簡単な最初の方法を使いましょう。
public function display_update(){
$message_id = $_GET['mid'];
}
こうして mid の値を渡しますが、get リクエストにこの値がない場合はどうでしょう? それを確認する必要があります。
public function display_update(){
$message_id = $_GET['mid']; // mid を変数に記録する
if(!empty($message_id)){
}else{
$content .= '<p>mid の値がありません!</p>';
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
}
return $content;
}
これで、get リクエストに admin=update があるが mid の値がない場合、トップへのリンクがあるページに行き着きます。
http://test/index.php?admin=update
さて、編集ページへのリンクが必要な段階に来ました。それらを出力するために display_public() メソッドを修正する必要があります:
public function display_public() { // メッセージ出力のメソッド
$content = '';
$sql = 'SELECT * FROM Messages ORDER BY mid DESC'; // 抽出クエリ
$result = mysql_query($sql) or die(mysql_error()); // 抽出クエリの実行結果を変数に保存する
while($row = mysql_fetch_array($result)){ // 抽出クエリの変数は、特別な関数 mysql_fetch_array() で処理する必要がある
$content .= '<div class="post">'; // レコードを包む div
$content .= '<span class="time">#' . $row['mid'] . ' ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; // 時刻とタイトルを出力する
$content .= '<p>' . $row['bodytext'] . '</p>'; // メッセージのテキストを出力する
$content .= '<p><a href="/index.php?admin=update&mid=' . $row['mid'] . '">メッセージを編集</a>'; // メッセージ編集へのリンクを追加する
$content .= '</div>'; // 包む div の終わり
}
$content .= '<p><a href="/index.php?admin=add">メッセージを追加</a></p>';
return $content;
}
これで、各メッセージの下に、その編集へのリンクが表示されます。メッセージの編集フォームは、display_update() メソッドを通じて出力されます。では、このメソッドのコードを書きましょう。フォーム自体は、DB からのメッセージの既存の値を挿入し、mid の値を持つ隠しフィールドを 1 つ追加する点を除けば、追加フォームとほとんど変わりません。
public function display_update(){
$message_id = $_GET['mid']; // mid を変数に記録する
if(!empty($message_id)){
$result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); // mid が私たちの値と一致する必要な行を問い合わせる
$message = mysql_fetch_object($result); // 結果を message 変数に処理する
$content = '';
$content .= '<form action="/index.php?admin=update" method="post">'; // フォームの結果をこの同じページに送る
$content .= '<label for="title">名前:</label><br />';
$content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; // タイトルの値を追加する
$content .= '<div class="clear"></div>';
$content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; // mid を保持する隠しフィールドを追加する
$content .= '<label for="bodytext">メッセージ:</label><br />';
$content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; // テキストの値を追加する
$content .= '<div class="clear"></div>';
$content .= '<input type="submit" value="保存" />';
$content .= '</form>';
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
}else{
if (!empty($_POST)) { // フォーム送信の結果を確認する
print_r($_POST); // post 配列を出力する
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
}else{
$content .= '<p>mid の値がありません!</p>';
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
}
}
return $content;
}
コメントで、フォームで何が変わったか説明しました。では、更新フォームの入力後に送られる post 配列の処理に取りかかりましょう。
Array(
[title] => asdf
[mid] => 1
[bodytext] => asdfasf
)
私の場合はこのような配列です。レコード追加のクエリを見ると、mid を除いて同じフィールドがあります。更新クエリを使った post 配列の処理を書きましょう:
public function display_update(){
$message_id = $_GET['mid']; // mid を変数に記録する
if(!empty($message_id)){
$result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); // mid が私たちの値と一致する必要な行を問い合わせる
$message = mysql_fetch_object($result); // 結果を message 変数に処理する
$content = '';
$content .= '<form action="/index.php?admin=update" method="post">'; // フォームの結果をこの同じページに送る
$content .= '<label for="title">名前:</label><br />';
$content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; // タイトルの値を追加する
$content .= '<div class="clear"></div>';
$content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; // mid を保持する隠しフィールドを追加する
$content .= '<label for="bodytext">メッセージ:</label><br />';
$content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; // テキストの値を追加する
$content .= '<div class="clear"></div>';
$content .= '<input type="submit" value="保存" />';
$content .= '</form>';
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
}else{
if (!empty($_POST)) { // フォーム送信の結果を確認する
mysql_query('UPDATE Messages SET title="'.$_POST["title"].'", bodytext="'.$_POST["bodytext"].'" WHERE mid='.$_POST["mid"]);
$content .= '<p>メッセージが変更されました!';
$content .= '<p><a href="/index.php#mid-'.$_POST['mid'].'">レコードへ移動</a></p>';
}else{
$content .= '<p>mid の値がありません!</p>';
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
}
}
return $content;
}
これが display_update() メソッドの全コードです。UPDATE クエリが何で構成されているか見てみましょう:
まず UPDATE 演算子が来て、その後にテーブル名。テーブル名の後にもう 1 つの演算子 SET が来て、SET 演算子の後にフィールドが何に等しくなるかを指定します。その後、WHERE 演算子で条件を置きます。これは、mid = 必要な値のレコードを更新すべきという意味です。後で、すべての MySQL 演算子の簡単な概要をまとめます。このレッスンは何より、php と mysql を学び始めたばかりの人向けです。