人に聞けない痔の悩み、これでスッキリ >>

カラムの作成日時と更新日時のそれぞれでソート、
作成日時当日は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を使わずにスマートにやれる方法はないでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

なにかへん



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;
?>
    • good
    • 0
この回答へのお礼

有難うございます。多段の場合の処理方法、とても参考になりました。
実現したいのは多段ではないですが、覚えておきます。
名前、番号、など計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>

お礼日時:2012/06/08 01:29

>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つの選択肢にした方がよいかも
ラジオボタン
    • good
    • 0
この回答へのお礼

もの凄く勉強になりました。
本当にありがとうございました。

こちらの質問文に画像の扱いを加えたものを試してみました。
見て頂けたらうれしいです。
http://oshiete.goo.ne.jp/qa/7522710.html

お礼日時:2012/06/09 03:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q一度検索されたものに対するソートについて

こんにちは。php+mysqlで検索サイトを作っているんですが、初心者であり、スクリプトの書き方で困ってます。

「まず検索されたデータをweb上に表示させる。
表示された表のヘッダ部分(各名称)をクリックすると、表示されたものがソートされる。」

以前、各名称をクリックすることでソートさせるやり方が、掲載されていたのですが、一度検索条件によって出されたものに対しては、どのようにスクリプトを書けばよいのでしょうか?どなた様か教えていただけませんか?

もうひとつ、これはいろいろ調べたことなんですが、表示された表のヘッダ部分を固定させて、ボディ部分だけをスクロールさせることは難しいのでしょうか?

分かりにくい質問ですみません。宜しくお願い致します。

Aベストアンサー

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')";

$sql= "select * from tmp where (model like '$model%')
having (model like '%$grade%')";

$rst = mysql_query($sql,$con);

これだと tmptable を作るためのクエリーがないので当然エラーになります。
変数に入れただけでは実行されないので、SQL文を実行してください。

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')";
$rst = mysql_query($sql,$con);

$sql= "select * from tmp where (model like '$model%')
having (model like '%$grade%')";

$rst = mysql_query($sql,$con);

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')";

$sql= "select * from tmp where (model like '$model%')
having (model like '%$grade%')";

$rst = mysql_query($sql,$con);

これだと tmptable を作るためのクエリーがないので当然エラーになります。
変数に入れただけでは実行されないので、SQL文を実行してください。

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (m...続きを読む

Qフォームのtextareaにnl2brを使用すると、入力内容の改行部分に
が表示されてしまう。

現在、フォームを作成しています。
セッションを利用してフォームの次のファイルにデータを受け渡しています。

問題は、フォームのtextareaにnl2brを使用すると、出力画面のtextareaに入力された内容において改行がある部分に<br />タグが表示されてしまうことです。

フォームの流れ:
start.phpにおいてフォームに入力及び、入力エラーがある場合、入力内容訂正の表示。
mail.phpにおいて入力内容の確認及びデータ送信。

start.phpのtextarea以下:
<textarea name="test"><?php echo nl2br(htmlspecialchars($input_data['test'], ENT_QUOTES, 'UTF-8')) ?></textarea>
解説:start.phpでは、フォームの入力項目のいずれかに入力エラーがあるとその項目の入力内容の訂正を促し、入力されたデータをもう一度表示します。(<textarea name="test">に入力されたデータをもう一度<textarea name="test">に表示します。)

mail.phpにおいてstart.phpのtextareaに入力されたデータを表示する部分は以下:
<?php echo nl2br(htmlspecialchars($input_data['test'], ENT_QUOTES, 'UTF-8')) ?>

start.phpにおいて入力項目のいずれかにエラーがあり、<textarea name="test">に入力されたデータをもう一度<textarea name="test">に表示した場合も、また、mail.phpにおいてstart.phpのtextareaに入力されたデータを表示した場合も、<textarea name="test">内の文字列に改行があるとその部分に<br />が表示されてしまいます。

入力例:
あいうえおかきくけこ
たちつてと

表示例(nl2br使用):
あいうえおかきくけこ<br />
たちつてと
解説:nl2brを使用した場合、<br />は挿入されてしまいますが、予定の場所で改行されて表示されます。

試しにnl2br()をコードから削除すると、以下のような表示となります。
表示例(nl2br未使用):
あいうえおかきくけこたちつてと
解説:nl2brを使用しない場合、改行されません。

どのようにすれば、textareaに入力された内容の改行部分が改行だけされ<br />が表示されないようにできるでしょうか?

よろしくお願いします。

現在、フォームを作成しています。
セッションを利用してフォームの次のファイルにデータを受け渡しています。

問題は、フォームのtextareaにnl2brを使用すると、出力画面のtextareaに入力された内容において改行がある部分に<br />タグが表示されてしまうことです。

フォームの流れ:
start.phpにおいてフォームに入力及び、入力エラーがある場合、入力内容訂正の表示。
mail.phpにおいて入力内容の確認及びデータ送信。

start.phpのtextarea以下:
<textarea name="test"><?php echo nl2br(htmlspe...続きを読む

Aベストアンサー

nl2brを使用して、<br />を \n とかに戻してやればいいと思います。
$data = nl2br(htmlspecialchars($input_data['test'], ENT_QUOTES, 'UTF-8'));
echo ereg_replace ("<br />","\n",$data);
とかで。

QPHP arrayを使ってソートする。

PHP初心者です。
教えてください。
現在複数のXMLファイルをPHPで取り込んで、それぞれ要素のデータを画面上に一行ずつ表示させています。

全件取り込んで、日時(要素)のデータでソートしたいです。
配列を使ってfor文を使えばできると思っていますが、参考にできるサンプルがあれば教えていただけますでしょうか。
カンマ区切り(?)で1回文字列にしてソートとかすればいいのでしょうか?
イメージがつかめていません。

宜しくお願いします。

Aベストアンサー

ごめんなさい

foreach ($XmlData as $TmpData) {
print "<dd>" . $TmpData['Link'] . "</dd>";
}

ですね。
2次元配列になってるの忘れてました。

Qphp データ削除

一覧画面に更新、削除というボタンをつくり番号を受け取って削除したいのですが、削除ボタンを押しても画面は変わるのですが削除されません
助けてください

番号 int プライマリーキー
氏名 varchar
住所 varchar

一覧画面のソース
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>一覧画面</title>
</head>
<body>
<BLOCKQUOTE>
<BR>一覧画面<BR><BR>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}


$result = mysqli_query($con,"SELECT * FROM tbl_test");

echo "<table border='1'>
<tr>
<th>番号</th>
<th>氏名</th>
<th>住所</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['番号'] . "</td>";
echo "<td>" . $row['氏名'] . "</td>";
echo "<td>" . $row['住所'] . "</td>";

echo "<form action=koushin_input.php method=post>";

echo "<td><input type=submit value=更新></td>";
echo "</form>";

echo "<form action=sakujo.php method=post>";

echo "<td><input type=submit value=削除></td>";
echo "</form>";

echo "</tr>";
}
echo "</table>";


