このブログはphpで組まれており、データはsqliteに格納されている。データの検索もphpで行われているが、検索プログラムの中身を調べることになり、意外とシンプルなコードに驚くというか感動した (2016/10/12 小平探検隊)
sqlite2からsqlite3へ
以前はphp5.2で動作していたが、時間とともにphpのバージョンも上がり、php5.6に上げざるを得ない状況に追い詰められはじめている。
ブログの5.6対応はプロに依頼した。私がやることはsqlite2をsqlite3に上げること。これは先日このブログに記録した。案外簡単だった。
問題点
php5.6対応はほぼ一発で終わったが、ブログ内のデータ検索部分に問題があることが判明した。こちらは「search.php」というブログとは別のプログラムでやっているが、こちらの対応も必要なことは納品後に判明した。
今さら後出し追加依頼として「これもお願いします」とは言い出しづらく、昨日半日くらい眺めていた。
誰が作ったプログラム?
最初の疑問は「search.phpは誰が作ったのか?」というもの。オリジナルのブログには付属していない独立したプログラムで、いつから利用しているか記憶も記録もない。
オリジナルの検索機能が、非力であること、複数の検索結果が出ても、一つをクリックすると他の検索結果が消失してしまう仕様が不便でだった。そこでsearch.phpが導入されたのだろう。
はじめは一般に配布されているphpによる検索プログラムを勘違いしていたが、中身はこのブログ特有の変数名などが使われているので、オリジナルでこのブログ用に作成したものと思われる。
私はphpを書けないし、また、以前は個人的に依頼できるような知り合いもなく他人に制作依頼したものとは考えにくい。
自分で書いた記憶はないが、おそらくネットで公開されている検索用のコードを拾い集めて見よう見まねで作ったのか。
検索プログラムはsqlite3でエラー箇所あり
このプログラムを走らせると結果もエラーも出ない症状だったが、いろいろいじっている間にエラーメッセージも出るようになった。
エラーメッセージからphp5.6の問題ではなく、sqlite3に起因するエラーと思われた。
エラー箇所のコードを検索すると数サイトで、sqlite2とsqlite3での構文の違いについて解説があったので、見よう見まねで構文修正をして動作するようになった。
【sqlite2】
$db = @sqlite_open($db_name)
$result = sqlite_query($db, "SELECT * FROM entry WHERE・・・
$rec = sqlite_fetch_array($result, SQLITE_ASSOC)
sqlite_close($db);
【sqlite3】
$db = new SQLite3($db_name)
$result = $db->query("SELECT * FROM entry WHERE・・・
$rec = $result->fetchArray(SQLITE3_ASSOC)
$db->close();
serch.phpの内容
<?php
require_once './conf/config.php';
if ( !($db = new SQLite3('./data/'.$db_name)) ) {
exit("データベース接続エラー");
}
$searchedWord = $_POST['searchedWord'];
$result = $db->query("SELECT * FROM entry WHERE description LIKE '%{$searchedWord}%' OR title LIKE '%{$searchedWord}%' ORDER BY entry_id DESC");
while ($rec = $result->fetchArray(SQLITE3_ASSOC)) {
$id = $rec['entry_id'];
$name = $rec['title'];
print("{$id} -
{$name}\n");
}
$db->close();
?>
感動的
やっていることは(1) データベースを開いて、(2) sql文を発行し、(3) その結果を一行ごと表示というものかと思うが、わずかこれだけのコードでsqliteデータベースからターゲットの記事をピックアップするという内容。
これだけのコードで、こんなに凄いことができるの?なんかポテンシャルを感じてしまった。
私はphpをまともに学ぶことはないかと思うが、こんなに凄いことが軽々できるなら、他にどんなに凄いことができるのかと驚き感動した。