PHP関連記事 - 連続表示

新規書き込み

※該当の記事タイトル一覧はリンク一覧から参照できます。

PHPでWhois検索

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2010年2月17日
PHPでWhois検索ができるようになりました。ただし、Pearをインストールできる環境に限ります。逆にPearをインストールできる環境であれば本当に簡単です。

KUNISAN.JPサーバーは共有ホスティングサーバーのため、Pearのインストールはできませんが、代わりにネットブックのXAMPP1.7.3で試してみることにしました。コマンドプロンプトでカレントディレクトリを移動して、下記の通りコマンドを打ちます。

C:\xampp\php>pear.bat install Net_Whois

これでPHPにNet_Whoisモジュールがインストールされます。続いて、PHPで下記のようなプログラムを書けば完成です。

require_once 'Net/Whois.php';
$whois = new Net_Whois();
$data = $whois->query('IPアドレスまたはドメイン名');
print $data;

早速これを応用して試験的なサイトを作ってみました。

http://kunisan.jp/whois/

インラインフレームにNet_Whoisモジュールをインストールしたサーバーの応答が表示されます。



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

PEAR―PHPライブラリ
PEAR―PHPライブラリ をAmazon.co.jpでチェック

PHP+MySQLでアクセス解析(アクセス履歴の保存)

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2010年2月12日
先日、ネットブックを自宅サーバー化(FRONTIER FRNU305 + Windows 7 Starter + XAMPP)したものの、どのように使ったらいいかアイデアがありませんでしたが、ふと「アクセス解析プログラムを設置しよう」と思いつきました。

現状のアクセス解析プログラムは、1999年にPerlで自作したものがベースとなっていて、データはテキストファイルとしてサーバー内に保存されています。しかし、データ数が2000~3000件を超えると、単純な並び替え動作でもサーバーエラーが帰ってくることがあり、仕方がないので古いデータを自動的に消去する措置を取っています。ただ、私のホームページの中にも、一日3000件(3000UV)以上アクセスのあるものがあり、そのページについては1日分を下回るデータしか保持出きないという不都合が生じています。このホームページには追加でGoogle Analyticsを利用していますが、外部のサービスだと自作の管理プログラムとの連携が取りづらいこともあり、Google Analyticsは全ホームページへの導入には至っていません。

また、最近ブログパーツなども含めて全体的にアクセス数が増えており、サーバーへの負荷が高まったせいか時折「Server Error」の表示が出てくるようにもなりました。そのため、PerlやPHPで動いている機能の一部を、どこか別のところに移動しないといけないということも思っていました。

このような経緯から、アクセス解析プログラムを自宅サーバーに新設するアイデアに至りました。せっかく自宅でMySQLが使える環境なので、使わない手はありません。現状のアクセス数からデータの大きさを計算したところ、1年間で合計2GB程度でした。ネットブックのHDD空き容量は200GBあるため、古くなったデータを廃棄するような措置を取らなくても、当面は問題ないはずです。

まずは、アクセスデータをMySQLに追加するプログラムを作成してみました。PHPのメインプログラムと、各ページに設置するコードの2本立てになっており、基本はJavaScriptで飛ばされたデータをPHPで受け取るという仕組みになっています。

問題点としては、MySQLの日本語設定がちゃんとなっていないと、phpMyAdminでの表示が文字化けしてしまうことと(PHPでデータを取り出す分には問題ありません)、Yahoo!Searchのクエリーなど、URLエンコード済みの文字列をJavaScriptでURLエンコードしてPHPでデコードすると、アドレス欄に表記されるようなURLエンコードの文字列ではなく日本語が表示されてしまうことがあります。

ただ、どちらもそんなに大きな問題ではないので、すでに一部のページでこのプログラムを稼働させています。データを解析するプログラムはこれから制作にかかりますが、面白そうなものができたらまた公開したいと思います。

※下記プログラムのご利用は自己責任でお願いします。当方はいかなるサポートも行っておりません。

■■ 1.アクセスデータをMySQLに追加 ■■■

<?php
//データベース「DB」のフィールド名一覧(括弧内はデータ型)
//0.NO(INT/auto_increment) 1.TIME(INT) 2.IP(TEXT) 3.USERAGENT(TEXT) 4.ID(TEXT) 5.UV(INT) 6.PV(INT) 7.REFERER(TEXT) 8.PAGEURL(TEXT) 9.EX1(TEXT) 10.EX2(TEXT)

$id = $_GET[ID]; //IDの取得
$referer = rawurldecode($_GET[D1]); //アクセス元取得
$pageurl = rawurldecode($_GET[D2]); //ページURL取得
//$pageurl = str_replace('www.','',$pageurl); //集計時に不具合が出る場合、ページURLのwwwは削除
$ex1 = rawurldecode($_GET[D3]); //付加データ(1)取得
$ex2 = rawurldecode($_GET[D4]); //付加データ(2)取得

//カウンタ設置ページのアドレス(指定ドメイン以外のページにJavaScriptを仕込んでカウンターを誤作動させることの無いようにするため、PHPでも直にページURLを取得する)
$pag_info = $_SERVER['HTTP_REFERER'];
$check = split('/',$pag_info);
$check_domain = str_replace('www.','',$check[2]);

//指定のドメインに設置したカウンターであれば、カウンター動作
if (($check_domain == 'XXXXXXXX.com')||($check_domain == 'XXXXXXXX.jp')) {

$time = time(); //タイムスタンプの取得
$ip = $_SERVER['REMOTE_ADDR']; //クライアントのIPアドレス取得
$useragent = $_SERVER['HTTP_USER_AGENT']; //ユーザーエージェントヘッダーの取得

//データベースと交信
//変数設定
$dbserver = 'localhost';
$dbuser = 'XXXXXXXX';
$dbpassword = 'XXXXXXXX';
$dbname = 'XXXXXXXX';

//MySQLに接続する
$con = mysql_connect($dbserver,$dbuser,$dbpassword);
if ($con) {
//print '接続完了<br>';
} else {
//print '接続失敗<br>';
}

//データベースを選択
$selectdb = mysql_select_db($dbname);
if ($selectdb) {
//print 'データベース選択完了<br>';
} else {
//print 'データベース選択失敗<br>';
}

//UVを抽出
$sql = 'SELECT max(UV) FROM DB WHERE ID = \''.$id.'\'';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//PVの最大値取得
$max_uv = $sd[0];

}

//2時間以内に同じIP、USERAGENT、IDから来たアクセスか確認。
$sql = 'SELECT max(UV), IP, USERAGENT, ID, TIME FROM DB WHERE IP = \''.$ip.'\' AND USERAGENT = \''.$useragent.'\' AND ID = \''.$id.'\' AND TIME > '.($time - 7200).' LIMIT 1';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//UVの現在値取得(データあれば)
$current_uv = $sd[0];

}

//2時間以内に同じアクセスがある場合にはUVを更新せず、ない場合にはUVに1追加する
if ($current_uv > 0) {
$uv = $current_uv;
} else {
$uv = $max_uv + 1;
}

//PVを抽出
$sql = 'SELECT max(PV) FROM DB WHERE ID = \''.$id.'\'';

//DB結果を取得
$data = mysql_query($sql);

//DB結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//PVの最大値取得
$max_pv = $sd[0];

}

