現在リニューアル中 → 旧サイトはこちら

自動バックアップ

1日1ファイルの周期で自動的にバックアップを作成。

ロケールを設定する setlocale(LC_TIME, "ja"); // コピー元ファイル名 $fname = "test.txt"; // バックアップファイル名を取得する $date = strftime("%Y%m%d", time() - 24 * 3600); $fname_bak = $date.".bak"; // バックアップファイルがないときはバックアップファイルを作成する if (!file_exists($fname_bak)) { copy($fname , $fname_bak); }

Excelファイルの表示

CSVファイルは、通常fgetcsvを使って以下のように処理します。

$fname = "test.csv"; $file = fopen($fname, "r"); // 1行ずつ読み込んで出力 while ($array = fgetcsv($file, 1000, ",")) { echo "<hr>"; for ($i = 0; $i < count($array); $i++) { echo $array[$i]."<br>"; } } fclose($file);

Shift_JISのExcelファイルには、各項目が「"」で括られた「,」区切りのものがあります。
そのようなファイルをfgetcsv()で読み込むと、ある種の文字と「"」の組み合わせで区切りが崩れる場合があります。
その場合は、fgets()で読み込み、explode()で各項目に分解する方法があります。 (注)末尾に「5C」を含むShift_JIS文字
十 Ⅸ ソ 表 能 貼 暴 予 禄 圭 構 蚕 噂 欺 など

Excelファイルには、次の特徴があります。
(1)データの中に「,」または「"」が含まれている場合は、データ全体を「"」で囲む。
(2)「"」で括ったデータの中に「"」が含まれている場合は、「""」とする。
正規表現を使った分割を利用すれば、Excelファイルを適切に処理する事が出来ます。

$fname = "test.csv"; $file = fopen($fname, "r"); $expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/"; // 1行ずつ読み込んで出力 while ($data = fgets($file)) { $array = preg_split($expr,$data); echo "<hr>"; for ($i = 0; $i < count($array); $i++) { echo $array[$i]."<br>"; } } fclose($file);

Excelファイルの作成

CSVファイルの内、Excelファイルについては、以下の手順が必要です。
(1)データ内の改行を除く。
(2)データの中に「,」または「"」が含まれている場合は、データ全体を「"」で囲む。
(3)「"」で括ったデータの中に「"」が含まれている場合は、「""」とする。

function writeCSV($array) { //カンマ、引用符のエスケープ for ($i=0; $i<count($array); $i++) { //改行コードの削除 $array[$i] = preg_replace("/\r\n|\r|\n/", "", $array[$i]); if ((strpos($array[$i], ",") !== false) ||( strpos($array[$i], '"') !== false)) { $array[$i] = '"'.str_replace('"', '""', $array[$i]).'"'; } } $data = implode(",", $array) ."\r\n"; //Shift_JISに変換 $data = mb_convert_encoding($data, "SJIS", "EUC-JP"); $fp = fopen("data.csv", "a") or die('File open error'); flock($fp, LOCK_EX); fwrite($fp, $data); flock($fp, LOCK_UN); fclose($fp); }

Shift_JISファイルの文字変換

通常文字コード変換にはmb_convert_encoding()関数を使いますが、Shift_JISコードの中には問題を起こすものがあります。
末尾に「5C」を含むShift_JIS文字で、 例として「十 Ⅸ ソ 表 能 貼 暴 予 禄 圭 構 蚕 噂 欺 」などがあります。
解決法としては、Unixのnkfコマンドを発行することで、ファイルを一括で文字変換を行う方法があります。

nkf [オプション] [変換前ファイル名] > [変換後ファイル名]
・オプション
-j:JIS文字コードを出力
-e:EUC文字コードを出力
-s:SHIFT_JIS文字コードを出力
-w:UTF-8文字コードを出力
-LW:改行コードをCR+LFに変換
-Lm:改行コードをCRに変換
-Lu:改行コードをLFに変換

$tmp_file = tempnam(".","TMP"); system("nkf -wLu sample.txt > {$tmp_file}"); $fl = fopen($tmp_file,"r"); while(!feof($fl)) { echo(fgets($fl)."<br>"); }

以下の例では、Shift_JISのCSVファイルをEUCに変換後処理しています。

$tmp_file = tempnam(".","TMP"); system("nkf -wLu sample.csv > {$tmp_file}"); $fl = fopen($tmp_file,"r"); while($arr = fgetcsv($fl)) { foreach($arr as $data) { echo $data." "; } echo "<br>"; } fclose($fl); unlink($tmp_file);

画像ファイル出力

imgタグで直接ファイルを指定せず、PHPスクリプトから呼び出すようにします。
それによって画像ファイルを格納しているディレクトリ名やファイル名をクライアントから隠すことができ、セキュリティ性が高くなります。

画像の出力方法
(1)getimagesize()関数で画像ファイルの種類を得る。
(2)ヘッダに画像ファイルの種類を指定。
(3)fpassthru()関数ですべてのデータを出力。

画像の指定 <img src="images/sample.gif"> ↓ $myself = basename($_SERVER['PHP_SELF']); $name = "images/sample.gif"; ・・・ <img src="{$myself}?act=put&file={$name}"> 画像の出力 $myself = basename($_SERVER['PHP_SELF']); $name = "images/sample.gif"; ・・・ <img src="{$myself}?act=put&file={$name}"> ・ ・ $act = $_POST['act']; switch ($act) { case 'put': // 画像の種類の定義 $image_type = array("", "image/gif", "image/jpeg", "image/png", "image/swf"); // ファイルサイズの取得 $filename = "images/sample.gif"; $size = getimagesize($filename); // ヘッダの出力 header("Content-type: ".$image_type[$size[2]]); // ファイルの出力 $fp = fopen($filename, "r"); fpassthru($fp); fclose($fp); break;

ファイルのダウンロード

readfile() によるダウンロードの強制。

$file = 'sample.gif'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; }