最初に、JavaScriptが利用できない状態では機能しない。。。


ということで、本当に二重ポストが困る時はセッションを使いましょう!!


-- code --------------

<?php

sleep(1);

?>

<html>
<head>
<title>簡単二重ポスト防止</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<script language="javascript">
function disabledEvent(){
return false;
}
</script>
<body>
現在:<?php print date("Y/m/d H:i:s");?><br />
<form method="post" action="<?php print ($_SERVER['SCRIPT_NAME']); ?>">

<input type="button" name="testButton" onclick="document.forms[0].testButton.disabled=true; document.forms[0].testButton.onclick=disabledEvent; document.forms[0].submit();" value="日付更新">
</form>
</body>
</html>

---------------------


javascriptで一度押したボタンは押せなくしてしまいます。


ブラウザによって対応していないのもあるので、ついでにポストするイベントも変更です。

サブクエリとIN句を利用し、データを抽出してみようと思います。


例のごとくNorthwindテーブルを利用します。


ProductNameが"Chai"のOrdersを抽出します。


-- code ---------------------


select *
from Orders
where
OrderID IN (
select OrderID
from [Order Details]
inner join Products on [Order Details].ProductID=Products.ProductID
where Products.ProductName='Chai'
)

----------------------------


これで可能です。


IN句は次の使い方でも利用ができるのですが、


-- code ---------------------


-- 直接指定

select *
from Orders
where
OrderID IN (

10285,

10294
)

---------------------------


データベースはリアルタイムに更新されていくので、今現状のを知りたいという時に、サブクエリと合わせる方法もあります。


もちろん、INNER JOINで全部くっつけて、ProductName='Chai'をやっても同様の結果が得られます。

プログラムに意味を持たせるなら、今回のやり方もいいかと思います。

通常SQLで日付をセレクトすると時間まで表示されてしまいます。


SQLServerといえばNorthwindテーブルというくらい、有名なサンプルテーブルを使って実験です。


-- code -----------


select OrderDate from Orders


-------------------


結果1行目に

1996-07-04 00:00:00.000
が表示されました。


Year関数、Month関数、Day関数、CAST関数を使って時間を取り除く事は可能ですが・・・めんどいです。



ということで、次のSQLを実行してみましょう


-- code ------------------


select CONVERT(VARCHAR, OrderDate,111) from Orders


-------------------------


結果1行目に

1996/07/04
が表示されました。