2016-10-27 6 views
-1

私のプロジェクト受領番号は自動増分で、1年の完了は毎年4月1日から3月31日です。 1年が終わると、領収書の番号は1にリセットされるはずです。私は長い間試してきましたが、IMの初心者としてはできませんでした。受領番号が完了して1年になるとリセットします

$query = mysql_query("SELECT `receipt_no` FROM tsurphus"); 
if(mysql_num_rows($query)>0) { 
    $data = mysql_query("SELECT max(receipt_no)+1 FROM tsurphus"); 
    $res = mysql_fetch_row($data); 
    echo $res[0]; 
    echo $_POST['$res']; 
} 
else { 
    echo 1; 
} 
+0

コードには自動インクリメントが表示されず、簡単なクエリが表示されます。現在の年の最大数を選択するように、クエリに年を含めるようにしてください。より良いことに、数字について心配する必要はなく、適切な自動インクリメントフィールドを使用するので、すべての領収書は毎年繰り返されるものではなく、ユニークな番号を持っています – Anigel

+0

@Shadowは応答に感謝します。あなたが提案している... thxxxx – Explorer

+1

これは根本的に欠陥があります。このようなことにauto_increment機能を使用しないでください。そして、PHPの廃止予定のmysql_ APIを使用しないでください! – Strawberry

答えて

0

マルチセッションに関する一般的な問題があります。 receipt_noの読み方は、サイトがほぼ同じ時間に呼び出されたときに2つの同じ番号が得られる状況につながります。

いくつかのアプローチがあります。 1つは、毎月4月1日の深夜に、receipt_noが0にリセットされた新しいテーブルtsurphusを作成することになります。このテーブルには、それぞれAuto Incrementと定義された場合、明確な一意の値が挿入されます。

しかし、これは情報が不足しているため適切な解決策ではないかもしれません。コメントに要求されるように

更新:

私はあなたに私はそれをやったどのような情報を提供することができます。それがあなたに適しているかどうかを判断しなければなりません。私が書いたプロジェクトでは、完璧な解決策でした。なぜなら、各会計年度に完全な空のテーブルが必要だったからです。

このコマンドは、1月1日午前0時にcronジョブとして実行されました。私はどのようにあなたの知らない

CREATE TABLE IF NOT EXISTS tsurphus_2016 LIKE tsurphus_2016; 

:ロジックは、既存のINSERTコマンド[私は新しいテーブルがまだ作成されなかったINSERTコマンドがあることはありませんでしたことを意味]との衝突が生じなかったことをそのように実装されました内部規則はprimary keyの名前についてされているが、 - それは私のようなものであればprimary keyは表のように同じ名前を持つこと - あなたはprimary keyの名前を変更することもあります。

ALTER TABLE tsurphus_2016 CHANGE `tsurphus_2015id` 
           `tsurphus_2016id` INT(11) NOT NULL AUTO_INCREMENT 

あなたはそれぞれそれを実行する必要があります真夜中の4月1日。

+0

部屋の象を無視しています。 – Strawberry

+0

@AlBundy。あなたが正しいです。会計年度ごとに異なる表が必要です。同じようにコーディングしてください。私は単純にここでコピーして、PHPでim beginerとして貼り付けることができます。事前にたくさんありがとう。 – Explorer

+0

@Explorer PHPにはあまりにも多くのことはありません。あなたは*古い*テーブル名を確定しなければなりません(例えば、会計年度を追加します - 例えば2016年)、それを新しい会計年度で置き換えなければなりません。更新された回答を確認してください。 –

関連する問題