都道府県穴埋めゲーム

phpでメールフォームを作っています。
注文用のフォームなのですが注文番号を自動で割り当て
メール送信時に表示させたいと思っております。

全5桁位で重複させない番号をランダムで振れればいいのですが
mysqlと連動などしていないのでこれは無理でしょうか?

00001~99999まで通し番号で振り99999になったら00001に戻ると
いう形式でも構わないのですがいずれは重複してしまうのかと
悩んでおります。

phpには知識がないもので伝わりづらい質問かと思いますが
方法を具体的に教えて頂けますと幸いです。

アドバイスや参考サイトでも構いませんので宜しくお願い致します。

A 回答 (6件)

 追記ですが、お詫びに、そのdata_order.plを簡易的に見るphpを作りましたので必要でしたら使ってやってください。



・show_list.php ---------------------------------------------

<html><body>
<?php
$temp = $new_no = '';
$temp_ar = $new_ar = $new_list = array();
$data_mail = './data_order.pl';

$DATA_LIST = fopen( $data_mail , 'r');
flock($DATA_LIST, LOCK_SH);

while(!feof($DATA_LIST)){
$temp = trim(fgets($DATA_LIST));
$temp_ar = explode("+", $temp);
array_push($new_ar, $temp);
}

flock($DATA_LIST, LOCK_UN);
fclose($DATA_LIST);

foreach($new_ar as $value){
$new_list = explode('+', $value);
if(!empty($new_list[0])) print "<li>" . $new_list[0] . " = " . $new_list[1];
}

?>
</body></html>

----------------------------------------------------------------
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
再度教えて頂きました通りテスト送信したところエラーもなく
正常に送信され番号も1つづつ増えるのが確認できました!

data_order.plにも正常に値が書き込まれており本当に助かりました。
現在は、ソースの内容を完全に理解できる程ではありませんが自分で
作れるようになるためにこれからも頑張ってみようと思います。

最後までわかりやすく教えて頂きましてありがとうございました!

お礼日時:2008/03/16 12:18

 大変失礼致しました。


 別な作業の合間に記してしまったので、最後の最後に微妙に間違っているところがありました。
 ただ、最初に私が記したのをテストしたら何もエラーがでませんでしたが、asd3330さんが記してくれたのを行ったら同様なエラーがでました。
 asd3330さんのを見たらバックスラッシュが¥マークではなかったので、この辺がエラーの要因に思えます。
 エラーが出たら、改めてバックスラッシュを打ち直してみてください。

========================================
$name = $time = $temp = $new_no = $new_data = $i = '';
$temp_ar = $new_ar = $last_data = array();
$name = $_POST['name'];
$data_mail = './data_order.pl';

if(!empty($_POST['name'])) $name = $_POST['name'];
$time = time();

$DATA_ALL = fopen( $data_mail , 'r+');
flock($DATA_ALL, LOCK_EX);

while(!feof($DATA_ALL)){

$i++;
$temp = trim(fgets($DATA_ALL));

if($i == '1'){
$temp_ar = explode("+", $temp);
$new_no = $temp_ar[0] + 1;
$new_data = $new_no ."+". $name;
}

array_push($new_ar, $temp);

} // end_while(!feof($DATA_ALL)){

array_unshift($new_ar, $new_data);

$last_data = implode("\n", $new_ar);
$last_data = trim($last_data);

rewind($DATA_ALL);
ftruncate($DATA_ALL, 0);
fwrite($DATA_ALL, $last_data );
flock($DATA_ALL, LOCK_UN);
fclose($DATA_ALL);

========================================
    • good
    • 0

>参考までにですが1づつ足していくプログラムはどのように書けば



これもいくつか方法がありますが、先頭もしくは、最後に追加した物を抜き出して、listで分けて処理する方法と、管理するものだけ、別に保存するって方法も、ありますよー。

90 ← この部分に、番号を書いて、使う時は抜き出すか。
90<>裕次郎<>ドラム<>おいらのドラムは嵐を呼ぶぜ。
 (↑この一文を読み込んで、分解して、カウントするか。)
