新しいメモをトップに挿入保存

PHPのシンタックス

  1. HOME
  2. TOPメモ

新しいメモから順に書き出し

ファイルの書き出しは、末尾に追加するオープンモードはあるが既存のデータの先頭に挿入していくオープンモードはありません。
今回は作業用のテキストファイルを作って新しいデータを先に書き出してから古いデータを追加します。その後古いテキストファイルを削除➩作業用に作ったテキストファイルを削除したファイル名にリネームします。

行の範囲を取り出す

$file->current() 現在の行を取り出し
$file->next() 次の行に進める
$file->rewind() 最初の行に巻き戻す
$file->seek($line_pos) 指定した行に移動
$file->eof() TRUEが行末
ファイルオブジェクトから行の範囲を取り出す
$data = new LimitIterator($fileObj, 開始行, 行数);

フォームコード

<form method="POST" action="topWrite.php">
<ul>
  <li><label>memo:<input name="memo" class="memofield" placeholder="メモを書く"></label></li>
  <li><input type="submit" value="送信する"></li>
</ul>
</form>

書き込みページのソースコード

<?php
if (empty($_POST["memo"])) {
  //POSTされた値がないとき入力ページへリダイレクト
  $url = "https://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
  header("HTTP/1.1 303 See Other");
  header("Location:" . $url . "/topMemo.php");
  exit();
}

date_default_timezone_set('Asia/Tokyo');
$memo = $_POST["memo"];
$date = date("Y/n/j G:i:s", time());
$newdata = $date . "  " . $memo;
try {
  $workingfileObj = new SplFileObject("../data/working.tmp", "wb");
  //メモをワークファイルへ
  $workingfileObj->flock(LOCK_EX);
  $workingfileObj->fwrite($newdata);
  $workingfileObj->flock(LOCK_UN);
} catch (Exception $e) {
  echo '<span class="error">エラーがありました</span><br>';
  echo $e->getMessage();
  exit();
}

//元ファイル
$filename = "../data/topMemo.txt";
if (file_exists($filename)) { //元ファイルがあるか確認
  $fileObj = new SplFileObject($filename, "rb");
  //元データ読み込み
  $fileObj->flock(LOCK_SH);
  $olddata = $fileObj->fread($fileObj->getSize());
  $fileObj->flock(LOCK_UN);

  //古いデータを作業ファイルに追記
  $olddata = "\n" . $olddata;
  $workingfileObj->flock(LOCK_EX);
  $workingfileObj->fwrite($olddata);
  $workingfileObj->fwrite(LOCK_UN);

  $fileObj = NUll; //元ファイル閉じる
  unlink($filename); //元ファイル削除
}

$workingfileObj = NULL; //作業ファイルクローズ
rename("../data/working.tmp", $filename); //作業ファイルをリネーム

//メモを読むページへリダイレクト
$url = "https://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
header("HTTP/1.1 303 See Other");
header("Location:" . $url . "/topRead.php");
exit();

読み込みページのソースコード

<?php
require_once("es.php"); //フォーム~入力データのチェック~で参照してね
?>

<!doctype html>
<html lang="ja">
....↓
....↓

<?php
$filename = "../data/topMemo.txt";
try {
  $fileObj = new SplFileObject($filename, "rb");
} catch (Exception $e) {
  echo '<span class="error">エラーがありました</span>';
  echo $e->getMessage();
  exit();
}

$fileObj->flock(LOCK_SH);
//先頭から10行取り出し
$data = new LimitIterator($fileObj, 0, 10);
foreach ($data as $key => $value) {
  //01~10,ストリング,改行
  echo sprintf("%02d: %s\n", $key + 1, es($value)), "<br>";
}
$fileObj->flock(LOCK_UN);

echo "<HR>", '<a href="topMemo.php">メモ入力ページへ</a>';
?>