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

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

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

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

Q&A

解決済

3回答

2877閲覧

php txtから読み込んで合計数値

snowww000

総合スコア12

PHP

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

0グッド

0クリップ

投稿2017/06/16 15:34

編集2017/06/17 07:20

PHP独学でまなび挑戦中のものです。

PHPのバージョンは、7.1(CGI版)です。

data.txt(タブ区切り)には、現在は、数字のあとに日付を入れています。
↓このような感じ
no1 no2 no3 no4
1 2 3 4 2017/6/16 20:00

これを

no1 no2 no3 no4
1 2 3 4 10

となるように4つの数字の合計値を最後に持ってくるようにしたいのですが、なかなかうまく出来ません。

arrayを使って解決方法を模索しているのですが上手くいきません。教えて頂きたいです。
よろしくお願いいたします。

PHP

1// data.txtからタイトルを持ってくる所 2 3$fp = @fopen($file,"r"); 4if(!$fp) Print_Error(2); 5 6while(!feof($fp)) { 7$buff = fgets($fp,255); 8$line .= $buff; 9if(ereg("\n",$buff)) break; 10} 11$line = ereg_replace("\n","",$line); 12$title = explode("\t",$line); 13fclose($fp); 14 15// 値の取得部分 16 17for($loop = 0;$loop < count($title);$loop++) { 18$key = $title[$loop]; 19$val = ereg_replace("\x0D\x0A|\x0D|\x0A","",$$key); 20$result[] = $val; 21} 22$result[] = date("Y/m/d H:i:s",time()); //日付と時間 23 24// data.txtファイルへの書込み部分 25 26$fp = @fopen($file,"a"); 27if(!$fp) Print_Error(3); 28 29fputs($fp,join("\t",$result)."\n"); //ここで日付をいれる。※ここで日付でなく合計値にしたい。 30fclose($fp);

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

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

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

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

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

kei344

2017/06/16 16:18

質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
snowww000

2017/06/17 07:10

ご指摘、ありがとうございました。さっそく変更してみました。
guest

回答3

0

ベストアンサー

PHP タグ

<script language="php"> による PHP タグ は PHP 7.0.0 で削除されています。代わりに次のように記述します。

php

1<?php 2// ここに PHP スクリプトを記述する 3?>

HTML からの脱出

echo を使って HTML をすべて出力する方法は非常に見づらく、変数を使っているところなどを見つけるのも困難です。PHP はテンプレートエンジンとして動作するため、一般には次のように記述します。

php

1<?php 2$title = 'エラー'; 3?> 4<!doctype html> 5<html> 6<head> 7 <!-- 上で代入した $title 変数を出力する --> 8 <title><?php echo $title ?></title> 9</head> 10<body> 11 <!-- echo 短縮構文を使って出力する(同等) --> 12 <h1><?= $title ?></h1> 13</body> 14</html>

extract の危険性

extract 関数$_REQUEST などの信頼できない入力に対して使用するのは非常に危険です。$_REQUEST には予期しないパラメーターなどが含まれている可能性があり、こちらで定義した変数名を上書きするおそれがあるからです。たとえば次の例(index.php)を見てください。

php

1<?php 2// ファイル名 3$filename = 'data.txt'; 4 5// 行データ 6$line = []; 7 8// GET パラメーターや POST のフォームなどをすべてグローバル変数として読み込む 9// デフォルトでは存在する変数も上書きを行う 10extract($_REQUEST); 11 12// 上で指定したファイル名から読み込む 13fopen($filename, 'r'); 14 15// 以下読み込みなどが続く

このスクリプトは index.php としてアクセスした場合は予期したとおりに動きますが、GET パラメーターなどを与えた場合は変数が上書きされます。たとえば次のようにアクセスした場合です。

index.php?filename=/etc/passwd&line[]=1&line[]=2&line[]=3

この時点で $filename$lineextract 関数 によって次のような値に上書きされます。

php

1$filename = '/etc/passwd'; 2$line = [ 1, 2, 3 ];

このように、extract 関数 は基本的にユーザー入力に対して使うべきではありません。代わりに $_GET などを直接参照します。PHP 7.1 とのことで次のように記述できます。

php

1<?php 2// モードを GET パラメーター 'mode' から読み込む 3// 指定されなかった場合は 0 に設定する 4$mode = $_GET['mode'] ?? 0;

投稿2017/06/17 09:11

chitoku

総合スコア1610

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

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

snowww000

2017/06/17 17:41

