前回記事phpでMySQLへフォームを使って挿入で挿入したものを呼び出します。6月3日記事
目次
公開日が現在の日付以下で、かつステータスが公開中(2)のものを最新5件取得するスクリプトを書いていきます。
間違ってはいけないのが、idで大きい順に公開中のものを取得してはいけないということです。
例えば、idで大きい順に公開中のものを5件取得すると
| id | date | status |
| 略 | いままでの日付一覧 | 2 |
| 10 | 2015-06-30 | 2 |
| 11 | 2015-06-12 | 2 |
| 12 | 2015-06-13 | 2 |
| 13 | 2015-06-14 | 2 |
| 14 | 2015-06-15 | 2 |
だった場合に、6月15日が最初に来ますが、次に6月14日、6月13日、6月12日、6月30日・・・。と6月30日の記事が後ろのほうにきてしまいます。やはり日付が大きい順に取得していく必要があります。
なのでクエリは
mysql> SELECT id,info_date,title FROM information WHERE info_date <= '今日の日付' AND status = '2' ORDER BY info_date DESC LIMIT 5;
とする必要があると思います。
まずは簡単な違いから。queryメソッド=固定化されたquery。ユーザの入力が一切ないようなタイプのクエリはこちらを使います。prepareメソッド=変数を扱ったもの。ユーザの入力の内容をエスケープ処理していくようなものはこちらを使っていきます。こちらはbindParamやbindValueを使い、ユーザによって入力されたものが適切な値かどうかチェックしていく機能があります。
ファイル名(index.php)
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>トップページの更新情報取得作成</title>
</head>
<body>
<a href="register.php">新規投稿</a>
<br>
<?php
$dsn = 'mysql:dbname=データベース名;host=localhost;port=3306';
$user = 'ユーザ名';
$password = 'ユーザパスワード';
echo '<dl>';
try{
//成功時対応
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT id,info_date,title FROM information WHERE info_date <= '".date('Y-m-d')."
' and status = '2' ORDER BY info_date DESC LIMIT 5";
$stmt = $dbh->query($sql);
$ct = 0;
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
echo '<dt>'.htmlspecialchars($result['info_date']).'</dt>';
echo '<dd><a href="information.php?id='.htmlspecialchars($result['id']).'">'.htmlspecialchars($result['title']).'</a></dd>';
$ct++;
}
if($ct == 0){echo '<dt></dt><dd>更新情報はありません。</dd>';}
echo '</dl>';
}catch (PDOException $e){//失敗時対応
print('Connection failed:'.$e->getMessage());
die();
}
$dbh = null;
?>
</body>
</html>
というように記述すれば、データが取得できます。
次にPHPとMySQLを使いGETメソッドで受け取ったデータを取得&表示を書いていきます。