ランダムで取得してページング

2008/07/20 | MySQL

データをランダムな順番で取得するには以下のorder句をつければいいということは前に書いた。

order by rand()

これで確かにランダムな順番でデータを吐き出してくれるのだが、SQL実行毎に順番が変わってしまう(当たり前)。ページング処理を実行したい場合は、1ページ目と2ページ目を表示する際に、順番に(例えば)10件ずつデータを取ってくるわけだが、そもそも順番がめちゃくちゃなので、1ページ目のデータが2ページ目でまた出現してしまう、といったことが起きてしまう。どうすればよいか。解決策がコレ。

order by rand(n)
nは適当な数値

詳しくは調べていないがnは乱数を発生させる際のseed値のようなもの。このseed値が同じであれば、並び順は常に同じになるのだ。なのでデータ取得の一番最初のときにこのseed値を初期化して、以降のページングの際はこのseed値を持ちまわってSQL文に仕込んでやればよいということになる。

fsockopenでマルチバイトなメール送信

2008/07/08 | PHPの基本

基本的にメール送信はmb_send_mailを使っているが、いろんな事情でfsockopenによるメール送信を実現しなければならないときがある。それでも、マルチバイトなメール送信でない場合は、何も気にしなくてもスムーズにいくが、マルチバイトなメール送信となると、文字化け問題が常につきまとう。
今回fsockopenでマルチバイトなメール送信プログラムを書いたときに、文字化けせずに送信できたので、その例をメモしておく。

■タイトル
$subj=mb_convert_encoding($subj,’JIS’,’(元のエンコーディング)’);
$subj=mb_encode_mimeheader($subj,’JIS’,’B’);

■本文
$body=mb_convert_encoding($body,’JIS’,’(元のエンコーディング)’);

よく調べてないけれど、タイトルはいったんJISに変換してからmb_encode_mimeheader。本文はJISに変換するだけでいい。

結果オーライということで。

特定の動作時のみプログラムが動かない

2008/07/01 | PHPの基本

つい先日、クライアントさんに納品した案件で不具合があった。本番環境にて稼働させたところ問題が発生したとのことだった。まぁ、本番環境というのは得てしてテスト環境よりもアクセス数等が増加するし、想定外の操作をしてしまう人もいるはずなので問題が出てもおかしくはないのだが(もちろん想定外の動作などないように、各種想定をされたプログラムがいいのはいうまでもないけれど)。
今回のプログラムで、クライアントから「トラブル発生」の連絡を受けた際に想定したのは「max_execution_time」だ。つまり想定した数よりも多いデータ数を処理しなくてはいけなくなってしまったので、当然処理時間が増え、システム規定の時間では間に合わなくなってしまった、という場合だ。
実際、現地を訪れエラーの出る処理を試してみた。しかし、エラーは一定時間をおいて出るのではなくすぐに出る。しかも表示されるエラーはIEのエラー(ちゃんと確認しておけばよかったと後悔している)。
リンクをクリックして、すぐにエラーが出るのであれば、max_execution_timeの問題ではないはずだ(PHPのエラー画面が表示されるはずだし、システム規定の時間はプログラムが稼働するはずだから)。次に想定したのは、memory_limit。取り扱うデータ量が増えることは容易に想像できるから、ini_setコマンドで多めに設定してみた。これで見事解決した。
本番環境では、得てしてプログラムが想定外の動作をしてしまうことは多々あるが、今回はその典型となるような例だった。プログラムのエラーが発生しているのか、環境的な問題でエラーが出ているのかは判断がつきにくいところではあるが、相応の経験をしていれば意外と簡単に原因を突き止められるものだなぁ、と思った次第であった。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net