//新しいPV
$pv = $max_pv + 1;

//テーブルにレコードを追加する
$sql = 'INSERT INTO DB
(TIME,IP,USERAGENT,ID,UV,PV,REFERER,PAGEURL,EX1,EX2)
VALUES
('.$time.',"'.$ip.'","'.$useragent.'","'.$id.'",'.$uv.','.$pv.',"'.$referer.'","'.$pageurl.'","'.$ex1.'","'.$ex2.'")';
if (mysql_query($sql)) {
//print $sd[1].'レコード追加成功<br>';
} else {
//print 'レコード追加失敗<br>';
}

//mySQLとの接続を解除
mysql_close();

}

?>

■■■■■■■■■■■■■■■■■■■■

■■■ 2.WEBページに追加するコード ■■■

<script type="text/javascript">
<!--//
ID = "TEST" //サイトID
D1 = document.referrer;
D1 = encodeURIComponent(D1);
D2 = location.href;
D2 = encodeURIComponent(D2);
D3 = "";
D3 = encodeURIComponent(D3);
D4 = "";
D4 = encodeURIComponent(D4);
document.write("<img src=\"http://kunisan.ddo.jp/counter/?ID="+ID+"&D1="+D1+"&D2="+D2+"&D3="+D3+"&D4="+D4+"\" width=\"1\" height=\"1\"><br>");
//-->
</script>

■■■■■■■■■■■■■■■■■■■■



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

MySQL全機能バイブル ~現場で役立つAtoZ~
MySQL全機能バイブル ~現場で役立つAtoZ~ をAmazon.co.jpでチェック

PHPでMySQLデータベースの処理

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2009年9月17日
PHPでプログラムを組むようになってからもうすぐ2年になります。プログラミングの基礎に当たる繰り返し、分岐、文字列、配列、ファイル処理、正規表現などの処理は、かなり早い段階から手を付けていました。しかし、あまり自分のプログラムでは使用しないFTP、IMAP関連の機能や、PHP4では利用できなかったsimple_xml関数などについては、少し後になってから使えるようになりました。そして先日、ようやくオブジェクト機能を使った簡単なじゃんけんプログラムを作り、さらに今日はMySQLデータベースを操作するプログラムを作成したことで、PHPの基礎学習は(私の中で)めでたく終了となりました。あとはこれらの技術を組み合わせて、効率良くプログラミングができれば、勉強した甲斐があったというものです。

ちなみに、データベースの操作は非常に奥が深く、とても1日だけで全ての機能を使いきることはできません。ただ、とりあえずPHPで簡単な操作ができる段階まで来れば、あとはSQLの書き方でどうにでもなります。そのSQLですが、Accessでも何でもデータベースを設計したことがある人なら、理解するのはそれほど難しくはないです。残念ながらうちにはWebで公開できるような数千件~数万件のデータはないので、一人で応用的なプログラムを作成するのは今のところちょっとできないです。

さて、今日作成したMySQLデータベースを操作するプログラムですが、せっかくなので公開しておきます。今回のプログラムは2本立てになっています。

1) CSVデータファイル(日付、製品名、売上の3項目のみ)を、データベースにインポート
2) データベースからデータを抽出(SQLで条件設定、並び替え、グループ化、合計値の操作)

PHPを学習されている方は、ご参考にどうぞ。

■■1.データベースの作成とCSVファイルからのデータインポート■■
<?php
//使用言語とエンコードの指定
mb_language("ja");
mb_internal_encoding("SJIS");

//データベース情報
$dbserver = 'localhost';
$dbuser = 'XXXXXXXX';
$dbpassword = 'XXXXXXXX';
$dbname = 'XXXXXXXXdb1';

//MySQLに接続する
$con = mysql_connect($dbserver,$dbuser,$dbpassword);
if ($con) {
print '接続完了<br>';
} else {
print '接続失敗<br>';
}

//データベースを選択
$selectdb = mysql_select_db($dbname);
if ($selectdb) {
print 'データベース選択完了<br>';
} else {
print 'データベース選択失敗<br>';
}

//テーブル作成 (フィールド: data=日付、product=製品名、sales=売上)
$sql = 'CREATE TABLE sales_record (
date date,
product text,
sales int,
) engine=MyISAM;';
if (mysql_query($sql)) {
print 'テーブル作成成功<br>';
} else {
print 'テーブル作成失敗<br>';
}

//CSVファイルを配列として読み込む
$filedata = file("sales_record.csv");

//配列内のデータを行ごとに表示
foreach ($filedata as $data) {
print $data.'<br>';

//データをカンマで分割して配列にする。
$sd = explode(',',$data);

//日本語のデータ(product=製品名)をSJISからUTF-8に変換
$sd[1]= mb_convert_encoding($sd[1], "UTF-8","SJIS");

//テーブルにレコードを追加する
$sql = 'INSERT INTO sales_record
(date,product,sales)
VALUES
("'.$sd[0].'","'.$sd[1].'",'.$sd[2].')';
if (mysql_query($sql)) {
print $sd[1].'レコード追加成功<br>';
} else {
print 'レコード追加失敗<br>';
}

}

//mySQLとの接続を解除
mysql_close();

?>
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

■■■■■■■■2.データベースからデータを抽出■■■■■■■■
<?php
//使用言語とエンコードの指定
mb_language("ja");
mb_internal_encoding("SJIS");

//データベース情報
$dbserver = 'localhost';
$dbuser = 'XXXXXXXX';
$dbpassword = 'XXXXXXXX';
$dbname = 'XXXXXXXXdb1';

//MySQLに接続する
$con = mysql_connect($dbserver,$dbuser,$dbpassword);
if ($con) {
print '接続完了<br>';
} else {
print '接続失敗<br>';
}

//データベースを選択
$selectdb = mysql_select_db($dbname);
if ($selectdb) {
print 'データベース選択完了<br>';
} else {
print 'データベース選択失敗<br>';
}

//データを抽出(1)
//売上が0より大きいものを選択し、売上の大きい順で並べて、テーブル中の全てのフィールドを表示
$sql = 'SELECT * FROM sales_record WHERE sales > 0 ORDER BY sales DESC';

//結果を取得(1)
$data = mysql_query($sql);

if ($data) {
print 'データ抽出成功<br>';

//データ件数を表示
print '抽出したデータ件数:'.mysql_num_rows($data).'件<br>';

//結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//日本語のデータをSJISからUTF-8に変換
$sd[1]= mb_convert_encoding($sd[1], "SJIS","UTF-8");

//データを一列ずつ表示
print $sd[0].','.$sd[1].','.$sd[2].'<br>';
}

} else {

print 'データ抽出失敗<br>';
}

//データを抽出(2)
//製品名でグループ化して、売上の合計値を集計し、その合計値を大きい順に並べて、フィールドとして製品名と合計値の2つを表示する。
$sql = 'SELECT product, Sum(sales) as sales FROM sales_record GROUP BY product ORDER BY sales DESC';

//結果を取得(2)
$data = mysql_query($sql);

if ($data) {
print 'データ抽出成功<br>';

//データ件数を表示
print '抽出したデータ件数:'.mysql_num_rows($data).'件<br>';

//結果セットの表示
while ($sd = mysql_fetch_array ($data)) {

//日本語のデータをSJISからUTF-8に変換
$sd[0]= mb_convert_encoding($sd[0], "SJIS","UTF-8");

//データを一列ずつ表示
print $sd[0].','.$sd[1].'<br>';
}

} else {

print 'データ抽出失敗<br>';
}

