ポンクソフト

テキストエディタの作成 - PHPでファイルの読み書き・掲示板

前ページ PHPでファイルの読み書き・掲示板 TOP 次ページ

目次

  1. PHPでファイルの読み書き・掲示板
  2. ファイルの読み込み
  3. ファイルの書き込み
  4. ファイルの読み書き(ゲストブック)
  5. 設定ファイルの読み書き
  6. CSVファイルの読み込み
  7. テキストエディタの作成
  8. アンケートシステムの作成
  9. 掲示板1(シンプル)

テキストエディタの作成

ファイルの読み書きの応用として、PHPで動くテキストエディタを作成しましょう。
普通のテキストエディタと違い、Webサーバ上で作成してWebサーバ上に保存するので、どこでもファイルを編集できるという利点があります。

編集テキストの作成

今回はセキュリティの観点から、ファイルの新規作成はできないようにします。予め編集したいテキストファイルをいくつか用意してサーバにアップしておいてください。ファイルを属性変更して「その他」に書込許可属性を与えることを忘れずに。

プログラムの作成

以下のソースを入力してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>テキストエディタ</title>
</head>
<body>
<form method="post" action="texteditor.php">
注意:タグを含んだ文書を保存しないでください。
<table>
<tr>
<td>
<select name="file" size="20">
<?php
// ファイル一覧を表示
$dir = opendir("./");
while($file = readdir($dir)) {
  if(is_file("./$file")) {
    print "<option>$file</option>\n";
  }
}
closedir($dir);
?>
</select>
</td>
<td>
<textarea name="contents" cols="60" rows="20">
<?php
// ファイル内容を表示
$file = $_POST['file'];
if ($_POST['open'] && $file) {
  $text = file_get_contents($file);
  $text = htmlspecialchars($text);
  print $text;
}
?>
</textarea>
</td>
</tr>
<tr>
<td align="right">
<input type="submit" name="open" value="開く">
</td>
<td align="right">
<input type="submit" name="save" value="保存">
</td>
</tr>
</table>
<input type="hidden" name="editfile" value="<?php print $file ?>">
</form>
<?php
// ファイルを保存
$editfile = $_POST['editfile'];
if ($_POST['save'] && $editfile) {
  $fp = @fopen($editfile, 'w');
  if (!$fp) print "このファイルには書き込みできません。<br>\n";
  else {
    $contents = htmlspecialchars($_POST['contents']);
    fwrite($fp, $contents);
    fclose($fp);
    print "書き込み完了しました。<br>\n";
  }
}
?>
</body>
</html>
入力が終わったら「texteditor.php」というファイル名で保存し、サーバにアップして実行してみてください。

ソースの解説

注意:タグを含んだ文書を保存しないでください。
タグを含んだ文書を保存できるようにすると、攻撃コードを含んだhtmlファイルを作成される恐れがあるので、タグは全てhtmlspecialchar関数によって実体参照(「<」→「&lt;」のような)に変換するようにしています。
<select name="file" size="20">
今回、画面左側にファイル一覧を表示していますが、それを出しているのがこの選択メニューです。選択メニューは以下のような形式を持ちます。
<select name=名前 size=行数>
<option value=値1>名称1</option>
<option value=値2>名称2</option>
<option value=値3>名称3</option>
・・・
</select>
selectタグのname属性は選択メニューの名前、sizeは行数です。sizeを省略するとプルダウンメニューになります。optionタグは選択する項目の数だけ書きます。value属性はsubmitされたときに渡される値、名称は実際にメニューに表示される名称です。value属性を省略すると名称がそのまま渡されます。
$dir = opendir("./");
opendir関数はディレクトリハンドルをオープンする関数です。ディレクトリハンドルとは、ファイルにおけるファイルハンドルのディレクトリ版みたいなものです。fopenと同じような感じで使用します。今回はカレントディレクトリのディレクトリハンドルを取得して、$dir に格納しています。
while($file = readdir($dir)) {
readdir関数はディレクトリハンドルからファイル名を取得する関数です。この関数を連続で呼ぶことによって、そのディレクトリに入っているファイル名を全て取得することができます。全てのファイル名を返し終えたらfalseが戻り値となり、今回の場合はwhileループを抜けます。
if(is_file("./$file")) {
is_file関数は引数がファイルの場合trueを返す関数です。readdirでファイル名を取得した場合、カレントディレクトリを表わす「.」や親ディレクトリを表わす「..」も取得されるので、ファイル以外は表示しないという処理をここで行なっているのです。
print "<option>$file</option>\n";
ディレクトリの中のファイルの数だけ、optionタグによって選択メニューに追加しています。
closedir($dir);
fopenにおけるfcloseのように、opendir関数でオープンしたディレクトリは、必ずclosedir関数でクローズしなければなりません。
<textarea name="contents" cols="60" rows="20">
複数行入力フィールドを表示しています。行数を20にして選択メニューと幅を揃えています。<textarea>から</textarea>の間に文章を書くことによってその文章が予めテキストエリアに入ります。
$file = $_POST['file'];
if ($_POST['open'] && $file) {
$fileには選択メニューで選択したファイル名が入ります。開くボタンを押して、かつファイルを選択しているときだけ、テキストエリアにファイルの内容を格納するようにしています。
$text = file_get_contents($file);
file_get_contents関数によってファイルの内容が全て $text に格納されます。
$text = htmlspecialchars($text);
ファイルにタグを含んでいる場合、それをそのまま表示するといろいろと問題があるのでタグを無効にしています。
<input type="hidden" name="editfile" value="<?php print $file ?>">
ファイルを保存するときに編集中のファイル名が必要なので、ファイルが読み込まれたときにhidden項目にファイル名を格納するようにしています。
$editfile = $_POST['editfile'];
hidden項目に格納された編集ファイル名をここで取り出しています。
if ($_POST['save'] && $editfile) {
保存ボタンを押して、かつhidden項目に編集ファイル名が格納されているときだけ、ファイル保存処理を行ないます。
$fp = @fopen($editfile, 'w');
編集ファイルを書き込み専用でオープンします。関数の頭に着いている「@」は、エラーメッセージを出さないようにするものです。
if (!$fp) print "このファイルには書き込みできません。<br>\n";
編集ファイルを書き込み専用でオープンできなかったとき、エラーメッセージを表示しています。ファイルに書き込み許可属性が付いていないなどの場合、このエラーメッセージが表示されます。
$contents = htmlspecialchars($_POST['contents']);
編集内容のタグを無効化して $contents に格納しています。
fwrite($fp, $contents);
fwriteは指定されたファイルハンドルにデータを書き込む関数です。fputsと全く動作をします。私は、fputsは一行出力、fwriteはその他の出力、とC言語と同じような使い分けをしています。
前ページ PHPでファイルの読み書き・掲示板 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0