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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Q&A

解決済

2回答

2273閲覧

翻訳してください[fgets]

b1ackc0ffee

総合スコア267

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

0グッド

1クリップ

投稿2015/07/08 08:50

参考書に下記のようなコードがあります。

lang

1<?php 2// 一時ファイルに新しいデータを送り、そのファイルに既にあるデータを追記し、bbs.datにリネーム 3$old_file = fopen('bbs.dat', 'rb'); 4$new_file = fopen('bbs.tmp', 'wb'); 5flock($old_file, LOCK_SH); 6flock($new_file, LOCK_EX); 7fputs($new_file, date('Y年 m月 d日 H:i:s')."\t"); 8fputs($new_file, $_POST['name']."\t"); 9// sleep(5); 存在意義がわからない 10fputs($new_file, $_POST['body']."\n"); 11// fputs→一時ファイルの先頭に新しい情報を書き込み 12// 日時<\t>名前<\t>本文<\n>が横並びになった行が一行ずつ改行され書き込まれていく 13while ($row = fgets($old_file)) { 14 fputs($new_file, $row); 15} 16// while→bbs.datの内容をbbs.tmpに書き込み 古い情報を新しいファイルに追記 17flock($new_file, LOCK_UN); 18flock($old_file, LOCK_UN); 19fclose($new_file); 20fclose($old_file); 21unlink('bbs.dat'); 22rename('bbs.tmp', 'bbs.dat'); 23header('Location: http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/').'/guest_input.php'); 24

whileの部分の処理が頭の中でイメージできないのですが、
初心者にもわかるように処理の流れ、日本語訳を教えていただけないでしょうか。
宜しくお願い致します。

ここの部分です↓
// while→bbs.datの内容をbbs.tmpに書き込み 古い情報を新しいファイルに追記

lang

1while ($row = fgets($old_file)) { 2 fputs($new_file, $row); 3}

------------------------------以上
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

lang

1while ($row = fgets($old_file)) { //1行読み込み 2 fputs($new_file, $row); //1行書き込み 3}

と考えて問題ないかと思います。

投稿2015/07/08 08:52

orange0190

総合スコア1698

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

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

b1ackc0ffee

2015/07/09 01:57

シンプルイズベストな回答有難うございます。 基本的な構文なのに、まだまだ慣れないですね><、 有難うございました★
guest

0

ベストアンサー

lang

1while ($row = fgets($old_file)) { 2 fputs($new_file, $row); 3}

以下の処理を繰り返す
$old_file から1行読み込む
読み込んだ行が false と評価されたら処理を中断する
$new_file に読み込んだ行を書き込む

ただ、これはとても微妙なコードです。
fgets でファイルの終端まで読もうとしていますが、読み込んだ行が false と評価される可能性を考慮していないです。

例えば、空文字とか文字列の 0 とかです。
実際には行の終端に改行がつくので大丈夫かもしれませんが、読む人をとても不安な気持ちにさせるコードです。

どのような参考書をお使いなのかわかりませんが、このような質の低いコードがサンプルとして記載された参考書は参考にしないほうが良いと思います。


質問と直接関係ありませんが。。。

lang

1flock($new_file, LOCK_UN); 2flock($old_file, LOCK_UN); 3fclose($new_file); 4fclose($old_file);

この部分とかとても危険です、flock から fclose までに無防備な時間があります。
LOCK_UN はせずに fclose での(カーネルによる)暗黙のアンロックに任せるか、flock の前に fflush する必要があります。


lang

1$old_file = fopen('bbs.dat', 'rb'); 2$new_file = fopen('bbs.tmp', 'wb'); 3flock($old_file, LOCK_SH); 4flock($new_file, LOCK_EX);

ここも危険な香りがします。

bbs.tmp は新規ファイルだから wb で開いて大丈夫だと思って参考書はそうなっているのでしょうけど、このプロセスが2本同時に実行されたら、1本目のプロセスが作成した bbs.tmp を2本目のプロセスが上書きしてしまう可能性があります。

投稿2015/07/08 09:00

編集2015/07/08 09:14
ngyuki

総合スコア4514

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

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

b1ackc0ffee

2015/07/09 02:24

有難うございます while(条件式){実行処理}という基本がきちんと理解できていなかったようです。 ($old_fileの中の行データを、行がなくなるまで一行ずつ。ついでにこの処理を変数にする。){$old_fileの中の行データを、行がなくなるまで一行ずつ取り出して、$new_fileに入れる} という感じでしょうか。 --- 不安にさせてしまい、すみません><、w 違うところの指摘も有難うございます^^ flock から fclose までに無防備な時間があるんですね!処理の時間など知りませんが、そのあたり、セキュリティ面も考慮できるようになりたいです。 --- プログラミング経験ゼロで初めて使う参考書なんですが、誤植が多くて致命的なミスもあるので、初心者だとそれだけでつまづいてしまうので大変でした。 色々突っ込みどころ満載な本ですが、めげずに頑張ります★
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問