//mySQLとの接続を解除
mysql_close();

?>
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

基礎からのMySQL [基礎からのシリーズ] (プログラマの種シリーズ)
基礎からのMySQL をAmazon.co.jpでチェック

PHP:オブジェクト指向的じゃんけんプログラム

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2009年9月7日
「もう少し、PHPの理解を深めよう」ということで、オブジェクト機能とデータベース機能について、勉強を進めてみようと思っています。「分かりやすいPHP解説書を…」と色々と探した結果、「速効!図解プログラミングPHP+MySQL」という本を購入しました。しばらくは、これを読み進めながらプログラムを作成することにします。

まずはオブジェクト機能を利用した簡単なプログラムを作ってみました。その名も「オブジェクト指向的じゃんけんプログラム」です。平たく言えば、ただのじゃんけんです。学習用にプログラムを作成するにしても、例えば「こんにちは」と表示させるだけのようなものでは作っていても面白くないので、「プログラム学習の始まりは、いつもじゃんけんから」という私なりのポリシー(?)で作ってみた次第です。

以下、プログラムです。

■■■オブジェクト指向的じゃんけんプログラム■■■
<?php

//HTML(フォーム)表示部
print '<form action="ob_janken.php" method="get">';
print '<b>オブジェクト指向的じゃんけんプログラム</b><br><br>';
print '
<select name="HAND">
<option value="">(選択してください)</option>
<option value="1">グー</option>
<option value="2">チョキ</option>
<option value="3">パー</option>
</select>
 <input type="submit" value="決定">
<br><br>
';

//「あなたの手」代入
$anata_hand = $_GET[HAND];

//「あなたの手」が決定している場合には一連の処理を実行
if ($anata_hand != '') {

//インスタンスの作成
$newgame = new Ningen();

//「かけごえメソッド」の実行
$newgame->kakegoe();

print '<table border="1"><tr><td>';

print 'あなたの手<br>';

//インスタンスを作成せずに、「じゃんけんの手」メソッドを実行して、あなたの手のテキスト&画像表示
Hyouji::janken_te($anata_hand);

print '</td><td>';

//「じゃんけんメソッド」の実行、$teにコンピュータの手を代入
$te = $newgame->janken();

print '</td></tr></table><br>';

print '<b>判定結果:<font color="red">';

//「じゃんけん判定メソッド」の実行
$newgame->hantei($anata_hand,$te);

print '</font></b>';

}

print '</form>';

//「Ningen(にんげん)」というクラスを宣言
class Ningen {

//じゃんけんのかけごえ
public $message = 'じゃんけんぽん!<br>';

//「かけごえメソッド」の定義
public function kakegoe() {

//$messageを参照して$j_messageに入れる。
$j_message = $this->message;

//じゃんけんのかけごえ表示
print $j_message;

}

//「じゃんけんメソッド」の定義
public function janken() {

//じゃんけんの「手」をランダムに決定。(1=グー,2=チョキ,3=パー)
$c_hand = mt_rand(1,3);

print '私(コンピュータ)の手<br>';

//インスタンスを作成せずに、「じゃんけんの手」メソッドを実行して、コンピュータの手のテキスト&画像表示
Hyouji::janken_te($c_hand);

//戻り値「手」
return $c_hand;

}

//「じゃんけん判定メソッド」の定義 ($te1はあなたの手、$te2は私の手)
public function hantei($te1,$te2) {

//判定用変数
$judge = $te1 - $te2;

//判定用変数の中身がマイナスの場合には、+3する
if ($judge < 0) {
$judge = $judge + 3;
}

//判定結果表示
if ($judge == 0) {
print 'あいこです。';
} elseif ($judge == 1) {
print '私(コンピュータ)の勝ちです。';
} elseif ($judge == 2) {
print 'あなたの勝ちです。';
}

}
}

//「Hyouji(表示)」というクラスを宣言
class Hyouji {

//「じゃんけんの手」メソッドの定義
public function janken_te($hand) {
if ($hand == 1) {
print '<img src="gu.jpg"><br>';
print 'グー<br>';
} elseif ($hand == 2) {
print '<img src="choki.jpg"><br>';
print 'チョキ<br>';
} else {
print '<img src="pa.jpg"><br>';
print 'パー<br>';
}
}
}

?>
■■■■■■■■■■■■■■■■■■■■■■■■■

オブジェクト機能については、まだ深いところまで突っ込んでいませんが、「まあ、こんなものかな」程度の感想です。やはり、チームを組んでプログラムを作成するような場合には何となく便利そうですが、私のように一人だけでもくもくとプログラムを作っているような人には、それほど必要性は高くないような気がします。ただ、プログラムの種類によっては、効率良くプログラムが組めそうな気はしています(具体的なアイデアはありませんが)。

どうでもいい情報ですが、グーの画像は鉄鉱石、ちょきは和鋏、パーは和紙です。すべてWikipediaから拝借しました。



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

速効!図解プログラミングPHP + MySQL―Windows/Linux PHP5対応
速効!図解プログラミングPHP + MySQL―Windows/Linux PHP5対応 をAmazon.co.jpでチェック

PHPでPOST送信

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2009年8月2日
某大手掲示板でイタズラ書き込みがあると、その書き込みをしたユーザーと同じプロバイダーを使っているユーザー全員が書き込みできなくなってしまう、ということがあります。書き込み後に「アクセス規制中です!!」というメッセージが出て、結局書き込みできなかったという経験をした方が少なからずいるのではないでしょうか。しかも、規制は数日続くことが多く、書きたい事があるのに、せっかくのタイミングを逃してしまうことがあります。

これを回避するには「プロキシ」を使う手があります。しかし誰でも使える「公開プロキシ」は、犯罪行為助長の危険性があることなどから、ここを経由しての書き込みはできない掲示板が多いです。もちろん某大手掲示板も例外ではありません。

そこで考えたのが「WEBサーバーをプロキシ代わりにして、メッセージを送信できないか?」ということでした。ホームページのメッセージ送信には、「GET」と「POST」という2種類の方式がありますが、掲示板で使用されているのは主に「POST」の方です。「WEBサーバーからPOST送信できれば、規制から外れて書き込めるようになる」ということで、早速PHPでPOST送信のプログラムを作ってみました。

■■■■■POST送信プログラムサンプル■■■■■
<?php

//ソケット接続
$sock = fsockopen('XXXXXXXX.com', 80, $errno, $errmsg, 30);

//接続可否の判定
if (is_resource($sock)){
print '接続しました。<br>';

//リクエストのデータ部
$v0 = '名前なまお';
$v1 = 'コメントこめんといかんな。';

//リクエストのデータ部(エンコード)
$data = 'name='.urlencode($v0).'comment='.urlencode($v1);

//リクエストを送信
$request = "POST http://XXXXXXXX.com/bbs.cgi HTTP/1.1\r\n"
.'Host: XXXXXXXX.com'."\r\n"
.'Content-Type: application/x-www-form-urlencoded'."\r\n"
.'Referer: http://XXXXXXXX.com/bbs_view.cgi'."\r\n"
."Content-Length: ".strlen($data)."\r\n\r\n"
.$data."\r\n";
fwrite ($sock, $request);

//レスポンスを受信
$res = '';
while (!feof($sock)) {
$d = fgets($sock);
$res .= $d;
}

//レスポンスを表示
print $res;

//ソケット切断
fclose($sock);

} else {

//ソケット接続エラー
print 'エラー'.$errmsg;

}

