パーフェクト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();