もともとPHP4.3くらいから、セッションIDを変更させるメソッドができました。


それが↓

session_regenerate_id


ただし、これはセッションIDを変更するだけで、変更前のセッションIDの情報は消されないので、自分で破棄する必要があります。


(破棄前に変数に落としておいて、セッション破棄後に新しいセッションを作り値をセットする)


PHP5.1.0以降では、前のセッションの情報を消すためのオプションが付加されました。


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


<?php


session_start();


session_regenerate_id(true);


?>


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



これで、セッションIDを変更できます。




SQLを3つ発行し、3つ目で間違った場合は1個目、2個目は処理をキャンセルさせないと矛盾が発生してしまいます。


そこで、全てのSQLをキャンセルするという処理が必要になるのですが、この複数のスクリプトで1個の処理を表す事をトランザクションといいます。


トランザクションは次の流れで処理されます。


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


トランザクションの開始


SQL1を実行


SQL2を実行


SQL3を実行


トランザクションを終了


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


トランザクションの終了で初めてデータベースに反映されます。これをコミットといいます。


途中でエラーが発生した場合にキャンセルする事をロールバックといいます。


では、C#でこれを実装するには、次の様にコーディングします。


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

using(System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(Data Source=(local);Initial Catalog=MySample;Integrated Security=True)){


con.Open();

System.Data.SqlClient.SqlTransaction tr = null;

tr = con.BeginTransaction();

System.Data.SqlCommand com = new System.Data.SqlCommand();

com.Connection = con;

com.Transaction = tr;

try {

com.CommandText = "INSERT INTO(SampleCode, GropuCode) VALUES('Sample1', 'Group1')";

com.ExecuteNonQuery();

com.CommandText = "INSERT INTO(SampleCode, GropuCode) VALUES('Sample2', 'Group1')";

com.ExecuteNonQuery();

com.CommandText = "INSERT INTO(SampleCode, GropuCode) VALUES('Sample3', 'Group1')";

com.ExecuteNonQuery();

}

catch(Exception ex){

if (tr != null){

tr.Rollback();
tr.Dispose();
tr = null;
}

Console.WriteLine(ex);

}

finally
{
// 正常の場合はコミット
if(tr != null)
{
tr.Commit();
tr.Dispose();
tr = null;
}
}

}


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


コネクションを開いて、コネクションにトランザクションの開始を命令します。


トランザクションを、コマンドを発行するオブジェクトにセットします。

(コネクションも一緒に)


トライ、キャッチでエラーが発生した際の処理を記述します。


エラーが発生し、トランザクションがnullでなければ、ロールバックを行います。


処理が完了した際にトランザクションがnullでなければ、ロールバックも発生していないので、正常とみなしコミットを行います。


これで、一つだけINSERTが失敗しても、全てキャンセルされるので、成功=3つのレコードが追加という保証がされます。


このように、成功か無かの状態を保つことをACID特性といいます。


ココら辺の事を、細かに説明すると本が1冊できてしまうくらいなので、もっと詳しくテクノロジーを知りたい場合は


.NETエンタープライズWebアプリケーション開発技術大全〈Vol.5〉トランザクション設計編 (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ―Microsoft.net)/赤間 信幸

¥4,095
Amazon.co.jp


この本がお勧めです。(SQLServerを基本に話してますが)


.NETエンタープライズWebアプリケーション開発技術大全のシリーズは結構重宝します。


.netでWEBアプリを作る方は見ておく事をお勧めします。

業務系のアプリでしたら、数値は3桁区切りで表示するのが基本かと。。。


そこで、C#では次の方法を使って3桁区切りにできます。


-- code-1 ----------


// stringクラスのformatメソッドを利用

int val = 10000;

Console.WriteLine(string.Format("{0:N0}", val));


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

-- code-2 -----------


// ToStringメソッドを利用

int val = 10000;

System.Globalization.NumberFormatInfo numberFormatInfo = new System.Globalization.NumberFormatInfo();
numberFormatInfo.NumberDecimalDigits = 0;
Console.WriteLine(val.ToString("N", numberFormatInfo));


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


code-1はFormatメソッドをMSDNで検索すれば、その他にも沢山の指定方法がある事がわかります。


同様にDateTimeも"{0:yyyy/MM/dd"}とやると、スラッシュ形式の日付にフォーマットされます。


code-2はToStringメソッドに"N"を指定すると、三桁区切りになります。


ただし、小数点も表示されてしまうので、小数点を0表示する設定をNumberFormatInfoで行い、指定します。


Globalization名前空間では、こういった書式を指定するクラスが豊富に用意されてます。


書式関係で困ったら一度調べてみるといいと思います。



ちなみに私のC#バイブルは定番かもしれませんが↓

C#によるプログラミングWindows 上 (マイクロソフト公式解説書)/Charles Petzold
¥5,775
Amazon.co.jp

C#によるプログラミングWindows 下 (マイクロソフト公式解説書)/Charles Petzold
¥5,460
Amazon.co.jp