質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

5322閲覧

PHPで投稿番号表示

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/05/13 13:50

したいこと

htmlで作成した入力フォームの情報をPHPに送信。
→PHPでテキストファイルに投稿番号を追加書き込み

エラー

テキストファイルを確認したら、

5.000005E+11<>
名前を入力してください<>
コメントを入力してください<>
2016年05月13日22時48分

のように、投稿番号部分が「5.000005E+11<>」と表示される。
他の追加書き込みされた投稿番号も同じ番号になっている。

ソース

lang

1<html> 2<head> 3 <mata charset="utf-8"> 4 <lang="ja"> 5 <title>kadai2-2output.php</title> 6</head> 7 8<body> 9<?php 10 print ("次のデータを受け取りました<br />"); 11 $name =$_POST['name']; 12 $comment = $_POST['comment']; 13 print ("名前:{$_POST['name']} <br />"); 14 print ("コメント: {$_POST['comment']} <br />"); 15?> 16 17<?php 18$postnumber = 0; 19for ($i = 0 ; $i <= 1000000; $i++) { 20 $postnumber += $i ; 21} 22 23$fp = fopen("kadai2-2.txt", "a"); 24flock($fp, LOCK_EX); 25 26fwrite($fp, $postnumber . '<>' . PHP_EOL); 27fwrite($fp, filter_input(INPUT_POST, 'name') . '<>' . PHP_EOL); 28fwrite($fp, filter_input(INPUT_POST, 'comment') . '<>' . PHP_EOL); 29fwrite($fp, date('Y年m月d日H時i分') . PHP_EOL); 30 31flock($fp, LOCK_UN); 32fclose($fp); 33?> 34 35</body> 36</html> 37

恐らく計算の部分がミスっているんだと思いますが、解決方法がわかりません。
どうか、ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

恐らく計算の部分がミスっている

以前の問題として、異なるHTTPリクエストの間でPHPの変数を共有することはできません。

つまり、1回目の投稿で変数$postnumberの値を計算したとしても、
次の投稿でその値を引き継ぐことはできない、ということです。

なぜなら、WEBサーバからCGIとしてPHPプログラムを実行する場合、
リクエストのたびにPHPのプロセスが新規に起動するからです。

これを実現する最も手っ取り早い方法として、takasima20様が提案されているように
最新の投稿番号をファイルに保存しておくのが良いでしょう。

例えば、以下のような感じです。
("投稿番号"をどのような数字にしたいのか不明なので、とりあえず 1 から始まる連番としています)

before

php

1$postnumber = 0; 2for ($i = 0 ; $i <= 1000000; $i++) { 3 $postnumber += $i ; 4}
after

php

1$fq = fopen('sequence.txt', 'c+'); 2flock($fq, LOCK_EX); 3 4$previous = fgets($fq); 5if ($previous === FALSE) { 6 $postnumber = 1; 7} else { 8 $postnumber = $previous + 1; 9 fseek($fq, 0); 10 ftruncate($fq, 0); 11} 12fputs($fq, $postnumber); 13 14flock($fq, LOCK_UN); 15fclose($fq);

http://php.net/manual/ja/function.fgets.php
http://php.net/manual/ja/function.fseek.php
http://php.net/manual/ja/function.ftruncate.php
http://php.net/manual/ja/function.fputs.php


ちなみに

投稿番号部分が「5.000005E+11<>」と表示される

についてですが、kaz.Suenaga様とkurosuke様の回答にあるように、 5.000005E+11 は

0〜1000000 の整数を足した和 = 500000500000

を科学記法で表した文字列です。
以下のページを”科学記法”で検索してみてください

http://php.net/manual/ja/function.sprintf.php

変数$postnumberの値が 500000500000 になる理由は、kaz.Suenaga様の回答の通りです。

"5.000005E+11"と出力される理由ですが、
恐らくminova様がお使いの環境ではinteger型で 500000500000 を扱うことができないためです。

以下のページの”整数のオーバーフロー"という項に、その説明があります。
http://php.net/manual/ja/language.types.integer.php

integer型の範囲外の数を指定した場合、かわりに floatとして解釈されます。

で、私の環境で試してみたところ、PHPでinteger型の範囲外のfloat型を出力すると、
どうやら科学記法で出力されるようです。

投稿2016/05/14 10:20

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/17 05:31

毎回ご丁寧に回答いただき感謝の言葉もございません… URLを確認・理解したう上で、 KiyoshiMotoki様のソースを参考に 再度チャレンジしようかと思います! 重ねてお礼申し上げます m(__)m
guest

0

ロジックを確認してみましょう。
$postnumberの数値は「500000500000」となります。

integerの有効桁数は、11桁なので、数値が大きすぎて「5.000005E+11」となります。

投稿2016/05/13 14:03

kurosuke

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/05/14 10:24 編集

> integerの有効桁数は、11桁なので これは環境によります。 PHPのマニュアルに、以下のように記載されています。 http://php.net/manual/ja/language.types.integer.php > 整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 実際、私の環境では PHP_INT_MAX = 9223372036854775807 でした。
退会済みユーザー

退会済みユーザー

2016/05/17 05:26

で、ですよね。とんでもない数に… それで自分の環境では「5.000005E+11」と表示されていたんですね。 ご指摘、ありがとうございました。
guest

0

PHP

1$postnumber = 0; 2for ($i = 0 ; $i <= 1000000; $i++) { 3 $postnumber += $i ; 4}

これだと、 $postnumber = $postnumber + $i をforでループしていることになりますよね。
つまり常に 0〜1000000 の整数を足した和を求めていることになります。

本来はどう計算すべきなのかは、$postnumber の仕様次第なのでわかりませんが、この部分が明らかに想定と異なっていると思います。

投稿2016/05/13 13:57

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/17 05:23

そこをループしてることになっちゃうんですよね… すみません、以後しっかり確認していきます。 ご指摘ありがとうございました。
guest

0

postnumberを求めてるとこ?

PHP

1$postnumber = 0; 2for ($i = 0 ; $i <= 1000000; $i++) { 3 $postnumber += $i ; 4}

毎回くそでかい数字になるまで同じように足しこんでいるようですが、
どうしたいのでしょうか。

投稿2016/05/13 13:55

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2016/05/13 14:00

例えば、現在の投稿数を適当なテキストファイルに書き込んでおいて、 投稿ごとに参照&更新するみたいな方法はどうでしょうか。
退会済みユーザー

退会済みユーザー

2016/05/17 05:25 編集

落ち着いて確認したら理解しました(白目 何がしたいんだ私は…orz ご指摘ありがとうございます。 その方法で再度挑戦してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問