山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

PHP 学習 part. 10

Web アプリケーション

PHP と言えば Web アプリケーションのイメージがありますね。

現在の時刻を取得する

index.php
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>PHPの学習</title>
</head>

<body>
    <?php require("greeting.php"); ?>
</body>

</html>
greeting.php
<?php

$hour = date('H');
echo "$hour 時です。";
if (5 <= $hour && $hour < 10) {
    echo "おはようございます。";
} else if (10 <= $hour && $hour < 18) {
    echo "こんにちは";
} else {
    echo "こんばんは";
}

f:id:yamakasa3:20191009234801p:plain

なんか実際の時間とずれているんですが、設定の違いだと思います。

入力フォーム

入力した名前を表示します。

index.php
<body>
    <?php require("greeting.php"); ?>
    <?php require("form.php"); ?>
    <form action="index.php" method="get">
        <p>
            名前を入力してください:
            <input type="text" name="name" />
            <input type="submit" value="送信" />
        </p>
    </form>
</body>
form.php
<?php

if (isset($_GET["name"]) && strlen($_GET["name"]) > 0) {
    echo "<p>", htmlspecialchars($_GET["name"], ENT_QUOTES, "UTF-8"),"</p>";
}

f:id:yamakasa3:20191010000443p:plain

htmlspecialchars() というメソッドは安全に HTML 文字列に変換するためでしょうか。

https://www.php.net/manual/ja/function.htmlspecialchars.php

ひとこと掲示

N予備校で似たようなことをやりましたが、PHPの方が簡易に記述できると思います。

データベース作成

環境は XAMPP を使っています。DB は phpMyAdmin を使います。

bbs_online というデータベースに次の SQL 文を実行します。

CREATE TABLE `post` (
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(40),
    `comment` VARCHAR(200),
    `created_at` DATETIME,
    PRIMARY KEY(id)
) ENGINE = INNODB;
bbs.php
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>ひとこと掲示板</title>
</head>

<body>
    <h1>ひとこと掲示板</h1>
    <form action="bbs.php" method="post">
        名前: <input type="text" name="name" /><br />
        ひとこと: <input type="text" name="comment" size="60" /><br />
        <input type="submit" name="submit" value="送信" />
    </form>
</body>

</html>

<?php
require("save_mysql.php");
save_mysql.php

本の環境は PHP5 ですが、僕の環境はPHP7なので、mysqli を使います。

<?php

// phpMyAdmin に接続
$url = "localhost";
$user = "root";
$pass = "";
$db = "online_bbs";
$mysqli = new mysqli($url, $user, $pass, $db);

if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
$mysqli->set_charset('utf8');
$errors = array();

// POSTならDBに保存
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // 名前のチェック
    $name = null;
    if (!isset($_POST["name"]) || !strlen($_POST["name"])) {
        $errors["name"] = "名前を入力してください";
    } else if (strlen($_POST["name"]) > 40) {
        $errors["name"] = "名前は40文字以内で入力してください";
    } else {
        $name = $_POST["name"];
    }

    // ひとことが正しく入力されているかチェック
    $comment = null;
    if (!isset($_POST["comment"]) || !strlen($_POST["comment"])) {
        $errors["comment"] = "ひとことを入力してください";
    } else if (strlen($_POST["comment"]) > 200) {
        $errors["comment"] = "ひとことは200字以内で入力してください";
    } else {
        $comment = $_POST["comment"];
    }

    // エラーがなければDBに保存する
    if (count($errors) === 0) {
        // 保存するためのSQL文
        $sql = "INSERT INTO `post` (`name`, `comment`, `created_at`) VALUES ('"
            . $mysqli->real_escape_string($name) . "', '"
            . $mysqli->real_escape_string($comment) . "', '"
            . date("Y-m-d H:i:s") . "')";
        $mysqli->query($sql);
    } else {
        echo $errors["comment"], PHP_EOL;
    }
    $mysqli->close();
}

パーフェクトPHP

パーフェクトPHP