PHPを学ぼう!

▼PHPを学ぶチャプターです。


PHPプログラマ 緊急募集!

 

素材メニュー

 ◆Chapter 1

 ◆Chapter 2

 ◆Chapter 3

 ◆Chapter 4

 

制作ヒント

 ◆制作のヒント

 

レッスンメニュー

 ◆Chapter2 練習問題

 ◆Chapter3 DB練習問題

 

サイト運営者がPHPを学んだ
お勧めの書籍です!
これ一冊で基本的なPHPの仕組み、簡単なプログラムの作成、SQLiteを使ったデータベースなどかなり学べる要素が詰まっています!

↓↓↓ ↓↓↓

PHPレッスンブック―PHP5対応

新品価格
¥2,520から
(2013/2/24 04:38時点)

 

 

サイバーテロの技法について書かれた書籍です!
ハッカーの手法を知ることでご自身のサイトがハッカーに攻撃されたときそれを防ぐ手法を紹介しています。

↓↓↓ ↓↓↓

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/11/5 10:09時点)

 

 

★初年度100円! サブドメインやメールアカウントを無制限に設置できます。
PHPやCGIは勿論、WordPress、Movable Type Open Source、掲示板、ブログ、ショッピングサイトなどが簡単に導入できるので複数サイトを運営したい場合に便利なサービスです。

↓↓↓ ↓↓↓

 

PHPが動作するサーバー

 

はじめてのHP | 無料素材 | タグ辞典 | CSSガイドEX | PHPを学ぼう!

◆Chapter 2 - 外部ファイルの読み書き

PHP には外部のファイルを扱うfopen関数があります。

 

Chapter2-6 ファイルの読み込みで紹介した include か require は単純にファイルを読み込むだけのものでしたが、 fopen関数ではファイルの作成、修正、保存ができます。

 

ではページにアクセスされたらカウントするだけの単純プログラムを作りながらファイルの作成、修正、保存の流れを説明します。

 

カウンタープログラムの流れは概ね次の通りとなります。

  • アクセスされたらログファイルを読み込む
  • 読み込んだ値に "1" を足して更新する
  • 更新された値を表示する
  • 更新したファイルを保存する

 

この他、クッキーを使ったアクセス制限や、今日のカウント、昨日のカウントなどの機能を付加すれば立派なカンタープログラムが作れるでしょう。
それについては別の機会に紹介することにします。

 

まずログを残すためのファイルを準備します。
ファイル名は、"log.dat" として中身は空にしておきます。
ファイルの拡張子は、一説には "dat" にしておけば読み書きが早いと聞いたことがありますが、"log.txt" としてもかまいません。

 

ログファイルを読み込むコードは次のとおりです。

1|<?php
2| // ▼ログファイルの指定
3| $file_name = "log.dat";
4|
5| $fp = fopen($file_name, "r") or die('ファイルオープンエラー!');
6|?>

 

コードでは、3行目で読み込むファイルを指定しています。

 

5行目では、fopen関数を使いファイルを読み込もうとしています。
ファイルが存在すれば変数 "$fp" に取り込み、ファイルが存在しなければdie関数を実行し、そのメッセージを返します。

 

fopen関数を使うときにはファイルをどの様に扱うのか動作設定をします。

r

読み込み用(ファイルポインタは先頭)
バイナリデータ読み込む時に用いることが多い。

r+

読み書き用(ファイルポインタは先頭)
前のデータより小さいデータを書きこむ際にはゴミが付く原因になるので注意が必要。

w

書き込み用 / 存在しないときには新規作成(ファイルポインタは先頭)
ファイルを空にするのが特徴ですが、これが原因でデータが飛んだりする。

w+

読み書き用 / 存在しないときには新規作成(ファイルポインタは先頭)

a

書き込み用 / 存在しないときには新規作成(ファイルポインタは終端)
ログなどの1行ずつ足していくタイプのものに重宝。

a+

読み書き用 / 存在しないときには新規作成(ファイルポインタは終端)

x

