まるぼ実験場

アプリの開発日記を載せるサイトでしたが、ただの技術ブログになりました。

『パーフェクトPHP』Part3 6章のコードをSQLite仕様に書き直してみる

パーフェクトPHPは良い本なのだが、少々内容が古くなってしまっているため、調べながら読むのが良い。
6章Part3のひとこと掲示板のコードは、例示されているmysql関数が非推奨なので書き換える必要がある。
ついでに、SQLite3クラスを使う仕様に書き直してみた。コメントアウト部分は元コードを現在標準のmysqli関数仕様に書き直したもの(未テスト)
これは筆者が以前にPythonでWebアプリ作ったとき、MySQLを入れてから面倒なことになったので、メインのPC(Windows環境)で開発テスト段階のときはSQLiteを使うようにしているから。(規模が大きくなって必要になり次第、Linux環境のほうに別途環境を構築するようにしている。)
# 書籍からSQL文などの箇所を流用する形で書きたかったのでこうなったが、現代ではPDOを使う様にしたほうが流用しやすそうと思う。

(2024/04/07 ソースコードの間違いとインデントを見やすく修正。ついでにステートメント版を追加。)

データベース接続

//データベースに接続
/*
$link = mysqli_connect('localhost', 'root', '');
if(!$link){
    die('データベースに接続できません:'. mysqli_connect_error());
}

//データベースを選択する
mysqli_select_db($link, 'onbline_bbs');
*/
    
try{
    $link = new SQLite3('hitokoto.db');
}catch(Exception $e){
    die('データベースに接続できません:');
}

SQL作成・保存

なるべく書籍に近い書き方で。

//エラーが無ければ保存
if(count($err_msg) === 0){

 //SQL文作成
$sql = "INSERT INTO 'post' ('name' , 'comment', 'created_at') VALUES ('"
           //. mysqli_real_escape_string($link, $name) . "','"
              . $link->escapeString($name). "','"
           //. mysqli_real_escape_string($link, $comment) . "','"
              . $link->escapeString($comment) . "','"
              . date('Y-m-d H:i:s') . "')";
            
//保存する
//mysqli_query($link, $sql);
$link->query($sql);

//mysqli_close($link);
$link->close();

header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}

実際にはステートメント使う方が多いのかな?ということでステートメント使用版。

$sql = "INSERT INTO 'post' ('name' , 'comment', 'created_at') VALUES ( :name, :comment, :date )";
$date = date('Y-m-d H:i:s');

$stmt = $link->prepare($sql);
$stmt->bindParam(':name', $name, SQLITE3_TEXT);
$stmt->bindParam(':comment', $comment, SQLITE3_TEXT);
$stmt->bindParam(':date', $date, SQLITE3_TEXT);

//保存する
$stmt->execute();

$link->close();

HTMLの表示用要素取得部分

 // 投稿された内容を取得
$sql = "SELECT * FROM 'post' ORDER BY 'created_at' DESC";
//$result = mysqli_query($link, $sql);
$result = $link->query($sql);

$posts = array();
//if($result != false && mysqli_num_rows($result)):
     //while ($post = mysqli_fetch_assoc($result)){
if($result !== false && $result->numColumns()){
    while($post = $result->fetchArray()){
       $posts[] = $post;
    }
}
            
//取得結果を開放して接続を閉じる
//mysqli_free_result($result);
//mysqli_close($link);
$link->close();

余談

スタードメイン(無料サーバー)上でSQLiteが使えるかを上記コードにした状態でテストしてみたところ、
書き込み、読み込み共に問題無さそうだった。
夢が広がるね。