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
2007年06月23日
日付の比較
※今日の日付とテーブル上のDATE型との日付データの比較
テーブル上の日付データが格納されているのはdateとする。
今日の日付は、current_dateでMySQLから取得できる。
$sql = "SELECT * FROM テーブル名 WHERE date > current_date;";
↑上記で今日の日付より大きい日付のデータを表示する事ができる。
参考URL:http://q.hatena.ne.jp/1173995418
テーブル上の日付データが格納されているのはdateとする。
今日の日付は、current_dateでMySQLから取得できる。
$sql = "SELECT * FROM テーブル名 WHERE date > current_date;";
↑上記で今日の日付より大きい日付のデータを表示する事ができる。
参考URL:http://q.hatena.ne.jp/1173995418
2007年03月30日
フィールドタイプの説明
■項目タイプ(フィールドタイプ)
・MySQL 項目型
int / integer 4 バイト整数
smailint 2 バイト整数
bigint / int8 8 バイト整数
float 浮動小数点
double / real 倍精度浮動小数点
date 日付
time 時間
timestamp 日付時間
char(文字数) 固定長文字列 (最大 256 文字)
varchar(文字数) 可変長文字列 (最大 256 文字)
text ラージ文字列 (最大 65535 文字)
mediumtext ラージ文字列 (最大 1677215 文字)
largetext ラージ文字列 (最大 4294967295 文字)
blob ラージバイナリ(最大 65535 bytes)
mediumblob ラージバイナリ(最大 1677215 bytes)
largeblob ラージバイナリ(最大 4294967295 bytes)
■順序作成(オートナンバー)
・順序は、auto_increment と定義することで利用できる。キー指定しないとエラーが発生する。
・MySQL 項目型
int / integer 4 バイト整数
smailint 2 バイト整数
bigint / int8 8 バイト整数
float 浮動小数点
double / real 倍精度浮動小数点
date 日付
time 時間
timestamp 日付時間
char(文字数) 固定長文字列 (最大 256 文字)
varchar(文字数) 可変長文字列 (最大 256 文字)
text ラージ文字列 (最大 65535 文字)
mediumtext ラージ文字列 (最大 1677215 文字)
largetext ラージ文字列 (最大 4294967295 文字)
blob ラージバイナリ(最大 65535 bytes)
mediumblob ラージバイナリ(最大 1677215 bytes)
largeblob ラージバイナリ(最大 4294967295 bytes)
■順序作成(オートナンバー)
・順序は、auto_increment と定義することで利用できる。キー指定しないとエラーが発生する。

