ヤフオクなどで、ソートした順が重畳できないのがすごく気に食わず、
なんとかして、それを重畳させるべく書いてみました。
SQL文に対して、Desc、Ascをつける順位を重畳する際に引き継ぎます。
ヤフオクでたとえれば、値段でDescして、そのページで、時間Descをすると、
値段Desc→時間Descという表示になるわけです。
いかがそれを作る上で書いたぐちゃぐちゃ関数。
$hena 前回の状態を引き継ぐ引数
$henb 今回発行するsqlクエリー文
$henc imageの状態:UpやDownで昇順、降順を示す
$hend ソートフラグ:もし全項目フラグなしなら、あるカラムでソート
$hene ソート項目
$henf 現URL
$heng リンク生成URL:このリンク中に次$henaになるべきモノを埋める
$henh ソートするカラム名
function make_search($hena,&$henb,&$henc,&$hend,$hene,&$henf,&$heng,$henh){
$asc = $hene.”=asc”;
$desc = $hene.”=desc”;
if($hena==”desc”){
if(ereg(“C$”,$henb)){
$henb .= “, “.$henh.” DESC”;
}else{
$henb .= ” “.$henh.” DESC”;
}
$henc = ‘<img src=”./image/down.gif” class=”img”>’;
$heng = ereg_replace($desc,$asc,$henf);
$hend = “1″;
}elseif($hena==”asc”){
if(ereg(“C$”,$henb)){
$henb .= “, “.$henh.” ASC”;
}else{
$henb .= ” “.$henh.” ASC”;
}
$henc = ‘<img src=”./image/up.gif” class=”img”>’;
$delete_asc = “&”.$asc;
$heng = ereg_replace($delete_asc,”",$henf);
$hend = “1″;
}else{
$henc = “”;
$hend = “0″;
}
}
また再考するように、と思って書いている今、すでにだいぶ時間がたっていてわからない…
かなりだめだめ。
ソート順序をURLから切り出し配列に格納。
その配列にforeachして、順序通り、Desc、Ascを指定する、というわけなのですが…
汚すぎて全体をさらす気にはなれませんので、
そのうちきっときれいにして、もう一度、アップします。
PHPメモ
ソートの記憶
ページ分割
DBと接続し、呼び出した結果を表示させる時。
結果が大量になる場合、ページの分割が必要になるでしょう。
で、そのとき、100件ずつ表示させる方法を部分的に。
使用しているDBはPostgreSQLです。
$result= pg_query($con,$sql);
$rows = pg_num_rows($result);if($rows>=100){
if($_GET[page]){
$page = $_GET[page];
}else{
$page = 1;
}
$max = intval($rows / 100);
$child = $rows % 100;
if($child >= 0){
$max = $max+1;
}
if($page=="all"){
$limit = $rows;
$start = 0;
}else{
if($page==$max){
$limit = $rows;
$start = $rows – $child;
}else{
$limit = $page * 100;
$start = $limit – 100;
}
}
}else{
$limit = $rows;
$start = 0;
}if($rows){
for($hena=$start; $hena < $limit; $hena++){
…省略…
}
}
で、結果をリストアップする頭にこんなのをつけてあげるとよいのでは。
nowというスタイルに、font-size:130%,font-weight:bold;とかしてあげると、
Infoseekの検索結果の件数のようになります。
if($rows>=100){
echo "100件ずつ表示しています。<br>";
for($hena=1;$hena<=$max;$hena++){
if($hena==$page){
echo ‘<span class="now">’.$hena."</span>";
}else{
echo ‘<a href="’.$url.’page=’.$hena.’">’.$hena.’</a>’;
}
if($hena%20==0){
echo "<br>";
}else{
echo " | ";
}
}
echo ‘<a href="’.$url.’&page=all">全件表示</a><br>’;
}
日付の取得
今までPHPで日付を取得するとき、
$today=getdate();
$year=$today[year];
$mon=$today[mon];
$day=$today[day];
こうやっていたのだけど、
list($year,$mon,$day)=split(“-”,date(“Y-m-d”));
でもいいんじゃないか、ということが発覚。
うーん。関数たくさんありすぎてどれが一番スマートかがつかみきれない。
今日のトリビア
charとvarcharの違いは気にするようなモノではない!!
いや、PHPじゃなくてDBな話なのですが。
みなさまご存じの通り、charは固定長であり空白でパットされた文字列で、
varcharは、制限付き可変長文字列ですね。
SQL は 2 つの主要な文字データ型を定義しています。character(n) と character varying(n) で、n は正の整数です。これらのデータ型は 2 つとも長さにして n 文字分の文字列を保存できます。超過している文字がすべてスペースの場合(この時は長さの限界で切り捨てられます)を除いて、上限を越えた文字列をこの種の列に保存しようとするとエラーになります。 (この一風変わった例外は SQL 標準で要求されています。もし宣言された上限よりも文字列が短いときは character の値はスペースでパッドされ、character varying の値は単により短く保存されます。
PostgreSQL 7.3.2 ユーザガイド 文字列データ型 より
で、今日、テーブル定義を行う際、charとvarcharどちらを選ぶのが正解か、という議論になりました。
しかし…
一応私はPostgreSQLでは
varchar = 文字数制限のあるtext
char = 文字数に足りない分に空白を詰めるvarchar
と、すべてtextをベースにしていると理解しているんですが、それは間違いない
ですよね?
世の中には、charのパフォーマンスを稼ぐためにvarcharと違う実装を用いるよ
うなデータベース(DB/2がそうらしいですが)というものがあるそうなので。
[pgsql-jp 18745] Re: char vs text vs varcharより
っつーことは、つまり、varchar = text+文字数制限で、
char = text+空白パッド+文字数制限ということになるわけで、
そうすると、一番いいのはtextという結論に!!
要するに内部的には、charもvarcharもtextもみんな一緒説…
ならば。今まで僕のやってきたテーブル設計とはなんだったのでしょう…
えーと…都道府県ならvarchar(20)でよかろう、とかやってたのに…
えー、この件に関して間違ってたら教えてください。
というか、DB設定に関して、詳しい方、是非ご教授を…
気になるリンク。
InterBase – BLOB, CHARとVARCHARの比較
ob_start
PHPで気づいたことをメモしていきます。
完全自分が対象なので、自分と同レベル(ちょっとかじったけどまだまだ足りない人)向けです。
関数:ob_start
機能:出力バッファリングを有効にする
<?
ob_start();
$array = array (“size” => “XL”, “color” => “gold”);
print_r(array_values ($array));
$data = ob_get_contents();
ob_end_flush();
?>
とかやるとちょっといいかなぁ、と。CSVファイルに書き込む時、データの凡例として配列の添字をのせ、
格納している値も出力したい、とかいう状況があり、知りました。
TETRAX Invisible Mount System GEO Line
TT ショック交換 Eibach→KW
Audi Style 2012 撮影会 @ 日新万国橋駐車場
GARAGE VARY Reife フロントリップスポイラー
Euro Meeting in Karuizawa 2011
OEM Audi shift knob S-Tronic DSG
DSGオイル交換
グリル交換:デフォルトからAudi TTS 2011へ
WAKO'S RECS & FUEL ONE
進もう、東日本! 〜Weiterfahren,Ost Japan!〜