mysqli_close($con);
?>

<BR><BR><BR> <A HREF="http://localhost/regist.php">
<INPUT TYPE = "SUBMIT" VALUE = "新規登録"></A>

</BLOCKQUOTE>
</body>
</html>

削除ソース 
sakujo.php
<html>
<body>
<?
// データベースに接続
if(!$con=mysql_connect("localhost","root","admin")){
echo"接続エラー";
exit;
}

// データベースを選択
if(!mysql_select_db("db_test",$con)){
echo"データベース選択エラー";
exit;
}

// DELETE文を実行
$sql = "delete from tbl_test where '番号'= 番号;
if(!$res=mysql_query($sql)){
echo "SQL実行時エラー";
exit;
}

// データベースから切断
mysql_close($con);

// 登録完了メッセージの表示
echo "削除完了";
?>
</body>
</html>

どういう風にpostで渡せばいいですか?

一覧画面に更新、削除というボタンをつくり番号を受け取って削除したいのですが、削除ボタンを押しても画面は変わるのですが削除されません
助けてください

番号 int プライマリーキー
氏名 varchar
住所 varchar

一覧画面のソース
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>一覧画面</title>
</head>
<body>
<BLOCKQUOTE>
<BR>一覧画面<BR><BR>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
// Check connection
if (mysqli_connect_...続きを読む

Aベストアンサー

削除してから表示するという流れ組んでみてください
ボタンじゃなくていいならざっとこんな感じ

<table border='1'>
<tr>
<th>番号</th>
<th>氏名</th>
<th>住所</th>
</tr>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
if(isset($_GET["del"]) and isset($_GET["id"]) and $_GET["del"]==1){
$id=(int) $_GET["id"];
$result = mysqli_query($con,"DELETE FROM tbl_test where `番号`={$id}");
}
$result = mysqli_query($con,"SELECT * FROM tbl_test");

while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>".$row['番号']."</td>";
echo "<td>".$row['氏名']."</td>";
echo "<td>".$row['住所']."</td>";
echo "<td><a href=\"".$_SERVER["SCRIPT_NAME"]."?del=1&amp;id=".$row['番号']."\">削除</a></td>";
echo "</tr>";
}
mysqli_close($con);
?>
</table>

削除してから表示するという流れ組んでみてください
ボタンじゃなくていいならざっとこんな感じ

<table border='1'>
<tr>
<th>番号</th>
<th>氏名</th>
<th>住所</th>
</tr>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
if(isset($_GET["del"]) and isset($_GET["id"]) and $_GET["del"]==1){
$id=(int) $_GET["id"];
$result = mysqli_query($con,"DELETE FROM tbl_test where `番号`={$id}");
}
$result = mysqli_query($con,"SELECT * FROM tbl_test");

while($row = mysqli_fetch_ar...続きを読む


人気Q&Aランキング