書き込み用 / 存在しないときには新規作成 / 既存のときは失敗(ファイルポインタは先頭)

x+

書き込み用 / 既存の時には失敗(ファイルポインタは先頭)

t

「\n」を「\win」に変換(Windowsのみ)

b

バイナリーデータとして開く(Windowsのみ)

 

動作設定のモードは次の通りです。

$fp = fopen($file_name, "r"); →読み込みモードで開く
$fp = fopen($file_name, "w"); →上書きモードで開く
$fp = fopen($file_name, "a"); →追記モードで開く
$fp = fopen($file_name, "x"); →新規作成モードで開く

モードは一長一短なのでどのように動作するか確認してから利用しましょう。

 

次にファイルの値に "+1" を追加します。

1|<?php
2| // ▼ログファイルの指定
3| $file_name = "log.dat";
4|
5| $fp = fopen($file_name, "r") or die('ファイルオープンエラー!');
6| $count = fgets($fp)+1;
7|?>

6行目で変数 "$count" に読み込んだ値に +1 を足して代入しています。
fgets関数は、ファイルから1行を取り込む働きをしています。

 

次に新しく更新された値をファイルに保存するコード追加します。

1|<?php
2| // ▼ログファイルの指定
3| $file_name = "log.dat";
4|
5| $fp = fopen($file_name, "a+") or die('ファイルオープンエラー!');
6| $count = fgets($fp)+1;
7|
8| // ▼ログファイルの保存
9| ftruncate($fp, 0);
10| fputs($fp, $count);
11| fclose($fp);
12|?>

5行目の fopen の動作環境を読み込み書き込みのモードに変更する。
9行目の ftruncate では、ファイルの初期化をします。
10行目の fputs では、ファイルを保存しています。
11行目の fclose は、開いているファイルを閉じる処理です。

 

ログの「読み込み」→「更新」→「書き込み」の一連の作業はこれで完了です。

 

ファイルの読み書きをする上で一つ忘れてはいけないことがあります。
それは排他的な考え方です。

 

排他的な考え方とは、今現在あなたがカウンターにアクセスしているときに別の人が同時にアクセスしたとします。
すると同時に同一の値を習得し書き込むことがになりかねません。
要するに誰かが処理をしていたら、その処理が終わるのを待ってから処理する仕組みが必要なのです。

 

次のコードは排他的処理を加えたものです。

1|<?php
2| // ▼ログファイルの指定
3| $file_name = "log.dat";
4|
5| $fp = fopen($file_name, "r") or die('ファイルオープンエラー!');
6| $count = fgets($fp)+1;
7|
8| // ▼フィルをロックする
9| flock($fp, LOCK_EX);
10|
11| // ▼ログファイルの保存
12| ftruncate($fp, 0);
13| fputs($fp, $count);
14|
15| // ▼ロックを解除する
16| flock($fp, LOCK_UN);
17|
18| // ▼ファイルを閉じる
19| fclose($fp);
20|
21| echo "<h1>カウント:$count</h1>"; 22|?>

flockをファイル処理する前後に加えることで排他的処理が実行できます。
flockを使うことで、データ処理のクラッシュや破損を防ぐことができるのです。
このコードのサンプルはこちら。

 

ローカルエリアでは、特に意識しなくともいのですがレンタルサーバーで使うときにはファイルやフォルダの属性を "777"、"755" に設定する必要がある場合があります。
ファイルの動作が上手くいかない時にはモードを変更してみてください。

 

ファイルの読み書きの考え方がある程度ご理解いただけたでしょうか?
ファイルの読み書きは、データベースを使わずテキストベースのログで管理するWebアプリケーションを制作する場合の基本となります。

 

 

練習問題

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ex-mode.net | ツールEX | 素材EX | アフィモール | 初級者向 初めてのホームページ作り | Htmlタグ辞典 | 初めてのプランター菜園 | リンク・ボード
気のみ気のままなブログ | CSSガイドEX | ホビ★コレ | 班長日記!

▲UP

Copyright (C) ex-mode.net 2017. All Rights Reserved.