ひとこと掲示板作成(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;を追記することで解決した。
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');
参考文献