配列で取得するのはよく見かけますが、1件だけの場合どうすればよいのでしょうか? たとえば更新ページの更新一覧にあるGETメソッドのリンクを押した際の表示するphpのコードです。7月18日記事

目次





更新記事のテーブル設計

テーブルのカラムはそれぞれ、id,info_date,regi_date,title,text,url,status(id(主キー)、公開日、登録日、タイトル、テキスト内容、URL、status)だとします。 また、statusが2の場合、その記事は公開対象ということだとします。

コード

データベースの情報はconfig.phpファイルに保存しておきdefine関数でDB_NAMEやDB_HOSTを定義しているものだとします。また、idをGETメソッドで引き継いで、その情報を使ってデータベースにクエリを送信する状況だとするコードを書いていきたいと思います。

<?php
require('config.php');

$dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST.';port='.DB_PORT.'';
$user = DB_USER;
$password = DB_PASSWORD;

try{
	$dbh = new PDO($dsn, $user, $password);	
}catch (PDOException $e){
	print('Connection failed:'.$e->getMessage());
	die();
}
//GETメソッドの数値のフィルター。文字列等をいれられた場合なにも返さない。
$filter_id = filter_var($_GET[id],FILTER_SANITIZE_NUMBER_INT,FILTER_NULL_ON_FAILURE);

$stmt = $dbh->prepare("SELECT * FROM テーブル名 WHERE id = :id AND status = '2'");
$stmt->bindParam(':id',$filter_id,PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch();
?>

HTML部分

あとは任意の位置に内容を張っていくだけです。
HTML部

タイトル部分などに
<h1><?php echo htmlspecialchars($result[title],ENT_QUOTES,"UTF-8"); ?></h1>
や文字コード変換を含めるなら
<h1><?php echo htmlspecialchars(mb_convert_encoding($result[title],"UTF-8","EUC-JP"),ENT_QUOTES,"UTF-8"); ?></h1>
と書く。

あるいは

テキスト部分を張りたいなら
<p><?php echo nl2br(htmlspecialchars($result[text],ENT_QUOTES,"UTF-8")); ?></p>
や文字コード変換を含めるなら
<p><?php echo nl2br(htmlspecialchars(mb_convert_encoding($result[text],"UTF-8","EUC-JP"),ENT_QUOTES,"UTF-8")); ?></p>
と改行を表示させるnl2br関数も書いていきます。



まとめ

idをフィルターし、それをbindValueでチェックし、一件だけの取得の場合fetch()を使うようにします。 idのフィルターはPDOによってチェックされるので必要ないかもしれませんが、著者のセキュリティ意識だと思ってください。

以上

最終更新:2015年08月18日 23:03