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

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

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

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

Q&A

解決済

2回答

1598閲覧

phpファイル追加について。こんな書き方してますか??

kazoogon

総合スコア281

PHP

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

0グッド

1クリップ

投稿2016/11/11 16:37

編集2016/11/11 17:19
$file = './file.txt'; if ($_SERVER['REQUEST_METHOD'] === 'POST'){ $content = $_POST['content']; if (($fp = fopen($file, 'a')) !== FALSE) { if (fwrite($fp, $content) === FALSE) { print '読み込み失敗!: ' . $file; } fclose($fp); } }

こういう書き方で教わったのですが、いろいろなサイトを見てると

if ($_SERVER['REQUEST_METHOD'] === 'POST')
このコードがなかったり

(($fp = fopen($file, 'a')) !== FALSE)
この書き方をしてない方が多いような気がします。みなさんどうされてるでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

どこまで予期しない処理に対して丁寧に対処するか,というところではないでしょうか?私が書ける限り丁寧に書くとすれば

php

1<?php 2 3// Webブラウザに対し,出力データをHTMLとして解釈させず,ただのテキストとして扱わせる 4// 5// (場合によっては推奨) 6header('Content-Type: text/plain; charset=UTF-8'); 7 8// 他の階層からrequireされてもパスが変化しないように,相対パスではなく,__DIR__を用いた絶対パスで書く 9// 10// (推奨) 11$filename = __DIR__ . '/file.txt'; 12 13// ターミナルから実行した場合には $_SERVER['REQUEST_METHOD'] は未定義で 14// Notice: Undefined index: REUQEST_METHOD のエラーになるので, 15// どちらでも動作するように filter_input 関数で書く 16// 17// (ターミナルから実行することが絶対に無いと言える場合には不要 18// また,次に $_POST['content'] をチェックしており,正常に送信された場合は 19// ここがPOSTであることも確定するので,チェック自体が必ずしも必要ではない) 20if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { 21 22 // データがPOSTで送信されずに直接アクセスされた場合には $_POST['content'] は未定義 23 // データのPOSTはされたが content[] というパラメータに改竄されていた場合は $_POST['content'] は配列 24 // という予期しない形になっているので,それらを filter_input 経由で安全に取得する 25 // 未定義の場合はエラーを出さずに null に変換してくれ,配列の場合は false にしてくれる 26 // 正常に受け取れた場合だけ文字列になる 27 // 28 // (推奨) 29 if (is_string($content = filter_input(INPUT_POST, 'content')) { 30 31 // パーミッションの問題などでエラーになる可能性を考慮する 32 // a だけだとWindowsで \n が \r\n に変換されてしまうため,それを阻止するために b もつける 33 // また, false !== を先頭に持ってくると $fp = に対して括弧をつける必要が無くなる 34 // 35 // (bフラグは推奨,他は任意) 36 if (false !== $fp = fopen($filename, 'ab')) { 37 38 // 同時アクセスでファイルが破損するのを防ぐために,ファイルに対して排他ロックをかける 39 // 40 // (LOCK_NBフラグをつけない限りはほぼ失敗しないのでfalseチェックは実際には不要 41 // ロック処理の実行自体は推奨) 42 if (false !== flock($fp, LOCK_EX)) { 43 44 // (ローカルファイルに対する編集ではほぼ失敗しないのでfalseチェックは実際には不要) 45 if (false !== fwrite($fp, $content)) { 46 echo '書き込み成功'; 47 } 48 49 flock($fp, LOCK_UN); 50 51 } 52 53 fclose($fp); 54 55 } 56 57 } 58 59}

こうなりますね。説明をつけたかったのでわざとらしくifのネストで書きましたが,実際にこんな書き方をする必要は無く,またここまで丁寧にすべて書かなくてもいいです。そうですね,手頃なところだと

php

1<?php 2 3header('Content-Type: text/plain; charset=UTF-8'); 4$filename = __DIR__ . '/file.txt'; 5 6if ($_SERVER['REQUEST_METHOD'] === 'POST') { 7 8 $content = (string)filter_input(INPUT_POST, 'content'); 9 10 $fp = fopen($filename, 'ab'); 11 flock($fp, LOCK_EX); 12 fwrite($fp, $content); 13 echo '書き込み成功'; 14 flock($fp, LOCK_UN); 15 fclose($fp); 16 17}

全然このぐらいでもいいと思いますよ。filter_inputの返り値ですが,falsenullも文字列にキャストすると""になってくれるので,ちょうどいい感じかと思います。またアンロックやクローズ処理に関しては省略しても構いません。変数$fpが消滅するときにPHPが勝手に後始末してくれます。

投稿2016/11/11 19:51

編集2016/11/11 20:01
mpyw

総合スコア5223

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

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

kazoogon

2016/11/12 12:15

細かいところまでありがとうございます!
guest

0

プログラミングは同じことを実現するのに様々な方法や書き方があるので、
それぞれ何の役割を果たしているか理解して、
必要な時に必要な処理を書けば問題ありませんよ。

投稿2016/11/11 17:38

tanat

総合スコア18713

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問