PHP

PHP で、配列中の重複レコードを削除するには?

PHP には配列中の重複するレコードを削除するための、array_unique という専用の関数がある。

<?php $array = array('a', 'b', 'c', 'x', 'y', 'a', 'z', 'z'); <font color="blue">$array = array_unique($array); foreach ($array as $elment) {
print "$element\n";
} ?>

結果

a b c x y z
続きを読む

PHP で、ファイルを読み込んで処理する方法

PHP で、改行で区切られたファイルを読み込んで、1行ずつ処理するには、file('filename.txt') でファイルを読み込み、foreach で 1行ずつ処理する。

<?php # 読み込むファイル名をここに書く $INPUT_FILE = 'yourfile.txt'; # ファイルをオープンし、$lines に読みこむ。$lines は 「配列」 である。 $lines = file($INPUT_FILE); # 配列 $lines は、 「$lines as $line」 と書くことによって 1行ずつ取り出せる。 foreach $lines as $line { <pre># 1行ずつ表示する print $line; } ?>
続きを読む

PHP が使われている有名なシステム・ソフト

PHP が使われているシステムやソフトは枚挙にいとまがない。ここではその事例を挙げてみよう (随時更新予定、コメントに 「こんなのがあるよ」 といただけると助かります!)。

続きを読む

PHP で、連続カウント防止・カンマ区切り付きカウンタを作成する

PHP で、以下の仕様を満たすカウンタを作成してみる (このサイトで使っています)。

  1. 同一 IP からの連続したアクセスをカウントしない (連続カウント防止)。
  2. カウンタの数字をカンマ (,) で区切って表示する。

連続カウント防止機能は、

if(($ip_check == 1 && $ip != $_SERVER['REMOTE_ADDR']) ...

の部分でチェックしている。$ip には、「直前にアクセスしてきた IP アドレス」が入っている。同じ IP アドレスからアクセスし続ける限りはカウントされない。通常はこれでわりと正確なカウンタとなり得ると思うが、ファイアウォールの内側にいる同一マシンなどで、ファイアウォールのアドレスがアクセスのたびに変わる場合はこの限りではない。また、ケータイからのアクセスなどの場合も毎回アクセス元の IP アドレスがある一定の範囲内で変わるので連続カウント防止にはならないことに注意。

カウンタの数字をカンマ区切りにしているのは以下の 1行である。

$total = number_format($total); // カンマ区切りにする

以下は PHP の全ソース。

<?php // count.php // (c) 2006 twinkle.cc // http://perltips.twinkle.cc/ // updated by yas 2006/01/03 // updated by yas 2003/05/07 // updated by yas 2003/03/05 // オリジナル: http://works.xrea.jp/ // ※このスクリプトと同じディレクトリに「count.dat」という名前のファイルを作成し、置いておくこと。 if(!$file) { $file='count.dat'; } // 設定 ここから ──────────────────────────── $HOME = 'count.datがあるディレクトリのパス'; // ディレクトリ $data = "$HOME/$file"; // カウント記録ファイル $ip_check = 1; // 連続カウント防止(yes=1 no=0) // 設定 ここまで ──────────────────────────── $count = file($data); // ファイルを配列に // データ内の文字列を分解してそれぞれの変数に代入 list($total, $ip)=explode('<>', $count[0]); // カウントアップ処理 if(($ip_check == 1 && $ip != $_SERVER['REMOTE_ADDR']) || $ip_check == 0) { <pre>$total++; $new_data = implode('<>', array($total, $_SERVER['REMOTE_ADDR'])); $fp = fopen($data, 'w'); // 書きモードでオープン flock($fp, LOCK_EX); // ファイルロック fputs($fp, $new_data); // 書き込み flock($fp, LOCK_UN); // ロック解除 fclose($fp); // ファイルを閉じる } $total = number_format($total); // カンマ区切りにする print $total; // カウンタを表示 ?>

このソースを自身の PHP のカウンタを表示したいページを同じディレクトリに置き、同じディレクトリに count.dat という名前のファイルを置く (私のところは「chmod 644 count.dat」で動いているがお使いの環境によってはパーミッションに注意)。

最後に、カウンタを表示したい場所に以下のように書けばよい。

<?php include('count.php'); ?>
続きを読む

PHP で、サイトにアクセスして HTML を取得する方法

PHP の場合は、fopen 関数の引数に URL を指定すればその URL にある HTML をオープンすることができる。後は while でファイルポインタの最後 (EOF: End of File) まで読み出してあげればよい。

<?php // アクセスする URL を指定 $URL = 'http://perltips.twinkle.cc/'; // URL をオープン $fp = fopen($URL, 'r'); // HTML を読み出す while (! feof($fp)) { <pre>print fread($fp, 1024) or die("READ"); } // HTML のクローズ fclose($fp) or die("CLOSE"); ?>
続きを読む

PHP で、アップロードしたファイルを処理する

まず、アップロードする側の HTML は以下のようになる。特に、

<input type="file" name="file" /&gt </code>

の指定が必要となる。ここで input type="file" name="file" となっている name 属性のところに書いてある値 (この場合は file) が、サーバ側で利用される。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- <pre><form enctype="multipart/form-data" action="gmap_excel.php" method="post"> -->
<form enctype="multipart/form-data" action="gmap_excel.cgi" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
  <table width="600">
    <tr><td>Names file:</td><td><input type="file" name="file" /><input type="submit" value="Upload" /></td></tr>
  </table>
</form>

サーバ側の PHP は以下の通り (例として、アップロードするファイルは XML としている)。肝心なのは、以下の3行である。

<?php // ファイルのオープン $fp = fopen($_FILES['file']['tmp_name'], 'r') or die('Cannot open an XML file: ' . $_FILES['file']['tmp_name']); // ファイルを読み込む while ($data = fread($fp, 4096)) { ... } ?> <?php init(); function init() { // XMLパーサー作成 ('UTF-8') $xml_parser = xml_parser_create('UTF-8'); // 大文字変換を行わない xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false); // start および end 要素のハンドラを設定する xml_set_element_handler($xml_parser, 'startElement', 'endElement'); xml_set_character_data_handler($xml_parser, 'characterData'); // ファイルのオープン $fp = fopen($_FILES['file']['tmp_name'], 'r') or die('Cannot open an XML file: ' . $_FILES['file']['tmp_name']); // ファイルを読み込む while ($data = fread($fp, 4096)) { <pre>// XMLパース処理 if (!xml_parse($xml_parser, $data, feof($fp))) { // パースエラー処理 die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } // XMLパーサの開放 xml_parser_free($xml_parser); } ?>
続きを読む
PHP を購読