[PHPメモ]PHP覚えたので掲示板作ってみた

はじめてのPHPプログラミング基本編 5.3対応 (TECHNICAL MASTER)

2009年11月に楽天ブックスで上記の「はじめてのPHPプログラミング(基本編)(ISBN:9784798020822)」を購入してずっと机の片隅で眠ってましたが最近一念発起してちまちま読んで10日ほどで一応読破しました。

感想としてはPHPはよく言われているようにC言語に近い文法でそれにperlの様な文字列操作方法を搭載した感じのわかりやすい言語だなと思いました。あとWEBアプリ作るのに色々捗る感じになってるなーと思いました。perlだと必要な手続き端折れたり、sqlite2フォーマットのdbを使う分には何のライブラリも必要なかったりと慣れた人ならちょっとしたWEBアプリケーションをチョチョイのチョイで作れそうです。

$i = (int)$value;

みたいな感じでキャスト出来るのがC言語っぽくていいですね。なにか懐かしい気持ちになりましたw。

PHPには500以上の便利な関数があるそうで、全部覚えることは不可能ですがどんな関数があるのかを暇な時にでもひと通りPHPサイトのリファレンスでも眺めておけばいざというときに捗るかも知れません。

PHP: PHP マニュアル – Manual

まあそういうわけで上記の書籍を参考に簡単な掲示板など作ってみました。

こんな感じです。

20111487

実際の動作サンプル(今のところ一応書き込めるようにしています。)
掲示板

一応ソースコードも公開しておきます。(セキュリティー的にまずい所があったら識者の方ツッコミお願いします。)

ソースコード:index.php

<?php
//
//    BBS
//
//    2011.10.11
//    ・新規作成
//
//
$entry_per_page = 5;
$cur_page = 1;
$start_point = 0;

$dbf = "../../../dbs/bbs/bbs.db";
$dbh = sqlite_open($dbf,0666,$error);
if($dbh === false){
    die($error);
}

if($_SERVER["REQUEST_METHOD"] === "POST"){
    if(!isset($_POST["comment"]) || strlen(trim($_POST["comment"])) === 0){
    }else{
        $sql = "BEGIN ";
        $resul = sqlite_exec($dbh,$sql);
        if(result === false){
            die("BEGIN 失敗");
        }

        $name    = trim($_POST["name"]);
        $comment = trim($_POST["comment"]);

        $now = getdate();
        $nowstr = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$now[year],$now[mon],$now[mday],$now[hours],$now[minutes],$now[seconds]);

#        $sql = "INSERT INTO bbs (name,comment,ip,timestamp) VALUES(‘{$name}’,'{$comment}’,’0,0,0,0′,’2011-10-11 01:01:01′)";
        $sql = "INSERT INTO bbs (name,comment,ip,timestamp) VALUES(?,?,?,?)";
        $sql = dbEscape($sql,array($name,$comment,’0,0,0,0′,$nowstr));
        $result = sqlite_exec($dbh,$sql);

        if($result === false){
            $sql = "ROLLBACK ";
            $result = sqlite_exec($dbh,$sql);
            if($result === false){
                die("ROLLBACK 失敗");
            }
        }

        $sql = "COMMIT ";
        $result = sqlite_exec($dbh,$sql);
        if($result === false){
            die("COMMIT 失敗");
        }

        header("Location: index.php");
        exit(0);

    }
}

#総記事数取得
$sql = "SELECT COUNT(*) FROM bbs";
$result = sqlite_query($dbh,$sql);
$total_entrys = (int)sqlite_fetch_single($result);

//ページ指定なし
if(!isset($_GET["page"]) || strlen(trim($_GET["page"])) === 0){
}
//ページ指定あり
else{
    $cur_page = (int)sprintf("%d",$_GET["page"]);
    if($cur_page < 1){
        $cur_page = 1;
    }

    $start_point = ($cur_page – 1) * $entry_per_page;
}