89<>ハナ肇<>ドラム<>アッと驚く、為五郎~♪。
88<>植木等<>ギター<>お呼びでない?こりゃまた失礼しました。
・・・
1<>テスト<>品物<>テストを始めます。

ランダムにしなかったのは、まず、簡単な事と、100番目のお客さんとか、やりたかったので。

でも、ANo.3さんは、そらでかけるんですねー。
ちょっとすごいかも。
私は、何かを見ながらなでないと、出来ないというか、覚えていない。(苦笑。

CGIは、最初は人のスクリプトを見られるから、自分が作ろうとしている物に、似ている物をパクる・・・、いや、参考にした方がいいですよ。
http://asahikawa-s.com/cgi/
ここから、シンプルとかで、検索して、分かりそうなスクリプトを、研究するとか。
もしくは、初心者用の本をもう2冊くらい買うとか、図書館で借りるとか。

できれば、注文用のフォームというのなら、クロスサイトスクリプティングやデータの汚染とかも、見ていた方がいいですよ。
PHPは、それほど難しい言語ではないので、いろいろと挑戦してみてくださいね♪
    • good
    • 0

 単純に連番を付けるだけでしたらMySQLなどは要らないと思います。

むしろそういうのはどのようにデーターを取得し、どのようにデーターを活用するか、だと思います。

 ANo.2さんへの回答お礼から、具体的な1を足してゆくスクリプトは、

 メールを送信するのは mail関数なので、その前に記します。メールフォームで受け取ったのを各変数に入れます。
 あくまでも例なのでご自分に合わせてください。htmlspecialcharsなどのチェックは省いています。
 行頭のインデントは実際はタブですが、ここで見やすくするために全角スペースを入れています。

=============================

$your_name = $your_time = $temp = $new_no = $new_data = $i = ''; // 変数初期化
$temp_ar = $new_ar = $last_data = array(); // 配列初期化

// メールフォームhtmlの名前記入がname="your_name" になっているとして
$your_name = $_POST['your_name'];

$data_mail = './data_order.pl'; // データーファイルへのパス。パーミッションは606

if(!empty($_POST['name'])) $you_name = $_POST['name']; //氏名
$your_time = time();

$DATA_ALL = fopen( $data_mail , 'r+');
 flock($DATA_ALL, LOCK_EX);

 while(!feof($DATA_ALL)){

  $i++;
  $temp = rtrim(fgets($DATA_ALL));

  if($i == '1'){
   $temp_ar = explode("+", $temp);
   if(!empty($temp_ar[0])) $ex_no = $temp_ar[0];
   if($ex_no <= '0') $new_no = '1';
      else $new_no = $ex_no++;
   $new_data = $new_no ."+". $your_name;
  }

  $new_ar = array_push($new_ar, $temp);

 } // end_while(!feof($DATA_ALL)){

 $new_ar = array_push($new_ar, $new_data);
 $last_data = implode("\n", $new_ar);

 rewind($DATA_ALL);
 ftruncate($DATA_ALL, 0);
 fwrite($DATA_ALL, $last_data );
 flock($DATA_ALL, LOCK_UN);
fclose($DATA_ALL);

=============================

 済みません、時間がないので確認していません。
 より簡素でスマートな記述があると思います。php4でも動くと思います。

この回答への補足

お忙しい中、何度もお返事頂きましてありがとうございます。

まずは、data_order.pl(空のファイル)をつくりサーバーへアップ後
パーミッションを666に変更しました。

名前のinputのnameがnameなのでyuor_nameをnameに変更し
mb_send_mailの前に以下のソースを追加しました。

$name = $time = $temp = $new_no = $new_data = $i = ''; // 変数初期化
$temp_ar = $new_ar = $last_data = array(); // 配列初期化

// メールフォームhtmlの名前記入がname="name" になっているとして
$name = $_POST['name'];

$data_mail = './data_order.pl'; // データーファイルへのパス。パーミッションは606

if(!empty($_POST['name'])) $name = $_POST['name']; //氏名
$time = time();

$DATA_ALL = fopen( $data_mail , 'r+');
flock($DATA_ALL, LOCK_EX);

while(!feof($DATA_ALL)){

$i++;
$temp = rtrim(fgets($DATA_ALL));

if($i == '1'){
$temp_ar = explode("+", $temp);
if(!empty($temp_ar[0])) $ex_no = $temp_ar[0];
if($ex_no <= '0') $new_no = '1';
else $new_no = $ex_no++;
$new_data = $new_no ."+". $name;
}

$new_ar = array_push($new_ar, $temp);

} // end_while(!feof($DATA_ALL)){

$new_ar = array_push($new_ar, $new_data);
$last_data = implode("\n", $new_ar);

rewind($DATA_ALL);
ftruncate($DATA_ALL, 0);
fwrite($DATA_ALL, $last_data );
flock($DATA_ALL, LOCK_UN);
fclose($DATA_ALL);

何度かテスト送信してみたのですがメール送信までは
正常に行われるのですが送信完了画面で以下のエラー出てしまいます。
(メールフォームはHTML_QuickFormで生成しており入力画面→確認画面→送信完了画面に移行します。)

Warning: array_push() [function.array-push]: First argument should be an array in /hoge/form.php on line 370

Warning: implode() [function.implode]: Bad arguments. in /hoge/form.php on line 371

指す場所は以下のソースです
$new_ar = array_push($new_ar, $new_data);
$last_data = implode("\n", $new_ar);

また、data_order.plに送信後に何も書き込まれていないのですが
これが原因でしょうか?
パーミッションを606でも試してみましたが結果は同じでした。

番号をメール送信時に何で取得するのかがわからずでいろいろ試してみたところ
以下のようにメールに送信されました。
(名前は太郎で送信しています。)

(例)php側の表示→メール表示
$data_mail→./data_order.pl
$DATA_ALL→Resource id #38
$new_data→1+太郎

なにか参考になるといいのですが原因がわかりますでしょうか?

補足日時:2008/03/16 02:26
    • good
    • 0

だぶらない乱数を取得する方法は、いくつかあります。


簡単に書くと、

乱数を取得して、その数値が、配列の中になければ、配列に入れる。
再帰でも、while文でも、繰り返せばいいだけです。
これを、とりあえず100件を作成・保存、100件になったら、保存を読み込んで、次の100件を作れば、出来ます。

http://q.hatena.ne.jp/1107225699
http://okwave.jp/qa3153280.html
この辺が参考になるかな。

でも、面倒じゃないですか?
それに、数が増えれば、増えるほど、処理が重くなりますし。
PHPだけなら、1000件以上は、重いでしょう。

単純に、Noを1から足していくのはダメでしょうか?
Noは、前の数値+1で、楽ちんでだぶらない。w
IDとPassで管理して、だぶらせません。
IDは、登録の際に重複を検索すれば、OK。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
言われてみれば確かに負荷が掛かってきそうですね。
正直そこまで考えれませんでした・・・

>単純に、Noを1から足していくのはダメでしょうか?
Noは、前の数値+1で、楽ちんでだぶらない。w

かぶらずに番号が振れればいいのでこれでもいいような気がします。
idやpassで管理できれば理想なのですがそこまでの技術がないもので・・・

参考までにですが1づつ足していくプログラムはどのように書けば
いいものでしょうか?

お手数ですが宜しくお願い致します。

お礼日時:2008/03/15 19:28

 注文したら、番号、注文者、注文時間time() をファイル(任意のdata_order.plとか)に保存します。


 次に注文があったら、そのファイルを読み込み、最後に書き込んだ注文者の番号に 1を足して、新規に保存すれば、通し番号になると思います。
 1を足すところで、最後の番号が99999なら1に戻るifを付けるとか。

 同じ人が注文した場合はどうするかは、作成者の意図に寄るところと思いますが。

この回答への補足

お返事ありがとうございます。

>注文したら、番号、注文者、注文時間time() をファイル(任意のdata_order.plとか)に保存します。

なんとなく意味はわかるのですが具体的な方法がわからないので
#2の方も同じ方法があるとアドバイスを頂いたので1づつ足す方向で
検討しようと思います。

>1を足すところで、最後の番号が99999なら1に戻るifを付けるとか。

そこまで大規模なものになるか微妙なとこですがそこまでとなると
やはりmysqlなどを併用するべきなのでしょうか?

補足日時:2008/03/15 19:29
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A