目次
サンプル・プログラムの実行例
サンプル・プログラム
| search_hotel.php | サンプル・プログラム本体。 |
| .pahooEnv | クラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。 使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooGeoCode.php | 住所・緯度・経度に関わるクラス pahooGeoCode。 使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooRakuten.php | 楽天ウェブサービスに関わるクラス pahooRakuten。 使い方は「PHPで最寄りのネットができるホテルを検索する」などを参照。include_path が通ったディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 4.0.0 | 2026/07/18 | API移行に対応, PHP4.x/5.x系サポート終了 |
| 3.6.4 | 2025/11/29 | PHP8.5対応:curl_closeを実行しないようにした |
| 3.6.3 | 2025/08/14 | searchVacantHotelsURL() 日本測地系にデグレード |
| 3.6.2 | 2023/07/09 | bug-fix |
| 3.6.1 | 2022/12/13 | PHP8.2対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 6.10.0 | 2026/02/19 | getLocalGovernmentCode, address2LocalGovernmentCode, localGovernmentCode2addresss メソッド追加 |
| 6.9.1 | 2025/11/25 | PHP8.5対応:double→float |
| 6.9.0 | 2025/09/21 | jsPolygon, jsPolygon_Gmap, jsPolygon_Leaflet, loadGeoJSON, getPrefBorderList を追加 |
| 6.8.0 | 2025/08/10 | アクセスキーなどを ".pahooEnd" に分離 |
| 6.7.1 | 2025/07/26 | jsLine_Gmap() - bug-fix |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 2.0.1 | 2025/08/11 | getParam() bug-fix |
| 2.0.0 | 2025/08/11 | pahooLoadEnv() 追加 |
| 1.9.0 | 2025/07/26 | getParam() 引数に$trim追加 |
| 1.8.1 | 2025/03/15 | validRegexPattern() debug |
| 1.8.0 | 2024/11/12 | validRegexPattern() 追加 |
サンプル・プログラムの流れ
準備:PHP の https対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。
準備:pahooGeoCode クラス
pahooGeoCode.php
41: class pahooGeoCode {
42: public $items; // 検索結果格納用
43: public $error; // エラー・フラグ
44: public $errmsg; // エラー・メッセージ
45: public $hits; // 検索ヒット件数
46: public $webapi; // 直前に呼び出したWebAPI URL
47:
48: // 都道府県境界線データ
49: // SimpleMaps.com is a product of Pareto Software, LLC. © 2010-2025
50: // https://simplemaps.com/gis/country/jp
51: // ※各自の環境に合わせて設定すること
52: public $GeoJsonJP = __DIR__ . '/jp.json';
53:
54: // -- 以下のデータは .env ファイルに記述可能
55: // Google Cloud Platform APIキー
56: // https://cloud.google.com/maps-platform/
57: // ※Google Maps APIを利用しないのなら登録不要
58: public $GOOGLE_API_KEY_1 = ''; // HTTPリファラ用
59: public $GOOGLE_API_KEY_2 = ''; // IP制限用
60: public $GOOGLE_MAP_ID = ''; // GoogleMaps ID
61:
62: // Yahoo! JAPAN Webサービス アプリケーションID
63: // https://e.developer.yahoo.co.jp/register
64: // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
65: public $YAHOO_APPLICATION_ID = '';
66:
67: // OSM Nominatim Search API利用時に知らせるメールアドレス
68: // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
69: // ※OSM Nominatim Search APIを利用しないのなら登録不要
70: public $NOMINATIM_EMAIL = '';
71:
72: // IP2Location.io APIキー
73: // https://www.ip2location.io/
74: // ※IP2Location.ioを利用しないのなら登録不要
75: public $IP2LOCATION_API_KEY = '';
地図や住所検索として Google を利用するのであれば Google Cloud Platform APIキー とマップID が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、Yahoo!JAPAN を利用するのであれば Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、IP2Location.ioを利用するのであれば「PHPでIPアドレスやホスト名から住所を求める」を、それぞれ参照されたい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
準備:地図サービス(クラウドサービス)の選択
search_hotel.php
58: // 地図描画サービスの選択
59: // 0:Google
60: // 2:地理院地図・OSM
61: define('MAPSERVICE', 2);
62:
63: // 住所検索サービスの選択
64: // 0:Google
65: // 1:Yahoo!ジオコーダAPI
66: // 11:HeartRails Geo API
67: // 12:OSM Nominatim Search API
68: // 13:国土地理院ジオコーディングAPI
69: define('GEOSERVICE', 11);
70:
71: // 逆ジオコーディングサービスの選択
72: // 0:Google
73: // 1:Yahoo!JAPAN
74: // 11:HeartRails Geo API
75: // 21:簡易ジオコーディングサービス
76: define('REVGEOSERVICE', 11);
住所検索サービスは、Google、HeartRails Geo API、OSM Nominatim Search API から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、Google、Yahoo!JAPAN、HeartRails Geo API、簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
準備:pahooRakuten クラス
pahooRakuten.php
22: // 楽天ウェブサービス・クラス ===============================================
23: class pahooRakuten {
24: public $error; // エラー・フラグ
25: public $errmsg; // エラー・メッセージ
26: public $hits; // 検索ヒット件数
27: public $webapi; // 直前に呼び出したWebAPI URL
28:
29: // 楽天ウェブサービス
30: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#Rakuten 参照
31: public $APPLICATIONID = ''; // アプリケーションID
32: public $ACCESSKEY = ''; // アクセスキー
33: public $AFFILIATEID = ''; // アフィリエイトID
34: public $ALLOWEDWEBSITE = ''; // 許可されたWebサイト
35:
36: /**
37: * コンストラクタ
38: * @param なし
39: * @return なし
40: */
41: function __construct() {
42: if (isset($_ENV['PAHOO_RAKUTEN_APP_ID'])) {
43: $this->APPLICATIONID = $_ENV['PAHOO_RAKUTEN_APP_ID'];
44: }
45: if (isset($_ENV['PAHOO_RAKUTEN_ACCESSKEY'])) {
46: $this->ACCESSKEY = $_ENV['PAHOO_RAKUTEN_ACCESSKEY'];
47: }
48: if (isset($_ENV['PAHOO_RAKUTEN_AFFILIATEID'])) {
49: $this->AFFILIATEID = $_ENV['PAHOO_RAKUTEN_AFFILIATEID'];
50: }
51: if (isset($_ENV['PAHOO_RAKUTEN_ALLOWEDWEBSITE'])) {
52: $this->ALLOWEDWEBSITE = $_ENV['PAHOO_RAKUTEN_ALLOWEDWEBSITE'];
53: }
54:
55: // プロパティを初期化する.
56: $this->error = FALSE;
57: $this->errmsg = '';
58: $this->hits = 0;
59: $this->webapi = '';
60: }
楽天ウェブサービスには、アプリケーションURL、アプリケーションID、アクセスキー、アフィリエイトID が必要で、その入手方法は「楽天ウェブサービス - WebAPIの登録方法」を参照されたい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
「楽天トラベル施設検索API」による施設情報検索
| URL |
|---|
| https://openapi.rakuten.co.jp/engine/api/Travel/SimpleHotelSearch/20260731 |
| フィールド名 | 要否 | 内 容 |
|---|---|---|
| appid | 必須 | 楽天ウェブサービスのアプリケーションID。 |
| format | 任意 | 'xml'または'json' 【デフォルト】json |
| callback | 任意 | JSONPとして出力する際のコールバック関数名 (UTF-8でURLエンコードした文字列) 英数字、「.(ドット)」、「_(アンダーバー)」、「[(中括弧)」、「](中括弧)」のいずれか1文字以上 |
| elements | 任意 | 出力パラメーター指定:カンマ区切りで、必要な出力パラメータを指定した場合、指定された出力パラメータのみを返却する。 【デフォルト】ALL |
| latitude | 必須 | 緯度:日本測地系、単位は秒、ミリ秒は小数点以下2桁以内で指定すること。 例)128216.17 ただし、datumTypeに1を指定した場合は、世界測地系、単位は度で指定すること。 例)35.6065914 |
| longitude | 必須 | 経度。日本測地系、単位は秒、ミリ秒は小数点以下2桁以内で指定すること。 例)503259.29 ただし、datumTypeに1を指定した場合は、世界測地系、単位は度で指定すること。 例)139.7513225 |
| searchRadius | 任意 | 検索半径:緯度経度検索時の検索半径(単位km) 0.1以上、3.0以下 小数点以下は1桁までであること |
| datumType | 任意 | 緯度経度タイプ:入力及び出力パラメータの緯度経度タイプを指定する。 1:世界測地系、単位は度。 2:日本測地系、単位は秒。 【デフォルト】2 |
| squeezeCondition | 任意 | kinen:禁煙ルーム internet:インターネットが出来る部屋 daiyoku:大浴場あり onsen:温泉 |
解説:ホテル検索
pahooRakuten.php
375: var $RakutenHotelItems = array(
376: 'hotelNo', // 施設番号
377: 'hotelName', // 施設名称
378: 'hotelKanaName', // 施設かな名称
379: 'hotelInformationUrl', // 施設情報ページURL
380: 'planListUrl', // 宿泊プラン一覧ページURL
381: 'dpPlanListUrl', // ダイナミックパッケージ宿泊プラン一覧ページURL
382: 'reviewUrl', // お客様の声ページURL
383: 'hotelSpecial', // 施設特色
384: 'roomFacilities', // 部屋設備・備品
385: 'hotelFixture', // 館内設備
386: 'hotelMinCharge', // 最安料金
387: 'checkinTime', // チェックイン時刻 HH:MM
388: 'lastCheckinTime', // 最終チェックイン時刻 HH:MM
389: 'checkoutTime', // チェックアウト時刻 HH:MM
390: 'latitude', // 緯度
391: 'longitude', // 経度
392: 'postalCode', // 郵便番号
393: 'address1', // 住所1
394: 'address2', // 住所2
395: 'telephoneNo', // 施設電話番号
396: 'faxNo', // ファックス番号
397: 'access', // 施設へのアクセス
398: 'parkingInformation', // 駐車場情報
399: 'nearestStation', // 最寄駅名称
400: 'hotelImageUrl', // 施設画像URL
401: 'hotelThumbnailUrl', // 施設画像サムネイルURL
402: 'roomImageUrl', // 部屋画像URL
403: 'roomThumbnailUrl', // 部屋画像サムネイルURL
404: 'hotelMapImageUrl', // 施設提供地図画像URL
405: 'aboutBath', // 風呂について
406: 'availableCrediCard', // 使用可能なカード
407: 'aboutCreditCardNote', // カード利用について
408: 'aboutLeisure', // 周辺のレジャーについて
409: 'note', // 条件・注意事項・備考
410: 'cancelPolicy', // キャンセルポリシー
411: 'hotelInformationUrl', // 施設情報ページURL
412: 'reserveTelephoneNo', // 宿泊予約電話番号
413: 'reviewCount', // 投稿件数
414: 'reviewAverage', // ★の数(総合)
415: 'userReview' // お客さまの声(1件目)
416: );
pahooRakuten.php
428: /**
429: * 楽天トラベル系API を利用してホテルを検索する
430: * @param array $items 情報を格納する配列
431: * @param float $latitude 緯度(世界測地系)
432: * @param float $longitude 経度(世界測地系)
433: * @param int $searchRadius 検索半径,単位km
434: * @param array $squeezeConditions 絞込み条件の配列:省略可能
435: * @param string $checkin チェックイン年月日(YYYY-MM-DD):省略可能
436: * @param string $checkout チェックアウト年月日(YYYY-MM-DD):省略可能
437: * @return ヒットした件数/FALSE:検索に失敗
438: */
439: function searchHotels(&$items, $latitude, $longitude, $searchRadius, $squeezeConditions=array(''), $checkin='', $checkout='') {
440: // 入力パラメータ
441: $params = [
442: 'applicationId' => $this->APPLICATIONID,
443: 'accessKey' => $this->ACCESSKEY,
444: 'affiliateId' => $this->AFFILIATEID,
445: 'format' => 'xml',
446: 'datumType' => 1,
447: 'latitude' => $latitude,
448: 'longitude' => $longitude,
449: 'searchRadius' => $searchRadius,
450: 'squeezeCondition' => implode(',', $squeezeConditions),
451: 'responseType' => 'large',
452: ];
453:
454: // 楽天トラベル空室検索API
455: if (preg_match('/\d{4}\-\d{2}\-\d{2}/i', $checkin) > 0) {
456: // 入力パラメータ
457: $params['checkinDate'] = $checkin;
458: $params['checkoutDate'] = $checkout;
459: $params['searchPattern'] = 0;
460: $url = 'https://openapi.rakuten.co.jp/engine/api/Travel/VacantHotelSearch/20260731?' . http_build_query($params);
461: $this->webapi = $url;
462:
463: // 楽天トラベル施設検索API
464: } else {
465: $url = 'https://openapi.rakuten.co.jp/engine/api/Travel/SimpleHotelSearch/20260731?' . http_build_query($params);
466: $this->webapi = $url;
467: }
468:
469: // cURLを使ったリクエスト
470: try {
471: $ch = curl_init($url);
472: curl_setopt_array($ch, [
473: CURLOPT_CONNECTTIMEOUT => 10,
474: CURLOPT_RETURNTRANSFER => TRUE,
475: CURLOPT_SSL_VERIFYPEER => FALSE, // サーバ証明書検証をスキップ
476: CURLOPT_SSL_VERIFYHOST => FALSE, // 〃
477: CURLOPT_RETURNTRANSFER => TRUE,
478: CURLOPT_HTTPHEADER => [
479: "Referer: {$this->ALLOWEDWEBSITE}",
480: "Origin: {$this->ALLOWEDWEBSITE}",
481: ],
482: ]);
483: $response = curl_exec($ch);
484: if (curl_error($ch) !== '') {
485: $this->error = TRUE;
486: $this->errmsg = curl_error($ch);
487: // throw new Exception($this->errmsg);
488: return FALSE;
489: }
490: $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
491: if ($httpCode !== 200) {
492: $this->error = TRUE;
493: $this->errmsg = "HTTP Code = {$httpCode}";
494: // throw new Exception($this->errmsg);
495: return FALSE;
496: }
497: // PHP8.5:非推奨関数
498: if (PHP_VERSION_ID < 80500) {
499: curl_close($ch);
500: }
501:
502: } catch (Exception $e) {
503: $this->error = TRUE;
504: $this->errmsg = $e->getMessage();
505: // throw new Exception($this->errmsg);
506: return FALSE;
507: }
508:
509: // 応答の解釈
510: try {
511: $xml = simplexml_load_string($response);
512: // レスポンス・チェック
513: if ($xml == '' || $xml == FALSE) {
514: $this->error = TRUE;
515: $this->errmsg = '楽天トラベルAPIの不具合';
516: // throw new Exception($this->errmsg);
517: return FALSE;
518: }
519: if ($xml->pagingInfo->recordCount <= 0) {
520: $this->error = TRUE;
521: $this->errmsg = '検索結果なし';
522: // throw new Exception($this->errmsg);
523: return FALSE;
524: }
525:
526: // 検索結果取りだし
527: $cnt = 1;
528: $hotel = $xml->hotels->hotel;
529: foreach ($hotel as $element) {
530: foreach ($this->RakutenHotelItems as $name) {
531: if (isset($element->hotelBasicInfo->$name)) {
532: $items[$cnt][$name] = (string)$element->hotelBasicInfo->$name;
533: } else if (isset($element->hotelDetailInfo->$name)) {
534: $items[$cnt][$name] = (string)$element->hotelDetailInfo->$name;
535: }
536: }
537: // 部屋設備情報取り出し
538: if (isset($element->hotelFacilitiesInfo->roomFacilities->item)) {
539: $node = $element->hotelFacilitiesInfo->roomFacilities->item;
540: $i = 0;
541: while (isset($node[$i])) {
542: $items[$cnt]['roomFacilities'][$i] = (string)$node[$i];
543: $i++;
544: }
545: }
546: // Googleマップ描画用
547: $items[$cnt]['id'] = $this->num2alpha($cnt);
548: $items[$cnt]['title'] = $items[$cnt]['hotelName'];
549: $items[$cnt]['description'] =<<< EOT
550: <a href="{$items[$cnt]['hotelInformationUrl']}" target="_blank">{$items[$cnt]['hotelName']}</a> ({$items[$cnt]['address1']}{$items[$cnt]['address2']})
551: EOT;
552: $cnt++;
553: }
554:
555: } catch (Exception $e) {
556: $this->error = TRUE;
557: $this->errmsg = $e->getMessage();
558: // throw new Exception($this->errmsg);
559: return FALSE;
560: }
561:
562: $this->hits = $cnt - 1;
563: return $this->hits;
564: }
参考サイト
- 楽天トラベル施設検索API
- PHPで最寄り駅を求める:ぱふぅ家のホームページ
- PHPセキュリティ対策:SSL通信を行う:ぱふぅ家ホームページ

なお、Yahoo! JavaScriptマップは、2020年(令和2年)10月31日をもってサービスを終了しており利用できない。
(2026年7月5日)楽天ウェブサービスAPI移行に対応, PHP4.x/5.x系サポート終了