カラムの作成日時と更新日時のそれぞれでソート、
作成日時当日は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で質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- PHP php エラー 2 2022/10/23 16:43
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスの日本語をロ...
-
2次元配列の値の受け渡しについ...
-
プルダウンメニューにDBの内容...
-
phpとmysqlで「あいまい検索」...
-
PHPで配列をPOSTデータで送った...
-
マッチング処理(1:N)
-
$_SESSIONに二次元配列を使える...
-
バイナリファイルの内容を、そ...
-
スカラーのベクトル微分
-
複数行のデータのPOST処理に関して
-
配列をループでたくさん宣言し...
-
PHPでCSVの一部の行を編集したい
-
Perlで重複行を削除したい
-
CSVファイルの最終行のデー...
-
配列を回すとき、最後の要素だ...
-
file_existsでファイル名の部分...
-
【Smarty】foreach関数やsectio...
-
C言語 最大値と最小値を求めて...
-
C言語の配列をPush(追加)する...
-
PHPのセレクトボックスの初期値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プルダウンメニューにDBの内容...
-
QuickForm createElement での ...
-
phpのin_array()でわからない事...
-
バッチでFTPコマンド
-
NGワード設定もしくはテキス...
-
2次元配列の値の受け渡しについ...
-
file_get_contents()にて文字化け
-
Zend_Form_Element_Hash
-
日付、時間の2段階でソート
-
サイト名を取得するPHP
-
codeigniterのページネーション...
-
しりとり 無限ループ?
-
phpとmysqlで「あいまい検索」...
-
listへのappendが出来ない件
-
テキストボックスの日本語をロ...
-
usortで3つの項目を昇順・降順...
-
1~100の数字の9の倍数だけ同じ...
-
pukiwikiのユーザ認証の設定で...
-
cakephp2.6でfindを使い合計値...
-
PHP5の外部コマンド実行で、バ...
おすすめ情報