「PHPでPDOを使ってMySQLから1件だけフィールドを取得したい場合」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
配列で取得するのはよく見かけますが、1件だけの場合どうすればよいのでしょうか?
たとえば更新ページの更新一覧にあるGETメソッドのリンクを押した際の表示するphpのコードです。7月18日記事
~
~
目次
#contents
~
~
----
~
*更新記事のテーブル設計
テーブルのカラムはそれぞれ、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->bindValue(':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によってチェックされるので必要ないかもしれませんが、著者のセキュリティ意識だと思ってください。
~
~
以上
配列で取得するのはよく見かけますが、1件だけの場合どうすればよいのでしょうか?
たとえば更新ページの更新一覧にあるGETメソッドのリンクを押した際の表示するphpのコードです。7月18日記事
~
~
目次
#contents
~
~
----
~
*更新記事のテーブル設計
テーブルのカラムはそれぞれ、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によってチェックされるので必要ないかもしれませんが、著者のセキュリティ意識だと思ってください。
~
~
以上