getではデータベースの更新が出来ない
Xoopsモジュールを作成する上で、いくつか壁にぶち当たったのでメモ。
Xoopsではデータベースにアクセスするためのクラスが提供されるが、これには少し癖(というかお節介なところ)があるような気がする。
現在は記事管理のモジュールを書いているのだが、記事の表示回数を取得して、記事ランキング機能をつけないといけない。そこでモジュール内に専用のクラスを用意して、そこで表示回数をカウントアップする関数を書き、ページ表示時にその関数が実行されるようプログラムを記述した。この関数はデータベースの記事テーブル内の表示回数を格納するカラムをカウントアップするためのものだ。
しかし、いざこれを実行してみてもカウントアップされない。「え、なんで?」。
ためしに実行させているSQL文を書き出して、phpMyAdminから実行すると正しく動作している。「ん〜、自前のクラスで何か不都合があるのかも」と思い、プログラム内に直接SQLを書いて$xoopsDBに放り込んでみた。
しかしだめ。「え〜〜、なんで〜〜?」
$xoopsDBにはMySQLのエラーを取得する関数が用意してあるので、それを使ってみるとエラーはない模様。ますます「なんで?」。
仕方がないのでSQL実行後にvar_dump($xoosDB);を書いてみたら、エラーがあったよ。「Database update not allowed during processing of a GET request」。こんな舐めたエラー、おせっかいにもほどがあるよ!。
要はMySQLに渡す前にXoops側でチェックして、getでアクセスがあった場合は関数queryでテーブルの更新をかけられません、とのたまっているのだ。しかし「こんな仕様だとマジで使い物にならないはず」とソースを読んだら、もういっこ関数が用意されていた「queryF」。最後の「F」はforceの略?、強制的とか言う意味なのかな。
こちらの関数を使うことで無事処理が実行できた。
やはりXoops、少し(かなり)癖がある。慣れるまで大変だ。