?>
■■■■■■■■■■■■■■■■■■■■■■■

以上が最低限のPOST送信機能を有したサンプルプログラムです。一応これだけでも動くことは動くのですが、このままでは某大手掲示板へのメッセージ送信はできません。某大手掲示板へのメッセージ送信は、ヘッダーに別途Cookie情報を付け加える必要があります。

まずは、POST送信のヘッダー情報を得るのに、パケットキャプチャ(Wireshark)を利用します。続いて、ヘッダー中のCookie情報にあるホスト名(通常はプロバイダー名になっています)を、WEBサーバーのホスト名に変更します。そして、修正されたヘッダー情報を、丸ごとPHPプログラムに反映させることで、某大手掲示板への書き込みが可能になります。これで「アクセス規制中」でも、WEBサーバー経由で問題がなくメッセージ送信ができるようになります。

ちなみにソケット接続関連のプログラムは、悪用される可能性もあるので、完全な形で公開できないことをお許しください。また完成したプログラムもあることはあるのですが、こちらも個人用として利用するだけで、一般公開はできませんので悪しからず…。



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

入門PHPセキュリティ
入門PHPセキュリティ をAmazon.co.jpでチェック

ValueCommersウェブサービスのPHPサンプルプログラム

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2009年7月24日
ValueCommerceのウェブサービスは、同じアフィリエイト系のウェブサービスであるAmazonの「Product Advertizing API(要署名認証)」に比べてリクエストが容易です。他でのウェブサービスの利用経験があれば比較的簡単にプログラムを組むことができると思います。

