logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

PHP レッスン — レッスン 3.3 — MySQL DB の操作。UPDATE によるデータの更新。

08/12/2019, by Ivan

私たちはすでに 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 を学び始めたばかりの人向けです。