« IPv6を停止する - Vine Linux 4.1 | トップページ | 楽天商品検索APIサンプルを動かしてみる #2 »

2007-08-02

楽天商品検索APIサンプルを動かしてみる #1

楽天APIの商品検索のPHPサンプル。
楽天ウェブサービスセンターブログ
楽天ウェブサービスセンターブログ
http://plaza.rakuten.co.jp/webservice/2000
UTF-8で保存して、サーバに置けば動くと書かれている。
当然、何もしないで動く環境の人も多いと思います。
その場合には、問題ないのですが、
私の環境では動きませんでした。
多分、mb_internal_encodingの問題だと思います。
うちのサーバはPHP5ですが、これはあまり関係ないようです。
php.iniにはmb_internal_encodingは指定していません。
指定してないので、どうやらEUC-JPで動いている様子。
しかたないので、チョット手を加えて、動くようにしてみました。
Shift_JISを使っている人は、EUC-JPの部分をSJISにしてやってみてください。
ちなみに私は、簡単なCGIをPerlで書いたり、
自宅内サーバで簡単なビデオ管理などのデータベースツールを
PHPで書く程度で、仕事でガリガリ書いている人ではないので、
あまりプロの仕事は望まないでください。ド素人です。
コードの前の数字と:は行数です。無視してください。
さて、まずは、ディベロッパーIDとアフィリエイトIDを入れましょう。
14: $DEVELOPER_ID = "自分のディベロッパーID";

18: $AFFILIATE_ID = "自分のアフィリエイトID";
それぞれのIDはhttp://webservice.rakuten.co.jp/で確認できます。
で、いよいよ文字コードの問題に迫ります。
なぜ、失敗するかと言うと、
リクエストされている文字がUTF-8以外でエンコードされているからです。
ですから、それをUTF-8に変換します。
63: $api_url = sprintf("%s&%s=%s",$api_url, $key, urlencode($_REQUEST[$key]));

67: $api_url = sprintf("%s&%s=%s",$api_url, $key, urlencode($api_params[$key]));
を以下のように修正します。
63: $api_url = sprintf("%s&%s=%s", $api_url, $key, urlencode(mb_convert_encoding($_REQUEST[$key], 'UTF-8', 'EUC-JP')));

67: $api_url = sprintf("%s&%s=%s", $api_url, $key, urlencode(mb_convert_encoding($api_params[$key], 'UTF-8', 'EUC-JP')));
何度もいいますが、
Shift_JISを使う人はEUC-JPの部分をSJISにして下さい。
次に、出力用のHTMLヘッダーの文字コード指定をEUC-JPに修正します。
138: header("Content-type:text/html;charset=UTF-8");

142: <meta http-equiv="content-type" content="text/html; charset=UTF-8">
のUTF-8という部分をEUC-JPに変更します。
138: header("Content-type:text/html;charset=EUC-JP");

142: <meta http-equiv="content-type" content="text/html; charset=EUC-JP">
基本的には、これで動くと思います。
ただ、結果表示が、文字化けします。
これは、楽天APIから返る結果が
UTF-8でエンコーディングされているのに、
EUC-JPで表示しているからです。
それでは、検索結果をUTF-8からEUC-JPに変換します。
最低限やる箇所は以下の二箇所です。
189: <td width="47%" align="left"><a href="<?=$item['AFFILIATEURL']?>" target="_top"><font size="-1"><?=$item['ITEMNAME']?></a></td>

191: <td width="47%" align="left"><a href="<?=$item['SHOPURL']?>" target="_top"><font size="-1"><?=$item['SHOPNAME']?></a></td>
後ろの方の<?=~?>までを修正します。
189: <td width="47%" align="left"><a href="<?=$item['AFFILIATEURL']?>" target="_top"><font size="-1"><?=mb_convert_encoding($item['ITEMNAME'], 'EUC-JP', 'UTF-8')?></a></td>

191: <td width="47%" align="left"><a href="<?=$item['SHOPURL']?>" target="_top"><font size="-1"><?=mb_convert_encoding($item['SHOPNAME'], 'EUC-JP', 'UTF-8')?></a></td>
以上の修正で、いちおう下図のように動きます。
楽天APIサンプル
ブラウザのエンコーディングがEUC-JPになっているのが確認できます。
この他にも、emacsのphp-modeを使うと、
html中のforeach文の辺りで、
変なインデントになるので、
検索結果のテーブルのtrタグの中身は、
外部にテキストファイルとして持っておいて、
file_get_contentsで読み出してから、
#ITEMNAME#をstrtrで$item['ITEMNAME']と置換する
などの処理を連想配列で行ったり、
ページ移動ができるようにしてみたりしました。

|

« IPv6を停止する - Vine Linux 4.1 | トップページ | 楽天商品検索APIサンプルを動かしてみる #2 »

PHP」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 楽天商品検索APIサンプルを動かしてみる #1:

« IPv6を停止する - Vine Linux 4.1 | トップページ | 楽天商品検索APIサンプルを動かしてみる #2 »