ひとこと掲示板作成(PDO接続編)

前回http://ma-swan.hatenablog.com/entry/2019/02/22/013654、パーフェクトPHPの6章の「ひとこと掲示板作成」をlaravelのクエリビルダを用いて作成した。
ところで、僕が読んでいるパーフェクトPHP(第5刷)ではPHP5.3.2を使用することを前提に書かれている。
そのため、この「ひとこと掲示板作成」では、mysql_connect()を用いてDBに接続するようにコーディングされている。
しかし、mysql_ で始まる関数は、PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除された。現在では生PHPでDBに接続するためには、PDOまたはMySQLiを使用する。
そこで今回は、laravel使用環境だが勉強のためあえてPDO接続でDB接続をしてみた。
(※勿論、第5刷の時点でPDOについては11章で触れている。サンプルプログラムではmysql_connect()を使用しているという意味。最新版は未確認。)
また、PDOのクラスが存在しないというエラーが表示されることがあり、調べていると、php.iniを編集して、extension=php_pdo.dllを追記すべきという記事が多々見つかる。しかし、PHP 5.3 以降はこの工程が不要となっている。PHP公式マニュアル参照:

http://php.net/manual/ja/pdo.installation.php このエラーはOnelinebbsController2.phpのnamespaceの後にuse PDO;を追記することで解決した。

使用言語:PHP
使用フレームワーク:laravel

C:\xampp\htdocs\laravelapp>php --version
PHP 7.1.9 (cli) (built: Aug 30 2017 18:37:35) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
C:\xampp\htdocs\laravelapp>php artisan --version
Laravel Framework 5.5.12
OnelinebbsController2.php

<?php
//OnelinebbsControllerのデータベースPDO接続版

namespace App\Http\Controllers;
use PDO;
use Illuminate\Http\Request;
use App\Http\Requests\RubihuriRequest;
use Validator;
use Illuminate\Support\Facades\DB;
use App\Http\Requests\OnelinebbsRequest;

class OnelinebbsController2 extends Controller
{
    public function bbs_index2(Request $request)
    {
        //echo phpinfo();
        try{
            $dbh = new PDO(
                'sqlite:C:\xampp\htdocs\laravelapp\database\keijiban_database.sqlite',
                '',
                '',
                array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_EMULATE_PREPARES => false,
                )
            );

        //全体表示処理
            $prepare = $dbh->prepare('SELECT * FROM bbs');
            $prepare->execute();
            $result = $prepare->fetchAll(PDO::FETCH_ASSOC);

        } catch (PDOException $e) {

            $error = $e->getMessage();

        }
        //var_dump($result); 
        return view('layouts.bbs2',['items'=>$result]); 
        
        $dbh = null;
    }

    public function bbs_post(OnelinebbsRequest $request)
    {   
        /*
         bbs_postでは実際の画面表示はしない。画面遷移の処理である。
            最終的にリダイレクトして全体表示している。
        */
        date_default_timezone_set('Asia/Tokyo');
        
        try{
            $dbh = new PDO(
                'sqlite:C:\xampp\htdocs\laravelapp\database\keijiban_database.sqlite',
                '',
                '',
                array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_EMULATE_PREPARES => false,
                )
            );

            $date= date("Y/m/d H:i:s");
        //insert処理
            $prepare = $dbh->prepare('INSERT INTO bbs VALUES(:name,:comment,:date)');
            $prepare->bindValue(':name',(int)$request->name,PDO::PARAM_STR);
            $prepare->bindValue(':comment',(int)$request->comment,PDO::PARAM_STR);
            $prepare->bindValue(':date',(int)$date,PDO::PARAM_INT);
            $prepare->execute();
            $result = $prepare->fetchAll(PDO::FETCH_ASSOC);

        } catch (PDOException $e) {

            $error = $e->getMessage();

        }

        return redirect('/onelinebbs');
        
        $dbh = null;
    }
}
bbs2.blade.php

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>ひとこと掲示板</title>
    </head>
    <body>
        <h1>ひとこと掲示板</h1>

        @if(count($errors)>0)
        <p>入力に問題があります。再入力してください。</p>
        @endif

        <table>
            <form action="/onelinebbs2" method="post">
                {{ csrf_field() }}
                @if($errors->has('name'))
                    <tr><th>ERROR</th><td>{{$errors->first('name')}}</td></tr>
                @endif

                <tr><th align="left" valign="middle">名前:</th><td><input type="text" name="name" value="{{old('name')}}"></td></tr><!--入力値はnameとして扱われる-->

                @if($errors->has('comment'))
                    <tr><th>ERROR</th><td>{{$errors->first('comment')}}</td></tr>
                @endif

                <tr><th align="left" valign="middle">ひとこと:</th><td><input type="text" name="comment" size="60" value="{{old('comment')}}"></td></tr>
                <tr><th></th><td><input type="submit" name="submit" value="送信"></td></tr>
            </form>
        </table>
        
        <table border="0">
            @foreach ($items as $key => $value)
                <ul>
                    <li>
                    {{$value['id']}} : {{$value['name']}} {{$value['comment']}} - {{$value['date']}};
                    </li>
                </ul>
            @endforeach
        </table>

    </body>
</html>
web.php

Route::get('onelinebbs_pdo','OnelinebbsController2@bbs_index2');

参考文献

qiita.com