先日公開した「KUNISAN.JP海外ツアー情報」のプログラミングも、比較的スムーズに進行しました。しかしその中で2回だけ大きな壁に遭遇しました。
※2009/7/28追記: 「KUNISAN.JP海外ツアー情報」は管理上の理由から、「KUNISAN.JPサービスモール (http://kunisan.jp/service_mall/)」のサービスとして一元化し、もともとあったアドレスからは外しました。

*問題1: リクエストからレスポンスまで30秒~1分かかることがある。
Amazonでも5秒ほどレスポンスが来ないことがあり、それでも多少イライラしていたのですが、「その程度でイライラしていたなんて恥ずかしい」と思えるほどの大きな遅延です。リクエスト→レスポンスの処理を同一プログラム内でやってしまうとページ表示に時間がかかるため、これではこのページを誰も利用しなくなってしまいます。
そのため、今回のプログラムでは基本的にデータをキャッシュから読み込む形にしてみました。これなら遅延時間はほとんどありません。また、キャッシュの生成処理についてもページ表示のものと同一のプログラム内でやると、レスポンス取得に時間がかかる場合にページが表示されない時間が長くなってしまうので、プログラム後半に付けた「imgタグ」で、別のキャッシュ生成用プログラムを踏ませる形の処理をしています。ちなみにリクエストから1分以上かかってレスポンスが来て、挙句の果てに空データということもあります。もちろん、このような場合にはデータをキャッシュしないようにしてあります。

*問題2: レスポンスのXMLデータにコロン「:」付きの要素がある。
以前のAmazonのプログラムでは、作成当時「KUNISAN.JP」サーバーがPHP4のみ対応だったため、XML関連のコマンドが一切使用できず、代わりsplit関数を多用してデータを配列変数に入れ込む形で処理していました。
現在はサーバーがPHP5対応のため、せっかくなので「simplexml」を使ってXMLをオブジェクトに変換する方法に切り替えてみました。しかし、ValueCommerceのデータは要素名にコロンが入っています。困ったことにsimplexmlではコロン付きの要素名を認識してくれません。そのため、オブジェクト変換の前に、要素名のコロンを全てアンダーバー「_」に変換するという処理を取っています。

ということで、実際に使われているプログラムの一部を抜粋して掲載します。ご参考にどうぞ。

■■ValueCommerceウェブサービス用プログラム(サンプル)■■

※本サンプルプログラムの動作保証はしません。
※本サンプルプログラムに関する質問、クレーム等は一切受け付けません。
※本サンプルプログラムのご利用はご自由に行って構いません。ただし、プログラムの2次配布、2次掲載(ホームページ、ブログ、印刷物などへの本サンプルプログラムの転載)はご遠慮ください。
※本ページへのリンクはご自由にどうぞ。


<?php
//※プログラム内のXXXXXXXXXXはユーザー個別の値を設定します。

//使用言語とエンコードの指定
mb_language("ja");
mb_internal_encoding("SJIS");

//検索ワード指定
$word = 'ヘルシンキ';

//検索用ワード指定
$word_search = mb_convert_encoding($word, "UTF-8","SJIS");

//検索用URL指定
addr = 'http://webservice.valuecommerce.ne.jp/productdb/search?
token=XXXXXXXXXX&category=travel&sort_by=price&sort_order=asc&results_per_page=100
&keyword='.$word_search;

//キャッシュ処理
//実行中のスクリプト名を取得、拡張子を除いたファイル名のみ取得
$scrip = $_SERVER['SCRIPT_NAME'];
$scrip = str_replace('/tour/','',$scrip);
$scrip = str_replace('.php','',$scrip);

//キャッシュファイルのパスを生成
$scrip = 'cache/'.$scrip.'.cnt';

//該当キャッシュファイルの更新日時の取得
$stam = filemtime($scrip);

//キャッシュファイルが24時間(1日間)以上前に作られたものであれば新規に読み込み、そうでない場合にはキャッシュから読み込む。
$timnow = time();
if (($timnow - $stam) > 86400) {
$contents = file_get_contents($addr); //データベースから新規読み込み

//XMLデータ長が2200超の場合のみキャッシュに保存(それ以下は空データとみなし、保存しない)
$stlen = strlen($contents);
if ($stlen > 2200) {
//XMLデータをキャッシュに保存
file_put_contents($scrip,$contents);
}

} else {
$contents = file_get_contents($scrip); //キャッシュから読み込み
$cr = 1; //キャッシュから読み込みのフラグ
}

//コロン付きの要素は処理が面倒になるので、アンダーバーに変更
$contents = str_replace('<vc:','<vc_',$contents);
$contents = str_replace('</vc:','</vc_',$contents);

//XMLをオブジェクトに変換
$xml = simplexml_load_string($contents);

//結果数取得(星印の表示、非表示や検索結果が無い場合などに使用する)
$no_results = $xml->channel->vc_resultcount;

//検索結果が見つからない場合(エラー)と見つかった場合(タイトル)
if ($no_results == 0) {
print '<br>'.$word.'の情報は見つかりませんでした。<br><br><br>';
} else {

//繰り返し構文(100件)
for ($item_no = 0; $item_no < 100; $item_no++) {

//XMLからタイトル抽出
$temp[0] = $xml->channel->item[$item_no]->title;

//XMLからリンク抽出
$temp[1] = $xml->channel->item[$item_no]->link;

//XMLから詳細抽出
$temp[2] = $xml->channel->item[$item_no]->description;

//XMLから料金抽出
$temp[3] = $xml->channel->item[$item_no]->vc_price;

//タイトルが取得出来ている場合のみ表示
if ($temp[0] != '') {

//抽出データをUTF-8からSJISに変換
for ($i = 0; $i < 3; $i++) {
$temp[$i] = mb_convert_encoding($temp[$i],"SJIS","UTF-8");
}

//HTML出力
print '<a href="'.$temp[1].'"><strong>'.$temp[0].'</strong><img src="https://ad.jp.ap.valuecommerce.com/servlet/gifbanner?vs=XXXXXXXXXX&vp=XXXXXXXXXX" height="1" width="1" Border="0"></a> ';
print '安い順ランキング: '.($item_no + 1).'位 ';
print '<br>';
print $temp[2].'<br>';
print '<strong>料金:</strong> '.number_format($temp[3]).'円~<br>';
print '<br>';

}

}

}
?>

<?php
//キャッシュ読み込みの場合は、キャッシュ強制更新処理
if ($cr == 1){
print '<img src="launch.php?WORD='.$word.'&SCRIP='.$scrip.'" width="1" height="1"><br>';
}
?>
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■




PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

バリューコマース公認 一歩先行くアフィリエイト成功ガイド Yahoo!オークション&ショッピングも使える! (単行本(ソフトカバー))
バリューコマース公認 一歩先行くアフィリエイト成功ガイド をAmazon.co.jpでチェック


オブジェクト指向の学習

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2009年6月9日
オブジェクト指向の学習PHPのプログラミングスキルを上げる上で、「オブジェクト指向プログラミング」について学んでみようと思い、「オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―」という入門書を購入してみました。別に今持っているPHPの知識でも、自分の作りたいプログラムは書けることは書けます。ただ、「ホームページを作る上で、何か新しいアイデアが浮かぶかも」という期待感と、オブジェクト指向プログラミングのメリットである「部品化」「再利用」などを体験してみたい、ということでの入門書購入です。

「オブジェクト指向プログラミング」というと何だか難しそうですが、本書を読んだところ、とりあえず「サブルーチンをもっと便利にしたようなもの」ということが、何となくわかりました。まあ、これからは実際にサンプルコードなどを打ち込んでみて、動作を確認しながら理解を深められればと思っています。

面白かったのがこの本の最後の方に書いてあった「XP(エクストリーム・プログラミング)」です。今までの主流であった要求定義→設計→プログラミング→テストという、「ウォーターフォール型開発(一方通行型開発)」の流れに変わり、XPは反復的に設計・テスト・フィードバック・変更を繰り返すという方式です。

以前はハードウェアやプログラム修正に莫大がコストがかかったため、設計前の段階で時間をかけて精査することで、プロジェクト全体のコストを抑える意味もありました。しかし、今はハードウェアは安くて高性能になり、プログラム修正もオブジェクト指向プログラミングでより容易になったこと、それにプロジェクトを柔軟に進行させることができるメリットからも、XPの開発プロセスが注目されています。

私が以前参加した某有名ERPの講習会では、「業務フローをできるだけシステムの方に合わせる」「システムのカスタマイズは行わない」という基本思想を教わりましたが、XPはその全く逆の発想です。これからのビジネスは業務フロー自体を大胆に改革する必要も出てくると思うので、「システムが業務改革の足かせになる」という本末転倒にならないようにする意味でも(実際にそういう会社は多そうですが…)、今後のXPの動向には注目したいです。



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識― (単行本(ソフトカバー))
オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識をAmazon.co.jpでチェック

PHPでバッチファイルを自動作成

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2008年5月23日
昨日公開した、『バックアップ用バッチファイル自動作成ツール』のPHPソース(メインの部分のみ)を公開します。バッチファイルに限らず、PHPでテキストファイルを作成することは簡単にできます。使い方によっては、色々なことができそうなのですが、今のところはそんなにネタがないです。HTMLページ自動作成(増殖?)プログラムなんていうのもできそうですが、一歩間違えるとスパム行為になりかねないのでやめておきます。

ではPHPソースをどうぞ。コピーしての使用や改造は構いませんが、動作は全て自己責任でお願いします。

■■バックアップ用バッチファイル自動作成ツール■■
<?php

//フォーム情報取得
$d1 = $_POST[DATA1]; //Windowsの種類
$d2 = $_POST[DATA2]; //外付けドライブ割り当て
$d3 = $_POST[DATA3]; //ユーザー名
$d4 = $_POST[DATA4]; //バックアップの種類

//ユーザー名のエンコード変換(日本語の場合)
$d3 = mb_convert_encoding($d3,"SJIS","UTF-8");

//Windowsの種類による、データフォルダの選択
if ($d1 == 'XP') {
$fold1 = 'Documents and Settings';
} else {
$fold1 = 'Users';
}

//バックアップの種類による、バックアップ用フォルダの削除の有無
if ($d4 == 'kanzen') {
$erac1 = 'RMDIR '.$d2.':\data_backup /S /Q';
} else {
$erac1 = '';
}

//バッチファイルの内容作成
$batch_c = $erac1.'

'.$d2.':
MKDIR '.$d2.':\data_backup\
XCOPY C:\"'.$fold1."\\".$d3.'"\*.* '.$d2.':\data_backup\ /s /h /y /d /c
';

//今現在のタイムスタンプを取得
$timnow = time();

//ファイル名の定義
$b_file = 'backup'.$timnow.'.bat';

//ファイルへの書き込み
$fp = fopen($b_file,'w');
fwrite($fp,$batch_c);
fclose($fp);

//ユーザーエージェント取得
$usera = $_SERVER['HTTP_USER_AGENT'];

//リンク表示のメッセージをブラウザによって変える
$mes ="";
$mes .= (ereg("MSIE",$usera)?'このリンクを右クリックして「対象をファイルに保存」を選択して、バックアップ用バッチファイルをダウンロードしてください。':'');
$mes .= (ereg("Firefox",$usera)?'このリンクを右クリックして「名前を付けてリンク先を保存」を選択して、バックアップ用バッチファイルをダウンロードしてください。':'');
$mes .= (ereg("Safari",$usera)?'このリンクを右クリックして「リンク先のファイルをダウンロード」を選択して、バックアップ用バッチファイルをダウンロードしてください。':'');
if ($mes == "") {
$mes = 'このリンクを右クリックして、対象のファイル(バックアップ用バッチファイル)をダウンロードするようにしてください。';
}

//リンク表示
print '<br><a href="'.$b_file.'">'.$mes.'</a><br><br>';

//ディレクトリハンドルをオープン
$res_dir = opendir( '.' );

//ディレクトリ内のファイル名を1つずつを取得
while( $file_name = readdir( $res_dir ) ){

//batの拡張子の名が入ったファイル名のみを表示
if (eregi('.bat',$file_name)){

//該当キーファイルの作成日時の取得(現在時間-該当ファイル作成日時)
$stam = filectime($file_name);

//作成から600秒以上経過したキーファイルは削除
if (($timnow - $stam) > 600){
unlink($file_name);
}

}
}
//ディレクトリ・ハンドルをクローズ
closedir( $res_dir );

//メッセージ表示
print '
<br>
<b><font color="#ff0000">バックアップ前に設定すること</font></b><br>
<small>コントロールパネルから「フォルダオプション」を開き、「表示」タブを選択します。この中の「すべてのファイルをフォルダを表示する」を選択するようにします。</small><br><br>

<b><font color="#ff0000">バックアップファイルの格納場所</font></b><br>
<small>ダウンロードしたバッチファイルを実行すると、バックアップファイルは全て外付けハードディスクの"data_backup"というフォルダの中に格納されます。</small><br><br>
';

if ($d1 == 'XP') {
print '
<b><font color="#ff0000">各バックアップファイルの場所(WindowsXPの場合)</font></b><br>
<small>・マイ ドキュメント: "'.$d2.':\data_backup\My Documents"</small><br>
<small>・デスクトップ上のファイル: "'.$d2.':\data_backup\デスクトップ"</small><br>
<small>・OutlookExpressのメール: "'.$d2.':\data_backup\Local Settings\Application Data\Identities\{(任意のコード)}\Microsoft\Outlook Express"</small><br>
<small>・OutlookExpressのアドレス帳: "'.$d2.':\data_backup\Application Data\Microsoft\Address Book"</small><br>
<small>・InternetExplorerのお気に入り: "'.$d2.':\data_backup\Favorites"</small><br>
<br>
';
} else {
print '
<b><font color="#ff0000">各バックアップファイルの場所(WindowsVistaの場合)</font></b><br>
<small>・ドキュメント: "'.$d2.':\data_backup\Documents"</small><br>
<small>・ミュージック: "'.$d2.':\data_backup\Music"</small><br>
<small>・ピクチャ: "'.$d2.':\data_backup\Pictures"</small><br>
<small>・ビデオ: "'.$d2.':\data_backup\Videos"</small><br>
<small>・アドレス帳: "'.$d2.':\data_backup\Contacts"</small><br>
<small>・デスクトップ上のファイル: "'.$d2.':\data_backup\Desktop"</small><br>
<small>・Windowsメール: "'.$d2.':\data_backup\AppData\Local\Microsoft\Windows Mail\Local Folders"</small><br>
<small>・InternetExplorerのお気に入り: "'.$d2.':\data_backup\Favorites"</small><br>
<br>
';
}

?>
■■■■■■■■■■■■■■■■■■■■■■■■■



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

[改訂版] PHP ポケットリファレンス (Pocket reference) (単行本)
[改訂版] PHP ポケットリファレンス (Pocket reference) (単行本)をAmazon.co.jpでチェック

PHP簡易英文スペルチェッカー

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2008年2月3日
米国Yahoo!の"Yahoo! Spelling Suggestion API"というサービスを利用して、英文スペルチェッカーを作成してみました。 プログラムもいたってシンプルで、英文をパラメーターとしてサービスを呼び出し、戻ってきた値のXMLタグを全て取り払うだけで、結果を取り出すことができます。

今回はブログパーツとして作成してみましたが、そのコードの一部(メインの部分)を公開します。実行にはYahoo! Developer Network ( http://developer.yahoo.com/ )でアプリケーションIDを取得する必要があるのでご注意ください。

■■簡易英文スペルチェッカー■■
<?php

//英文の取得
$sentence = $_GET[SENTENCE];

//スペースをプラスに変換(アドレス用)
$sentence2 = mb_eregi_replace(' ','+',$sentence);

//英文受け渡し用アドレス(●XXXXXXXXXXにご自分のアプリケーションIDを入れてください)
$addr = 'http://api.search.yahoo.com/WebSearchService/V1/spellingSuggestion
?appid=XXXXXXXXXX&query='.$sentence2;

//自動的に\が入ることがあるので、それを除去する処理
$sentence = stripcslashes($sentence);

//修正英文候補の取得
if ($sentence != "") {
$result = file_get_contents($addr);
//XMLタグの除去
$result = strip_tags($result);
//アンダーバーの除去
$result = mb_eregi_replace('_','',$result);
//改行の除去
$result = mb_eregi_replace("\n",'',$result);
}

//ブラウザー毎の表示領域の設定
$drow = (ereg("Firefox",$_SERVER['HTTP_USER_AGENT'])?"2":"4");
$dcol = (ereg("Firefox",$_SERVER['HTTP_USER_AGENT'])?"14":"18");

print '<b><small>単語または文章</small></b><br>';
print '<textarea rows="'.$drow.'" cols="'.$dcol.'" name="SENTENCE">';
print $sentence;
print '</textarea><br>';
print '<input type="submit" value="スペルチェック"><br>';
print '<img src="blank.gif" height="10"><br>';
print '<b><small>修正候補</small></b><br>';
print '<textarea rows="'.$drow.'" cols="'.$dcol.'" onclick="this.focus(); this.select();">';
if ($result !=""){
print $result;
} elseif ($sentence !="") {
print '(文章のスペルが正しいか、修正候補がありません。)';
}
print '</textarea><br>';

?>
■■■■■■■■■■■■■■■



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

PHP×WebサービスAPIコネクションズ
PHP×WebサービスAPIコネクションズをAmazon.co.jpでチェック


PHPソースプログラム-アマゾンWebサービス(AWS/Amazon Web Service)ショップ

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2008年1月30日
先日公開したPHP4(XML関連の関数が使えない環境)で作ったショッピングサイト「KUNISAN.JPショップ http://kunisan.jp/shop/ 」ですが、とりあえずほぼ完成しました。ただ、試験的に作ったサイトで、あまりお客さんが来るとは思っていません。そこでサービス精神旺盛に、皆さんに PHPプログラムを公開してしまいます。

AWSAccessKeyIdのところにご自分のIDを入れれば、そのまま使えると思います。プログラムをそのままお使いいただいたり改造されることはかまいませんが、プログラムの著作権そのものは放棄しませんので、PHPソースの全体または一部について、ホームページや書籍等での再掲載や、二次的にダウンロードできるような形にはしないようにしてください。

■■KUNISAN.JPショップ(PHP)■■
<html>

<?php
//タイトルの取得
$title = $_GET[TITLE];

//自動的に\が入ることがあるので、それを除去する処理
$title = stripcslashes($title);

//検索ワードの取得
$word = $_GET[WORD];

//自動的に\が入ることがあるので、それを除去する処理
$word = stripcslashes($word);

print '<head>';
if ($title != ""){
print '<title>'.$title.' / KUNISAN.JPショップ</title>';
} elseif ($word != "") {
print '<title>検索結果 - '.$word.' / KUNISAN.JPショップ</title>';
} else {
print '<title>KUNISAN.JPショップ</title>';
}
print '</head>';
print '<meta name="description" content="">';
?>

<meta name="keywords" content="">
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
<body>

<?php

//ページ番号の取得
$page = $_GET[PAGE];
if ($page == ""){
$page = 1;
}

//ノードIDの取得
$node = $_GET[NODE];

//サーチインデックスの取得
$search = $_GET[SEARCH];
if ($search == ""){
$search = 'Blended';
}
$selected[$search] = 'selected';

//商品の説明を出すかの取得
$contents = $_GET[CONTENTS];
$checked[$contents] = 'checked';

?>

<table cellpadding="0" cellspacing="0" border="0"><tr><td width="728">

<h1>
<a href="index.php" style="text-decoration:none">
<font color="888888">大きな画像と文字の<b>KUNISAN.JPショップ[β版]</b></font>

</a>
</h1>

<form action="index.php" method="get" name="form1" target="_top">
<b>サーチ</b>

<?php
print '<select name="SEARCH">';
print '<option value="Books" '.$selected['Books'].'>和書</option>';
print '<option value="ForeignBooks" '.$selected['ForeignBooks'].'>洋書</option>';
print '<option value="Electronics" '.$selected['Electronics'].'>エレクトロニクス</option>';
print '<option value="Kitchen" '.$selected['Kitchen'].'>ホーム&キッチン</option>';
print '<option value="Music" '.$selected['Music'].'>音楽CD</option>';
print '<option value="Classical" '.$selected['Classical'].'>クラシックCD</option>';
print '<option value="DVD" '.$selected['DVD'].'>DVD</option>';
print '<option value="VHS" '.$selected['VHS'].'>VHSビデオ</option>';
print '<option value="Video" '.$selected['Video'].'>ビデオ</option>';
print '<option value="VideoGames" '.$selected['VideoGames'].'>ゲーム</option>';
print '<option value="Software" '.$selected['Software'].'>ソフトウェア</option>';
print '<option value="Toys" '.$selected['Toys'].'>おもちゃ</option>';
print '<option value="HealthPersonalCare" '.$selected['HealthPersonalCare'].'>ヘルス&ビューティ</option>';
print '<option value="SportingGoods" '.$selected['SportingGoods'].'>スポーツ&アウトドア</option>';
print '<option value="Watches" '.$selected['Watches'].'>時計&アクセサリー</option>';
print '<option value="Baby" '.$selected['Baby'].'>ベビー&マタニティ</option>';
print '<option value="Apparel" '.$selected['Apparel'].'>アパレル&シューズ</option>';
print '</select>';
print ' <input type="text" name="WORD" size="40" value="'.$word.'">';
print ' <input type="submit" value="検索"><br>';
?>

</form>
</td></tr></table>
</center>

<center>
<?php

//検索ワードのエンコード変換
$word = mb_convert_encoding($word, "UTF-8","SJIS");

//And条件は" + "で記述すること
//Or条件は" | "で記述すること
$word = mb_eregi_replace(' ','+',$word);
$word = mb_eregi_replace(' ','+',$word);

//商品検索プログラムのアドレス指定(●●AWSAccessKeyIDにご自分のものをお入れください)
$addr = 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&
AWSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&AssociateTag=kj036-22&
Operation=ItemSearch&SearchIndex='.$search.'&
ResponseGroup=Large&Sort=salesrank&Keywords='.$word.'&ItemPage='.$page.'
&BrowseNode='.$node;

//検索ワードのエンコード変換
$word = mb_convert_encoding($word,"SJIS","UTF-8");

//ホームページのHTML取得(1秒1回ルールがあるので、トップページではコールしないようにする)
if (($word != "")&&($search != 'Blended')) {
$xml = file_get_contents($addr);
}

//結果表示のUTF-8エンコードをSJISエンコードに変換する
$xml = mb_convert_encoding($xml, "SJIS", "UTF-8");

//総ページ数の取得
$zd2 = spliti('<TotalPages>',$xml);
$zd3 = spliti('</TotalPages>',$zd2[1]);
$total_pages = $zd3[0];

//各情報の取得
$zd1 = spliti('<Item>',$xml);

//HTML表示
if (($word != "")&&($search != 'Blended')) {

if ($title != "") {
print '<table width="728">';
print '<tr><td colspan="2" height="1" bgcolor="#cccccc"></td></tr>';
print '<tr><td colspan="2" height="4" bgcolor="#ffffff"></td></tr>';
print '<tr><td colspan="2"><b>'.$title.'</b></td></tr>';
print '<tr><td colspan="2" height="3" bgcolor="#ffffff"></td></tr>';
print '<tr><td colspan="2" height="1" bgcolor="#cccccc"></td></tr>';
print '<tr><td colspan="2" height="12" bgcolor="#ffffff"></td></tr>';
print '</table>';
} else {
print '<table width="728">';
print '<tr><td colspan="2" height="1" bgcolor="#cccccc"></td></tr>';
print '<tr><td colspan="2" height="4" bgcolor="#ffffff"></td></tr>';
print '<tr><td colspan="2"><b>検索結果 - '.$word.'</b></td></tr>';
print '<tr><td colspan="2" height="3" bgcolor="#ffffff"></td></tr>';
print '<tr><td colspan="2" height="1" bgcolor="#cccccc"></td></tr>';
print '<tr><td colspan="2" height="12" bgcolor="#ffffff"></td></tr>';
print '</table>';
}

//商品最大10件分表示のため、その分のループ
for ($i = 1; $i <= 10; $i++) {
//ASIN取得
$zd2 = spliti('<ASIN>',$zd1[$i]);
$zd3 = spliti('</ASIN>',$zd2[1]);
$zd_data[$i]["ASIN"] = $zd3[0];
//ページのタイトル取得
$zd2 = spliti('<Title>',$zd1[$i]);
$zd3 = spliti('</Title>',$zd2[1]);
$zd_data[$i]["Title"] = $zd3[0];
//ブランドの取得
$zd2 = spliti('<Brand>',$zd1[$i]);
$zd3 = spliti('</Brand>',$zd2[1]);
$zd_data[$i]["Brand"] = $zd3[0];
//著者の取得
$zd2 = spliti('<Author>',$zd1[$i]);
$zd3 = spliti('</Author>',$zd2[1]);
$zd_data[$i]["Author"] = $zd3[0];
//アーティスト名の取得
$zd2 = spliti('<Artist>',$zd1[$i]);
$zd3 = spliti('</Artist>',$zd2[1]);
$zd_data[$i]["Artist"] = $zd3[0];
//曲目の取得
for ($j = 1; $j <= 10; $j++) {
$zd2 = spliti('<Disc Number="'.$j.'">',$zd1[$i]);
$zd3 = spliti('</Disc>',$zd2[1]);
if ($zd3[0] != "") {
$zd_data[$i]["Music_Contents"] = $zd_data[$i]["Music_Contents"].'<b>ディスク'.$j.'</b><br>';
for ($k = 1; $k <= 32; $k++) {
$zd4 = spliti('<Track Number="'.$k.'">',$zd3[0]);
$zd5 = spliti('</Track>',$zd4[1]);
if ($zd5[0] != "") {
$zd_data[$i]["Music_Contents"] = $zd_data[$i]["Music_Contents"].$k.' '.$zd5[0].'<br>';
}
}
}
}
//詳細ページのURL取得
$zd2 = spliti('<DetailPageURL>',$zd1[$i]);
$zd3 = spliti('</DetailPageURL>',$zd2[1]);
$zd_data[$i]["DetailPageUrl"] = $zd3[0];
//大型画像のアドレス取得
$zd2 = spliti('<LargeImage><URL>',$zd1[$i]);
$zd3 = spliti('</URL>',$zd2[1]);
$zd_data[$i]["LargeImageUrl"] = $zd3[0];

//新品価格取得
$zd4 = spliti('<LowestNewPrice>',$zd1[$i]);
$zd5 = spliti('</LowestNewPrice>',$zd4[1]);
$zd2 = spliti('<FormattedPrice>',$zd5[0]);
$zd3 = spliti('</FormattedPrice>',$zd2[1]);
$zd_data[$i]["Price"] = $zd3[0];
//中古価格取得
$zd4 = spliti('<LowestUsedPrice>',$zd1[$i]);
$zd5 = spliti('</LowestUsedPrice>',$zd4[1]);
$zd2 = spliti('<FormattedPrice>',$zd5[0]);
$zd3 = spliti('</FormattedPrice>',$zd2[1]);
$zd_data[$i]["UsedPrice"] = $zd3[0];
//在庫状況
$zd2 = spliti('<Availability>',$zd1[$i]);
$zd3 = spliti('</Availability>',$zd2[1]);
$zd_data[$i]["Availability"] = $zd3[0];
//説明の取得
//(1つめ)
$zd4 = spliti('<EditorialReview>',$zd1[$i]);
$zd5 = spliti('</EditorialReview>',$zd4[1]);
$zd2 = spliti('<Content>',$zd5[0]);
$zd3 = spliti('</Content>',$zd2[1]);
$zd3[0] = mb_eregi_replace('&lt;','<',$zd3[0]);
$zd3[0] = mb_eregi_replace('&gt;','>',$zd3[0]);
$zd_data[$i]["Content"] = $zd_data[$i]["Content"].$zd3[0];
$zd_data[$i]["Content"] = $zd3[0];
//(2つめ。主にAmazonの商品紹介)
$zd5 = spliti('</EditorialReview>',$zd4[2]);
$zd2 = spliti('<Source>',$zd5[0]);
$zd3 = spliti('</Source>',$zd2[1]);
if ($zd3[0] != "") {
$zd_data[$i]["Content"] = $zd_data[$i]["Content"].'
<b>'.$zd3[0].'</b>';
}
$zd2 = spliti('<Content>',$zd5[0]);
$zd3 = spliti('</Content>',$zd2[1]);
$zd3[0] = mb_eregi_replace('&lt;','<',$zd3[0]);
$zd3[0] = mb_eregi_replace('&gt;','>',$zd3[0]);
if ($zd3[0] != "") {
$zd_data[$i]["Content"] = $zd_data[$i]["Content"].'<br>'.$zd3[0];
}
//発売日の取得
$zd2 = spliti('<ReleaseDate>',$zd1[$i]);
$zd3 = spliti('</ReleaseDate>',$zd2[1]);
$zd_data[$i]["ReleaseDate"] = $zd3[0];
if ($zd_data[$i]["Title"] != "") {
print '<table width="728">';
print '<tr>';
print '<td valign="top">';
print '<a href="'.$zd_data[$i]["DetailPageUrl"].'" target="_blank">';
if ($zd_data[$i]["LargeImageUrl"] != "") {
print '<img src="'.$zd_data[$i]["LargeImageUrl"].'" width="300" border="0">';
} else {
print '<img src="no_image.gif" width="300" border="0">';
}
print '</a>';
print '<br>';
print '<br>';
print '</td>';
print '<td valign="top">';
print '<big>';
print '<b>';
print '<a href="'.$zd_data[$i]["DetailPageUrl"].'" target="_blank">';
print $zd_data[$i]["Title"];
print '</a>';
print '</b>';
print '</big>';
print '<br>';
if ($zd_data[$i]["Brand"] != "") {
print $zd_data[$i]["Brand"];
print '<br>';
}
if ($zd_data[$i]["Author"] != "") {
print $zd_data[$i]["Author"].' (著)';
print '<br>';
}
if ($zd_data[$i]["Artist"] != "") {
print $zd_data[$i]["Artist"];
print '<br>';
}
if ($zd_data[$i]["ReleaseDate"] != "") {
print '<b>発売日</b>: '.$zd_data[$i]["ReleaseDate"];
print '<br>';
}
if ($zd_data[$i]["Music_Contents"] != "") {
print $zd_data[$i]["Music_Contents"];
//print '<br>';
}
if ($zd_data[$i]["Price"] != "") {
print '<b>新品最安値</b>: '.$zd_data[$i]["Price"];
print '<br>';
}
if ($zd_data[$i]["UsedPrice"] != "") {
print '<b>中古品最安値</b>: '.$zd_data[$i]["UsedPrice"];
print '<br>';
}
if ($zd_data[$i]["Availability"] != "") {
print '<b>在庫状況</b>: '.$zd_data[$i]["Availability"];
print '<br>';
}
if ($zd_data[$i]["Content"] != "") {
print '<b>商品の説明</b>:<br>';
print $zd_data[$i]["Content"];
print '<br>';
}
//print $zd_data[$i]["Contents"];
print '・ <a href="cart.php?ASIN='.$zd_data[$i]["ASIN"].'" target="amazon_cart">';
print 'この商品をAmazon.co.jpのカートに入れる';
print '</a>';
print '<br>';
print '・ <a href="'.$zd_data[$i]["DetailPageUrl"].'" target="_blank">';
print 'この商品の詳細をAmazon.co.jpでチェック';
print '</a>';
print '<br>';
print '</td>';
print '</tr>';
print '<tr><td colspan="2" height="12" bgcolor="#ffffff"></td></tr>';
print '<tr><td colspan="2" height="1" bgcolor="#cccccc"></td></tr>';
print '<tr><td colspan="2" height="12" bgcolor="#ffffff"></td></tr>';
print '</table>';
}
}

//ページ受け渡し処理
print '<center>';
print '<table><tr>';
print '<td>';
print 'トータル'.$total_pages.'ページ中の'.$page.'ページ目';
print '</td>';
print '<td width="32"></td>';
print '<td>';
if ($page > 1) {
$prev_page = $page - 1;
print '| <a href="?PAGE='.$prev_page.'&SEARCH='.$search.'&WORD='.$word.'&
CONTENTS='.$contents.'&TITLE='.$title.'&NODE='.$node.'">';
print '前ページを見る';
print '</a> |';
} else {
print '| <font color="#888888">';
print '前ページを見る';
print '</font> |';
}
print '</td>';
print '<td>';
if ($page < $total_pages) {
$next_page = $page + 1;
print ' <a href="?PAGE='.$next_page.'&SEARCH='.$search.'&WORD='.$word.'&
CONTENTS='.$contents.'&TITLE='.$title.'&NODE='.$node.'">';
print '次ページを見る';
print '</a> |';
} else {
print ' <font color="#888888">';
print '次ページを見る';
print '</font> |';
}
print '</td>';
print '</tr></table>';
print '<br>';
print '| <a href="index.php">トップページ</a> |';
print '</center>';
print '<br>';

} else {

}

?>
</center>

<center>Copyright (C) 2008 <a href="http://kunisan.jp/" target="_blank">KUNISAN.JP</a>. All Rights Reserved.</center>

</body>
</html>
■■■■■■■■■■■■■■■

※本プログラムの動作保障は致しかねます。また、プログラムについての質問等は受け付けていません。全て自己責任でお願いします。



PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)

俺流amazonの作り方―Amazon Webサービス最新活用テクニック
俺流amazonの作り方―Amazon Webサービス最新活用テクニックをAmazon.co.jpでチェック


※該当の記事タイトル一覧はリンク一覧から参照できます。