fopen/fputs PHPにおけるファイル操作 初心者PHPプログラマの備忘録(1)

| コメント(0) | トラックバック(0)


このエントリーをはてなブックマークに追加
プログラマではないのですが、タイトルにプログラマと入れてしまいました。反省。

今、僕が使っているフリーの掲示板プログラムを例に、PHPに関するファイル操作の基礎を学びます。が、体系的にまとめませんので、あまり参考にならないと思います。あくまで備忘録。

掲示板プログラムの、HTMLを作っているmake_html.phpというファイルで、書き込みをした時に表示される書き込み完了画面のhead内で、スレッドIDが存在している時と、存在していない時で、遷移先URLを、スレッドページと、掲示板トップでだしわけしたい、という処理を追加したかったのですが、感覚的に修正を試みていたのだけど、どうもハマり気味。

ということで、この際ちゃんと勉強してから進めようと思います。ゆえに、関係のない部分のソースから、全部読んでいきたいと思います。とりあえずソースに書いてある部分を理解します。そこに山があるから、みたいな感じ。

本エントリーは連載形式で続けます。とりあえず今自分が使ってるプログラム位ちゃんと理解しておかないと困っちゃうよね、ってことで。
以下、対象ソースの冒頭。掲示板の過去ログHTMLを生成している箇所です。本エントリーでは、この部分について解説します。主にファイル操作(データ挿入)の処理です。外部ファイルで定義されている変数などもあり分かりづらいですが、ご容赦をば。それにしても6年前のプログラムですね……。

<?php
define('VERSION', '2005/04/23');
$fp = @fopen($SUBFILE, "w");
if (!$fp) exit;
fputs($fp, '<html><head><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"><meta http-equiv="pragma" content="no-cache"><meta http-equiv="Cache-Control" content="no-cache"></head><body><font size="2">');
$count = 0;
foreach ($PAGEFILE as $tmp) {
$count++;
$dat = str_replace(".dat", "", $tmp);
fputs($fp, "<a href=\"../test/read.php/$_REQUEST[bbs]/$dat/l50\">$count: $SUBJECT[$tmp]</a><br>\n");
}
fputs($fp, '<div align="right"><a href="./kako/"><b>過去ログ倉庫はこちら</b></a></font>');
fputs($fp, "</body></html>\n");
fclose($fp);


まず、

$fp = @fopen($SUBFILE, "w");

fopenでファイルを開き、取得した値を、変数fpに代入します。

ファイルポインタ = fopen("パスを含めたファイル名", "モード")

$SUBFILEは別のファイルで、特定の過去ログのhtmlが定義されていました。
モードの種類は以下。

r :読み取り専用
r+ :読み取りand書き込み
w :書き込み専用(ファイルが存在しなければ自動生成)
w+ :書き込みand読み込み(ファイルが存在しなければ自動生成)
a :追記専用(ファイルが存在なければ自動生成)
a+ :追記and読み込み(ファイルが存在しなければ自動生成)

それぞれの動きをちゃんと把握してないですが、とりあえず本プログラムでは書き込み専用が指定されているようです。
また、ファイルポインタとは、現在ファイルのどの位置にいるかを示すもののことのようです。ファイルポインタの位置に、プログラムによる文字列の挿入などが行われると言う理解でよいと思います。

if (!$fp) exit;

$fpがない場合は、抜け出します。

fputs($fp, '<html><head><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"><meta http-equiv="pragma" content="no-cache"><meta http-equiv="Cache-Control" content="no-cache"></head><body><font size="2">');

fputsは、ファイルポインタに、文字列を1行書き込むそうです。

fputs(ファイルポインタ, "書き込む文字列"[, 書き込みバイト数]);

書き込みバイト数がないので省略可ということでしょうか? そうなんでしょうね、きっと。省略した場合は、ファイルの頭から挿入するのかな? 多分。基本推測で進めます。$fpに、<html>以下のソースを書き込むだけの処理のようです。


次は以下の部分。

$count = 0;
foreach ($PAGEFILE as $tmp) {
$count++;
$dat = str_replace(".dat", "", $tmp);
fputs($fp, "<a href=\"../test/read.php/$_REQUEST[bbs]/$dat/l50\">$count: $SUBJECT[$tmp]</a><br>\n");
}

一つずつ見て行きましょう。

$count = 0;

countという変数に0をセットします。

foreach ($PAGEFILE as $tmp) {

繰り返し文です。

$PAGEFILEは、別のファイルのコメントにて、

# $PAGEFILE = array('スレッドキー.dat',・・・)

のように定義されていました。そう書いてあるので、ここは何も疑わずにそう受け止めます。各スレッドIDが、.datという拡張子で定義されているファイルのようです。指定された配列 $PAGEFILE に対してループ処理を行います。各ループにおいて、現在の値が、$tmpに代入され、内部の配列ポインタが一つ前に進みます。スレッドIDが $tmpに代入されたようです。

$count++;

$count++で、初期値0のカウントが一つずつ進みます。

$dat = str_replace(".dat", "", $tmp);

$dat変数に、str_replaceした値を代入します。str_replaceの動きは以下。

str_replace (検索文字, 置換後の文字列, 元の文字列)

$tmpのデータから、.datを検索し、拡張子.datを削除してしまうという動きのようです。tmpに「スレッド番号.dat」というデータが入っていたのを、スレッド番号のみにしたのかな? 多分。全部のファイルを見きれてないのでこちらも推測のまま進めます。

fputs($fp, "<a href=\"../test/read.php/$_REQUEST[bbs]/$dat/l50\">$count: $SUBJECT[$tmp]</a><br>\n");

現在のファイルポインタ(上述の<body><font size="2">の後)に続けて、<a href から始まるスレッドのURLを書き込んでいます。

$SUBJECTは、これも同じく別のファイルのコメントにて

# $SUBJECT = array('スレッドキー.dat'=>'タイトル (レスの数)',・・・) 

のように定義されているようでした。

<a href="スレッドのurl">カウント番号:スレッドタイトル(レスの数)[スレッドID]</a>

という表示がループでなされるだけかな? 

fputs($fp, '<div align="right"><a href="./kako/"><b>過去ログ倉庫はこちら</b></a></font>');
fputs($fp, "</body></html>\n");
fclose($fp);

続きのhtmlを挿入して、fcloseで、ファイル操作を終了します。

ということで、make_html.php冒頭の処理まで追いました。単純に過去ログを表示するhtmlを書き出していただけでした。
この後、本htmlを生成するコードに続きます。

やりたいことまで全くたどり着けませんが、記事は、その2に続きます。多分。

参考にしたページなど

同日追記:本エントリーの続きはこちら

トラックバック(0)

トラックバックURL: http://www.enjoy-com.com/mt/mt5/mt-tb.cgi/768

コメントする

        

人気エントリー