カラムの作成日時と更新日時のそれぞれでソート、
作成日時当日はNEWの文字を入れる。というものを作りたいと思っています。
<?php
$cer = "SELECT * FROM data_data WHERE 1";
function orderbyset($cul, $sc, &$cer){
$cer .= " ORDER BY ".$cul." ".$sc;
}
if(isset($_GET['orderby'])){
switch($_GET['orderby']){
case 'md_asc':
orderbyset('modified_date','ASC',$cer);
break;
case 'md_desc':
orderbyset('modified_date','DESC',$cer);
break;
case 'cd_asc':
orderbyset('create_data','ASC',$cer);
break;
case 'cd_desc':
orderbyset('create_data','DESC',$cer);
break;
}
}
$acc = mysql_connect(ホスト,ユーザー,パスワード);
$que = mysql_query($cer,$acc);
$html = "";
while($row = mysql_fetch_array($que)){
$id = $row["id"];
$name = $row["name"];
$modified_date = $row["modified_date"];
$create_data = $row["create_data"];
$daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24));
if($daydiff==0){$datatext = 'new';}else{$datatext='';}
$html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n";
}
?>
<html lang="ja">
<head>
<title></title>
</head>
<body>
<p>更新日時順<br />
<a href="data-sort.php?orderby=md_asc">昇順</a>
<a href="data-sort.php?orderby=md_desc">降順</a>
</p>
<p>作成日時順<br />
<a href="data-sort.php?orderby=cd_asc">昇順</a>
<a href="data-sort.php?orderby=cd_desc">降順</a>
</p>
<table><?php echo $html; ?></table>
</body>
</html>
+---------------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| modified_date | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
| create_data | timestamp | YES | MUL | NULL | |
+---------------+-----------+------+-----+-------------------+-------+
modified_dateの属性にはon update CURRENT_TIMESTAMPを設定し、
カラムのデータを変えるとmodified_dateが更新され、create_dataはそのままです。
SELECT id,name,modified_date,create_data,IF(`create_data`>CURDATE() - INTERVAL 0 DAY,'NEW',DATE_FORMAT(`create_data`,'%Y/%m/%d')) AS `ddd` FROM `data_data`
http://oshiete.goo.ne.jp/qa/3058491.htmlでの方法がありました。
$daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24));
if($daydiff==0){$datatext = 'new';}else{$datatext='';}
「あるカラムの情報が変わったら○○させる」といったことをいくつか追加していきたいので、
パフォーマンスが落ちることを少しでも避けるためにphpで処理するようにしましたが、一般的にはどちらを使うものなのでしょうか。
また、ifばかりにならないようにswitchを使ったのですが、ソートもいろいろ追加していきたく、そうなると今度はswitchが多くなってしまいます。
switchやifを使わずにスマートにやれる方法はないでしょうか。
No.1ベストアンサー
- 回答日時:
なにかへん
SQLでは作成日が今日ならNEW、PHPでは作成日が更新日ならNEW
と書かれていませんか?
今回の場合ですとNEWを抜き出すロジックはSQLで処理する意味がありそうですが
集計とちがってSQLに特段の優位性があるわけではないので、
どちらでやっても有効性に差はないでしょう
またソートも多段でおこなう必要がでてきたときにswitchは微妙ですね
多段でソートすることも想定するとこんな風にするとよいかもしれません
<a href="?o%5Bx%5D=a&o%5By%5D=a&o%5Bz%5D=a">x昇順-y昇順-z昇順</a><br>
<a href="?o%5Bx%5D=a&o%5By%5D=a&o%5Bz%5D=d">x昇順-y昇順-z降順</a><br>
<a href="?o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=a">x降順-y昇順-z昇順</a><br>
<a href="?o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=d">x降順-y昇順-z降順</a><br>
<a href="?o%5Bx%5D=a&o%5By%5D=d&o%5Bz%5D=a">x昇順-y降順-z昇順</a><br>
<a href="?o%5Bx%5D=a&o%5By%5D=d&o%5Bz%5D=d">x昇順-y降順-z降順</a><br>
<a href="?o%5Bx%5D=d&o%5By%5D=d&o%5Bz%5D=a">x降順-y降順-z昇順</a><br>
<a href="?o%5Bx%5D=d&o%5By%5D=d&o%5Bz%5D=d">x降順-y降順-z降順</a><br>
<?PHP
$orderby="";
if(isset($_GET["o"])){
$keylist=array("x"=>"xxx","y"=>"yyy","z"=>"zzz");
$vallist=array("a"=>"asc","d"=>"desc");
foreach($_GET["o"] as $key=>$val){
if(!in_array($key,array_keys($keylist)) or !in_array($val,array_keys($vallist))) continue;
if($orderby!=="") $orderby.=",";
$orderby.=" `".$keylist[$key]."` ".$vallist[$val];
}
if($orderby!=="") $orderby="ORDER BY ".$orderby;
}
print $orderby;
?>
有難うございます。多段の場合の処理方法、とても参考になりました。
実現したいのは多段ではないですが、覚えておきます。
名前、番号、など計5種類くらいをソートしたいです。
> o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=d
o[x]=d & o[y]=a & o[z]=d こういうことですか。
特殊な文字を使うメリットってなんですか?
>SQLでは作成日が今日ならNEW、PHPでは作成日が更新日ならNEW
>と書かれていませんか?
更新日にしていたところをdate("Y-m-d G:i:s")にしてみました。
前回は日単位でしたが、data()だと秒単位で計算されるのですね。
このやり方が一般的ですか?
アドバイスを参考にさせていただき、改善1と2をやってみました。
改善1はjavascriptがオフだと機能しなくなってしまいます。
改善2はjavascriptがオフのときは<noscript>でsubmitボタンを出して機能しますが、radioボタンになってしまいます。
radioボタンを使うことなくaタグで囲ってjavascript未対応でも機能すればいいですが・・・
改善1と2どちらを選びますか?
■■■改善1■■■
<input type="hidden" name="d" value="md" />
<input type="hidden" name="c" value="asc" />
javascript未対応の方には更新日時順をascで。
<?php
$cer = "SELECT * FROM data_data WHERE 1";
/*-------- PHPの改善箇所 ---------*/
if(isset($_GET['dd'])&&isset($_GET['sc'])){
$a = array("modified_date"=>"md", "create_data"=>"cd");
if(in_array($_GET['dd'], $a)){
foreach($a as $key => $value){
if($_GET['dd'] != $value) continue;
$_GET['dd'] = $key;
}
}
$cer .= " ORDER BY ".$_GET['dd']." ".$_GET['sc'];
}
/*--------------------------------*/
$acc = mysql_connect(ホスト,ユーザー,パスワード);
$que = mysql_query($cer,$acc);
$html = "";
while($row = mysql_fetch_array($que)){
$id = $row["id"];
$name = $row["name"];
$modified_date = $row["modified_date"];
$create_data = $row["create_data"];
$daydiff = floor((strtotime(date("Y-m-d G:i:s"))-strtotime($create_data))/(3600*24));
if($daydiff==0){$datatext = 'new';}else{$datatext='';}
$html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n";
}
?>
<html lang="ja">
<head>
<title></title>
</head>
<body>
<form name="formname" method="GET" action="data-sort-jssubmit.php">
<input type="hidden" name="dd" value="md" />
<input type="hidden" name="sc" value="desc" />
</form>
<script type="text/javascript">
function sortchange(d,c){
var frm = document.forms['formname'];
frm.dd.value = d;
frm.sc.value = c;
frm.submit();
}
</script>
<p>更新日時順<br />
<a href="javascript:sortchange('md','desc');">新着順</a>
<a href="javascript:sortchange('md','asc');">古着順</a>
</p>
<p>作成日時順<br />
<a href="javascript:sortchange('cd','desc');">新着順</a>
<a href="javascript:sortchange('cd','asc');">古着順</a>
</p>
<table><?php echo $html; ?></table>
</body>
</html>
■■■改善2■■■
<?php
$cer = "SELECT * FROM data_data WHERE 1";
/*-------- PHPの改善箇所 ---------*/
if(isset($_GET['order'])){
list($d, $order) = explode("_", $_GET['order']);
$a = array("modified_date"=>"md", "create_data"=>"cd");
if(in_array($d, $a)){
foreach($a as $key => $value){
if($d != $value) continue;
$data = $key;
}
}
$cer .= " ORDER BY ".$data." ".$order;
}
/*--------------------------------*/
$acc = mysql_connect(ホスト,ユーザー,パスワード);
~この間は前回・改善1と同じです~
$html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n";
}
?>
<html lang="ja">
<head>
<title></title>
</head>
<body>
<form method="GET" action="data-sort-nametouitsu.php">
<p>更新日時順<br />
<input type="radio" name="order" value="md_desc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='md_desc') {echo 'checked ';} ?>/>新着順
<input type="radio" name="order" value="md_asc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='md_asc') {echo 'checked ';} ?>/>古着順
</p>
<p>作成日時順<br />
<input type="radio" name="order" value="cd_desc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='cd_desc') {echo 'checked ';} ?>/>新着順
<input type="radio" name="order" value="cd_asc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='cd_asc') {echo 'checked ';} ?>/>古着順
</p>
<noscript>
<input type="submit" name="order" value="送信" />
</noscript>
</form>
<script type="text/javascript">
function sortchange(frm){
frm.submit();
}
</script>
<table><?php echo $html; ?></table>
</body>
</html>
No.2
- 回答日時:
>o[x]=d & o[y]=a & o[z]=d こういうことですか。
>特殊な文字を使うメリットってなんですか?
PHPにパラメータを渡す上では多用されるテクニックですが
o[x]=d&o[y]=a&o[z]=d
で渡せば、$o=array("x"=>"d","y"=>"a","z"=>"d")という処理が
自動で処理されるのでかなり楽です
別の渡し方であればo=x_d+y_a+z_dみたいな処理でもよいですが
分解する処理が冗長になりがちです
改善の件については、好き嫌いがあるのでなんともいえませんが
作成日順と更新日時は同時にソートする必要はなさそうなので
それぞれ、昇順-降順-なにもしない、の3つの選択肢にした方がよいかも
ラジオボタン
もの凄く勉強になりました。
本当にありがとうございました。
こちらの質問文に画像の扱いを加えたものを試してみました。
見て頂けたらうれしいです。
http://oshiete.goo.ne.jp/qa/7522710.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プルダウンメニューにDBの内容...
-
NGワード設定もしくはテキス...
-
大切なPHP用語
-
XML_Serializerで複数のXMLの扱い
-
順位を付ける時のスコアの重複...
-
CSVでアップロードしたデータの...
-
Resource id #3 と表示されま...
-
String だと「 ByRef引数の型が...
-
file_existsでファイル名の部分...
-
in_array関数について
-
csvの内容を行単位で削除したい
-
配列をループでたくさん宣言し...
-
CSVファイルの最終行のデー...
-
C言語でCSVファイルの行数を読...
-
ヒアドキュメントの中のfor文
-
Call to a member function on ...
-
別ファイルの構造体の値を読み...
-
配列をファイルに書き込む方法
-
特定の文からメールアドレスの...
-
外部ファイルの出力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プルダウンメニューにDBの内容...
-
phpとmysqlで「あいまい検索」...
-
掲示板のあらし対策
-
しりとり 無限ループ?
-
file_get_contents()にて文字化け
-
PHP5の外部コマンド実行で、バ...
-
codeigniterのページネーション...
-
サイト名を取得するPHP
-
テキストボックスの日本語をロ...
-
多次元配列等の AND 検索について
-
Zend_Form_Element_Hash
-
XML_Serializerで複数のXMLの扱い
-
「ローマ字 -> ひらがな」へPHP...
-
cakephp2.6でfindを使い合計値...
-
$a[0]='w';$a[1]='r';を1回で
-
要素(文字列)から指定値を検索
-
クラス内での二次元配列への値...
-
順位を付ける時のスコアの重複...
-
pdfファイルの複数添付 引数の型
-
Resource id #3 と表示されま...
おすすめ情報