ありがとうございます。知らず知らずのうちに危ないことになってしまう所でした。 ご丁寧にありがとうございます! ↓このようになりましたが、なぜか動きません。御教授の程よろしくお願いいたします! ``` <?php $mode = $_GET['mode'] ?? 0; Function Print_Error($errno) { <?php $title = 'エラー'; ?> <!doctype html> <html> <head> <!-- 上で代入した $title 変数を出力する --> <title><?php echo $title ?></title> </head> <body> <!-- echo 短縮構文を使って出力する(同等) --> <h1><?= $title ?></h1> </body> </html> } // 初期化 $file = "form_data.txt"; if(!@file_exists($file)) Print_Error(1); // data.txtからタイトルを持ってくる所 $fp = fopen($file, 'r'); if(!$fp) Print_Error(2); while (($data = fgetcsv($fp, 0, "\t")) !== false) { $line[] = $data; } $line = preg_replace("\n","",$line); $title = explode("\t",$line); fclose($fp); // 値の取得部分 foreach ($title as $val) { $result[] = preg_replace("/[\r\n]/", '', $val); } $numbres[] = array_sum($fp); // data.txtファイルへの書込み部分 $fp = fopen($file,"a"); if(!$fp) Print_Error(3); fputcsv($fp, $numbres, "\t"); fclose($fp); ?> <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP"> <TITLE>登録完了</TITLE> </HEAD> <BODY> <BR> <B>登録完了です。</B> </BODY> </HTML> ```
chitoku

2017/06/18 04:25

コードが何を意味しているか理解してから貼り付けていますか? <?php ?> は PHP の開始〜終了を意味するタグで、すでに function 式が始まっている中で再び <?php と記述することはできません。
snowww000

2017/06/19 06:55

本当に、基本的な事から申し訳ありません。 ちょっと、出直してきます。 あらためて、学びなおしどうしようもなくなったらまたきます。 ありがとうございました。
guest

0

環境

質問をする際には PHP のバージョンを明記するようにしましょう。
PHP はバージョンごとに使用可能な文法に少なからず差異があります。

削除された関数

ereg 関数とその仲間たちは PHP 5.3.0 で非推奨になり、PHP 7.0.0 で削除されています。代わりに preg_match を使いましょう。

エイリアス

join 関数は implode 関数のエイリアスです。好みの問題ではありますが implode を使うのが一般的かと思います。

タブ区切りのデータ

PHP ではタブ区切りのデータを fgetcsv 関数を使用して読み出すことができます。次のように使用します。

php

1$fp = fopen($file, 'r'); 2while (($data = fgetcsv($fp, 0, "\t")) !== false) { 3 $line[] = $data; 4}

書き込むときは fputcsv を使います。

php

1$headers = [ 'no1', 'no2', 'no3', 'no4' ]; 2$numbers = [ 1, 2, 3, 4 ]; 3 4// 番号の合計を最後に追加 5$numbers[] = array_sum($numbers); 6 7$fp = fopen($file, 'a'); 8fputcsv($fp, $headers, "\t"); 9fputcsv($fp, $numbers, "\t"); 10fclose($fp);

配列のループ

PHP で配列を順番に走査するときに for ループ を使うメリットはあまりありません。
foreach を使用して次のように書くのが一般的です。

php

1foreach ($title as $val) { 2 $result[] = preg_replace("/[\r\n]/", '', $val); 3}

投稿2017/06/16 17:33

編集2017/06/17 09:12
chitoku

総合スコア1610

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

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

snowww000

2017/06/17 08:27

ありがとうございます。 ご指摘頂きました部分を変更しました。 しかし、動かなくなってしまいまいした。 """ <SCRIPT LANGUAGE="PHP"> extract($_REQUEST); Function Print_Error($errno) { echo ' <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP"> <TITLE>エラー</TITLE> </HEAD> <BODY> <BR> <B>エラーです。</B> <P>登録できませんでした。(エラー番号:',$errno,')</P><BR> <P>責任者にお問い合せ下さい。</P><BR> </BODY> </HTML> '; exit; } // 初期化 $file = "form_data.txt"; if(!@file_exists($file)) Print_Error(1); // data.txtからタイトルを持ってくる所 $fp = fopen($file, 'r'); if(!$fp) Print_Error(2); while (($data = fgetcsv($fp, 0, "\t")) !== false) { $line[] = $data; } $line = preg_replace("\n","",$line); $title = explode("\t",$line); fclose($fp); // 値の取得部分 foreach ($title as $val) { $result[] = preg_replace("/[\r\n]/", '', $val); } $numbres[] = array_sum($fp); // data.txtファイルへの書込み部分 $fp = fopen($file,"a"); if(!$fp) Print_Error(3); fputcsv($fp, $numbres, "\t"); fclose($fp); </SCRIPT> <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP"> <TITLE>登録完了</TITLE> </HEAD> <BODY> <BR> <B>登録完了です。</B> </BODY> </HTML> """
guest

0

読み込みは file() を使うとお手軽です。
タブ区切りの分割は explode() で、
合計は array_sum() でできます。
計算する前に日付(に相当するエントリー)を unset() しておきましょう。

投稿2017/06/16 16:11

takasima20

総合スコア7458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問