• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP)

PHP OPENファイル(書き込み)をファンクション化したい

このQ&Aのポイント
  • PHPのファイルをオープンして書き込むための関数を作成したいと思います。
  • POSTメソッドで受け取ったデータを曜日と時間に分けてクーロンファイルに書き込む処理を実装したいです。
  • 曜日と時間の情報をフォームから受け取り、クーロンファイルに設定するための処理を作成します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $option = $_POST['opt']; $selectday = $_POST['day']; $nminute = $_POST['nminute']; $nhour = $_POST['nhour']; // 不正な値が登録されていないかのバリデーションなりサニタイズを行ってください。 // とりあえず英数字とハイフン、アンダーバー以外削除 $option = preg_replace('/^[^a-z0-9_-]+$/i', '', $option); // selectdayは配列でないなら不正なのでとりあえずアプリ落とす if (is_array($selectday)) { exit; } // 渡されてきた値が文字列'0'から'6'の間以外全部削除する $selectday = array_filter($selectday, function ($day) { return in_array($day, ['0', '1', '2', '3', '4', '5', '6'], true); }); if (!is_numeric($nminute) || !is_numeric($nhour)) { // 数値以外が渡されてきているようならアプリを落とす exit; } try { // 書き込み処理 rewrite_cron_for_pbxrestart($option, $selectday, $nminute, $nhour); } catch (Exception $e) { echo $e->getMessage(); exit; } } /** * auto_pbxrestartにcronのスケジュールを書き込む関数 * * @param string $option * @param array $selectday * @param string $nminute * @param string $nhour * @return void */ function rewrite_cron_for_pbxrestart($option, $selectday, $nminute, $nhour) { // 汎用的な関数でもないので定数/グローバル変数などとせずスコープを限定してしまった方が安全 $path = '/etc/cron.d/auto_pbxrestart'; $fp = fopen($path, 'w'); if (!$fp) { throw new Exception("'{$path}' が開けませんでした"); } // ファイルの書き込み前にロックする if (!flock($fp, LOCK_EX)) { throw new Exception("'{$path}' がロックできませんでした"); } // 選択した曜日を結合 $days = implode(',', $selectday); if ($days === '') { $days = '*'; } // 書き込みしたい行を作成 $line = sprintf('%s%s %s * * %s %s %s', $option, $nminute, $nhour, $days, 'root', '/usr/local/sbin/auto_pbxrestart.pl'); // 書き込み if (!fwrite($fp, $line)) { throw new Exception("'{$path}' に書き込みができませんでした"); } fclose($fp); } ?> 回答No.1でもいただいているように、パーミッションの解決とかは適時考える必要があります。 また、システムに影響を与えるスクリプトですから外部からの攻撃が怖いところなので、安全策は慎重に行ってください。

akio123
質問者

お礼

ありがとうございます^^

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • _kappe_
  • ベストアンサー率68% (1566/2285)
回答No.1

質問文とコードを見ても、何をしたいのかがよく分かりません。 ・「OPENファイル(書き込み)をファンクション化したい」とありますが、ファンクション(関数)化したい部分を function 関数名(引数リスト) {  関数の中身 } のように囲えばいいだけです。 関数名はこの場合であれば例えばwrite_to_cron_fileのように、何をする関数なのかが分かりやすいものにします。引数にしたいものがなければ、引数リストは無しでも構いません。 ・$yday3="*";の部分、他の部分でこの変数名は使われていないので$day3の書き間違いと思われます。 ・$fpt = fopen($path, 'w');の部分、'w'モードでファイルの書き込みをする場合、元のファイルの内容は一度全て消えますが、それで意図通りですか。 ・fopenに失敗した場合にもその後のfwrite,fcloseを実行しようとしてしまいます。if ($fpt == false) { 略 }の後ろの部分はelseブロックに入れるべきでしょう。 ・このPHPプログラムはroot権限で実行するつもりなのでしょうか。/etc/cron.d/以下のファイルはroot以外のユーザーは書き換えることができないようになっているのが普通です。

akio123
質問者

お礼

ありがとうございます^^

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • IdeaPad L340-15APIでthunderbolt 3を利用することはできますか?
  • thunderbolt 3を利用する方法を教えてください。
  • Lenovoのノートブックでthunderbolt 3を使用することは可能ですか?
回答を見る

専門家に質問してみよう