練習問題

練習問題を通して本レッスンで学んだことを確認してみましょう!

問題1

データベースに体重を記録したいと思います。以下のようなカラムを持つ「weight_list」を定義し、記録していくプログラムを作ってみてください。

カラム名


主キー

用途

weight_id

INTEGER

体重の値を識別するID

weight

REAL

体重の値

ctime

INTEGER

記録した日時

ヒント

一行チャットのプログラムが参考になるでしょう。また、REAL型というのは、初めて出てきましたが、実数(浮動点小数/8バイト)を利用します。

答え

体重の入力フォーム、体重の記録処理、体重の表示処理と各処理を確認してください。
今回は、プログラム中で必要となるSQLのひな型をプログラムの冒頭にまとめています。
SQLの意味と、それをどのようにPHPのプログラムで利用するのかという部分をチェックしてみてください。

file: weight.php

<?php
$savepath = dirname(__FILE__).'/weight.db'; // ログの保存先
$script_name = $_SERVER["SCRIPT_NAME"];     // このプログラムのパス
// SQLのひな型
$create_query = <<< ___SQL___
    CREATE TABLE IF NOT EXISTS weight_list (
        weight_id    INTEGER PRIMARY KEY, /* 体重ID */
        weight       REAL,                /* 体重 */
        ctime        INTEGER              /* 投稿日時 */
    );
___SQL___;
$insert_query = <<< __SQL__
    INSERT INTO weight_list (weight, ctime)
        VALUES (?, ?);
__SQL__;
$select_query = <<< __SQL__
    SELECT * FROM weight_list ORDER BY weight_id DESC;
__SQL__;
// データベースへの接続
try {
    $db = new PDO("sqlite:$savepath");
} catch (PDOException $e) {
    echo "接続失敗:".$e->getMessage(); exit;
}
$db->exec($create_query);
// 書き込み処理があったか?
if (isset($_GET["weight"])) {
    $w = floatval($_GET["weight"]);
    if ($w <= 30) { echo "体重を入力してください。"; exit; }
    // データベースに挿入
    $stmt = $db->prepare($insert_query);
    $stmt->execute(array($w, time()));
    header("location: $script_name"); exit; // リロードする
}
// 書き込みフォームの表示
echo <<< __FORM__
<h3>体重記録プログラム</h3>
<form action="$script_name" method="GET">
体重:<input type="text" name="weight" />kg
<input type="submit" value="書込" />
</form>
__FORM__;
// ログの表示
$stmt = $db->query($select_query);
foreach ($stmt as $row) {
    $weight = $row["weight"];
    $ctime  = date("Y/m/d H:i:s", $row["ctime"]);
    echo "<div>($ctime) {$weight}kg</div>";
}
画面
画面

体重は単位をキログラムで管理する場合、整数値だけではなく、実数で記録することになります。実数を扱うにあたり、データベースでは、REAL型を定義します。

また、PHPでユーザーから送信された体重の値に正しい値かどうかをチェックするために、floatval()関数を使って、文字列を実数に変換しています。ここでは、30kg以下は不正な値と考えています。

さらに正しく入力チェックをしようと思ったら、200kg以上をエラーにするなどの処理も付け加えると親切になるでしょう。