2007年08月07日
トータル件数取得
MySQLを使い掲示板などを作成してると、現在の表示件数とトータルの件数を取得したい場合がある。
仮に100件近くレコードがあるとして、21件目から10件分を取得するとする。
SELECT code, name, subject, body, date
FROM bbs_data ORDER BY code
LIMIT 10 OFFSET 20;
そうすると普通にレコードが返ってくる。その後に全体のカウントを取得する。
SELECT COUNT(code) as count
FROM bbs_data;
上記のようにする事でもトータル件数を取得する事が出来るが、下記の方法を使えばもっと簡単にトータル件数を取得できる。
SELECT SQL_CALC_FOUND_ROWS code, name, subject, body, date
FROM bbs_data
ORDER BY code
LIMIT 10 OFFSET 20;
SELECT文にSQL_CALC_FOUND_ROWSキーワードを追加するだけ
そのあとに
SELECT FOUND_ROWS() as count;
を実行するとLIMIT(OFFSET)を無視した件数が取得できる。
ここで直前のQueryのSQL_CALC_FOUND_ROWSを抜くとLIMITが反映されたレコード数を返す。
ちなみにFOUND_ROWS()は直前に実行したQueryの結果のレコード数を返す。
仮に100件近くレコードがあるとして、21件目から10件分を取得するとする。
SELECT code, name, subject, body, date
FROM bbs_data ORDER BY code
LIMIT 10 OFFSET 20;
そうすると普通にレコードが返ってくる。その後に全体のカウントを取得する。
SELECT COUNT(code) as count
FROM bbs_data;
上記のようにする事でもトータル件数を取得する事が出来るが、下記の方法を使えばもっと簡単にトータル件数を取得できる。
SELECT SQL_CALC_FOUND_ROWS code, name, subject, body, date
FROM bbs_data
ORDER BY code
LIMIT 10 OFFSET 20;
SELECT文にSQL_CALC_FOUND_ROWSキーワードを追加するだけ
そのあとに
SELECT FOUND_ROWS() as count;
を実行するとLIMIT(OFFSET)を無視した件数が取得できる。
ここで直前のQueryのSQL_CALC_FOUND_ROWSを抜くとLIMITが反映されたレコード数を返す。
ちなみにFOUND_ROWS()は直前に実行したQueryの結果のレコード数を返す。
2007年08月07日
addslashesによるエスケープ処理
PHP+MySQLで簡易掲示板を作っている際にフォームのコメント部分をaddslashesでエスケープしていたが、英数字を書き込んだ際に'(シングルクオート)などが使われていると\にて再度エスケープされてしまった。英数字だけかと思っていると日本語を入力した場合も突然エスケープされる時があった。困っているとこんな記事を発見。
『addslashesによるエスケープ処理はやめましょう』
mysql_real_escape_string()やpg_escape_string()等のデータベース専用のエスケープ関数を使えとある。
ちなみにSQLiteを使っている場合はaddslashesでエスケープ処理はNG。SQLiteではMS SQL Server, Sybaseと同様「'」は「''」とシングルクオートでエスケープする。
そこでaddslashesからpg_escape_string()に書き換えた所、今までエスケープ処理がうまくいかなかった英数字も問題なく書き込みできるようになった。
【参考URL】
yohgaki's blog
『addslashesによるエスケープ処理はやめましょう』
mysql_real_escape_string()やpg_escape_string()等のデータベース専用のエスケープ関数を使えとある。
ちなみにSQLiteを使っている場合はaddslashesでエスケープ処理はNG。SQLiteではMS SQL Server, Sybaseと同様「'」は「''」とシングルクオートでエスケープする。
そこでaddslashesからpg_escape_string()に書き換えた所、今までエスケープ処理がうまくいかなかった英数字も問題なく書き込みできるようになった。
【参考URL】
yohgaki's blog