今回は、phpのpdo_sqliteの話。
今朝方までmake出来なかったのは、まぁ、仕方ない。

konata.netのFreeBSDの移行が大方済んだので、ログのチェックなどしてみると、
臨時用2ch串の書き込みログがなんだか妙な感じ。

具体的には、在日がどうとかそういうおんなじ文章をマルチポストするようなのが出てくるのだけれど、
書き込みログの間隔が、1分弱と妙に短い。
確か、設定だと300秒にしてあったはずなのだけれど……
ちなみに、リモートホストは丸の内OCN。

取り急ぎ、リモートでメンテ中にして、原因の調査。
Apacheの過去ログを遡ると、書き込み待ち時間を経過していない場合のエラーになる割合が酷く少ない。
これはいくら何でも不自然なので、なにかしらバグがあると踏んだ。

普段、自分が使う時は特権IPなのでそっちのルートには流れないんだよなぁ……

で、一時的に特権を外して、VIPの!ninjaスレを2つ見つけて連続書き込み。
両方に書き込みできてしまった。
連投規制外れてれば、そりゃ水遁されるわけだわ。
あんまり言葉狩りはしたくないので、NGワードを緩めにしてたのも裏目に出た。

が、今ひとつ状況がつかめない。
sqliteのクエリログでも取れれば良いのだけれど、生憎みつけられなかったので、
sqlite3を直に叩いて、同じはずのクエリを投げてみる。

肝心のクエリはこんな感じ。

$query = “SELECT COUNT(ip) FROM allowlist WHERE posttime + ? < ? AND ip = ?;";
$stmt = $pdo->prepare( $query );
$stmt->execute( array( $wait, $now, $ip ) );

以前、投稿した時刻を記録しておいて、
「1つ前の投稿した時刻+待ち時間 < 現在時刻 かつ IPが一致したもの」
の件数を取り出すというもの。
sqlite3で、直にDBを弄ると正しい結果が得られるのだけれど、PODから実行すると、
必ず1件のレコードが該当するような動作をする。

が、原因が判らない。
案外、寝ぼけてるだけかもしれないけれど。

仕方が無いので、DBに計算させるのはやめることにした。
修正後のクエリはこう。

$query = “SELECT posttime FROM allowlist WHERE ip = ?;”;

IPから投稿時刻だけ取ってくる、後はphp側で同じ比較をすれば完了。

なんだかよくわからないけど、これで想定通りの動作をするようになったので、良しとする。
ただ、今まで連投規制なしで書いてた人からは不満が出るかもしれないなぁ……

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です