//記事取得
$sql = "SELECT * FROM ‘bbs’ ORDER BY no DESC LIMIT ?,?";
$sql = dbEscape($sql,array($start_point,$entry_per_page));
$result = sqlite_query($dbh,$sql);
$list = array();
while($row = sqlite_fetch_array($result,SQLITE_ASSOC)){
    $list[] = $row;
}

//
//    プレースホルダ的な関数
//
function dbEscape($sql,array $params){
    foreach($params as $param){
        switch(gettype($param)){
        case "integer":
        case "double":
            $replacement = $param;
            break;
        case "string":
            $replacement = sprintf("’%s’",sqlite_escape_string($param));
            break;
        default:
            die("params error = $param");
        }
        $sql = substr_replace($sql, $replacement,strpos($sql,"?"),1);
    }
    return $sql;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="掲示板">
<meta name="keywords" content="掲示板">
<title>掲示板</title>
<link rel="stylesheet" type="text/css" href="css/bbs.css">
</head>
<body>
<div id="header">
    <h1>掲示板</h1>
</div>

<div id="body">
<form name="form1" method="post" action="">
  <p>名前 :
    <input type="text" name="name" id="name" maxlength="128">
  </p>
  <p> 本文:<br>
    <textarea name="comment" cols="50" rows="6" id="comment"></textarea>
  </p>
  <p>
    <input type="submit" name="submit" value="送信" id="submit">
  </p>
  </form>
    <p>
        総記事数:<?php echo $total_entrys ?> 件
    </p>

    <?php foreach($list as $oneline): ?>
<div class="entrys">
        <p class="entry_header">
            <?php echo htmlspecialchars(sprintf("[%05d] %s %s さん",$oneline["no"],$oneline["timestamp"],$oneline["name"]),ENT_QUOTES); ?>
        </p>
        <p class="entry_body">
        <?php echo htmlspecialchars(sprintf("%s",$oneline["comment"]),ENT_QUOTES); ?>
        </p>
</div>
    <?php endforeach; ?>

    <p class="page">
        <?php if ($cur_page > 1) : ?>
            <a href="?page=<?php echo ($cur_page-1) ?>">[next]</a>
        <?php else: ?>
            [next]
        <?php endif; ?>
        <?php if ($total_entrys > ($cur_page * $entry_per_page)) : ?>
             <a href="?page=<?php echo ($cur_page+1) ?>">[prev]</a>
        <?php else: ?>
            [prev]
        <?php endif; ?>
    </p>
</div>

<div id="footer">
    2011 KUMA TYPE
</div>
</body>
</html>

 

DB定義
調子に乗って色々項目を作ったのですが実際にはno・name・comment・timestampしか使っていませんw。今後拡張するときのためのリザーブですw。

CREATE TABLE ‘bbs’ (
‘no’ INTEGER NOT NULL PRIMARY KEY,
‘pno’ INTEGER,
‘name’ VARCHAR(128),
‘title’ VARCHAR(128),
‘comment’ VARCHAR(2000) NOT NULL,
‘hp’ VARCHAR(256),
‘email’ VARCHAR(128),
‘ip’ VARCHAR(40) NOT NULL DEFAULT "",
‘timestamp’ TIMESTAMP NOT NULL
);

上記で紹介した書籍を読めばとりあえず誰でもこれくらいは作れるようになるはずです。たぶん。

これを踏まえて次に作成するウェブアプリはもうちょっと勉強してPHPで作成してみようかと思います。

SQLiteManagerで初期のテストデータを登録したのですがデフォルトの文字コードがEUCなので文字化けしてしまいました。EUCにしか対応していないのかなと思ったら、さっきWikipediaを見たら設定ファイルJpanese.inc.phpをUTF-8に書き換えればいいらしいです。今度つかうときは試してみようとおもいます。

SQLite – Wikipedia

タグ :