SSブログ

Googleリバース ジオコーディングAPI が日本語にならない [PHP]


 Google Map タイムラインもどきを作成していた時に、Googleのリバース ジオコーディング(住所検索)を使用して緯度・経度から住所をJSONで取得しようとしたときに苦労したので備忘録として記載。

Javascriptでの取得
以下で日本語のJSONデータが返りました。
getJSON(’https://maps.googleapis.com/maps/api/geocode/json?latlng=緯度,経度&key=mykey’)


PHPのでの取得
javascriptと同じurlで要求しfile_get_contents()で取り込んだら英文でJSONデータが返ってきました。
$url ="https://maps.googleapis.com/maps/api/geocode/json?latlng=緯度,経度&key={mykey}";
$json = file_get_contents($url);

ブラウザー上でurl窓に上記urlを入れて送ると、日本語で返ってくるのに。。
そこで言語パラメータが必要と思い、デベロッパー ガイドを読みlanguage=jpを指定したが、返ってくるのは英文のまま。ここで原因が分からず、web検索したがヒットする記事がでない。
$url ="https://maps.googleapis.com/maps/api/geocode/json?latlng=緯度,経度&key={mykey}&language=jp";

もう一度、Googleデベロッパー ガイドを読み直しら、サポートされる言語のリストにサポートされる言語のリストがあり日本語 language=jaとありました。何のことは無いjpとjaの違いでした。以下に変更したら無事日本語で住所が返りました。
$url ="https://maps.googleapis.com/maps/api/geocode/json?latlng=緯度,経度&key={mykey}&language=ja";


nice!(0)  コメント(0) 

PHPで配列をdefineで指定する [PHP]


 PHPで配列を定数にしたい場合があるが、difineで配列を指定することができない仕様になっている。
そこで配列の代わりにCSV形式にしてdefine指定し、使用する際CSVから配列に戻す方法で実装した時のメモ。
//定数宣言
define("JOUSU","定数1,定数2,定数3");

//定数使用側
$jousu = str_getcsv(JOUSU);
// $jousu[0] : 定数1, $jousu[1] : 定数2,  $jousu[2] : 定数3

Pukiwikiで日本語が表示されない [PHP]


 WindowsXP(PHP5.3.2,Pukiwiki1.4.7)のPukiwikiフォルダーを丸ごとWindows10(PHP5)にコピーして、WindowXPと同じPukiwikiを運用しようとしたが、簡単に移行できなく苦労したのでその時の備忘録。
  • コピー後Pukiwikiをブラウザーで表示させると、エラー500を表示し何も表示されない。
  • PHPの設定ファイルphp.iniをerror_perporting = E_ALL & ~E_DEPRECATED & ~E_NOTICEに変更してみたが、エラー500を表示し何も表示されない。
  • pukiwikiのindex.phpでもerror_reporting(0)の記述があったので、PHPの設定と同じに変更。
  • lib/func.phpで組込関数hex2bin()がユーザ関数として再定義されたとのエラー表示。
  • PHP5.4以降のhex2bin()が組込まれている場合、定義しないように変更。
  • function hex2bin($hex_string) {
       省略
    }
    if(! function_exists('hex2bin')) {
      function hex2bin(hex_string) {
        省略
      }
    }
    
  • 今度は日本語が表示されない。PukiwikiのHomePageに"PHPの仕様変更に伴い、PHP5.4 以降で正常にマルチバイト文字を表示できない事がある問題の修正"の記載
  • 読むとPHP5.4の変更で”htmlspecialchars関数の第3引数の変更”が悪さをしているよう。 「htmlspecialchars関数の第3引数には、処理対象文字列の文字エンコーディングを指定します。この指定をしない場合、従来(PHP5.3まで)はISO-8859-1とみなされていたのに対して、PHP5.4ではUTF-8とみなされるようになります。」とのこと。
  • wikiフォルダーの各ページのデータ(xx.txt)がEUC-JPだったので、libフォルダー内のphpファイルでhtmlspecialcharsを使用している箇所全て、第三引数にEUC-JPを指定するように変更
  • htmlspecialchars(xx);
      ↓
    htmlspecialchars(xx,ENT_QUOTES,'EUC-JP');
    

この間約半日費やして漸く正常に表示できるようになった。
本当は、PHP5.4対応のPukiwiki1.5.0に変更すれば問題ないのだが、今回はWindowsXPのPukiwikiと内容の同期したかったの修正で対応した。




西暦和暦変換をDB登録方式に(年号・元号変更時の対応) [PHP]


 未だ和暦で記載が必要な書類が多くあり、WebDBシステムを作成していても和暦西暦変換が必要になってくる。昭和・平成に対応していてもシステムに依っては大正・明治が必要になる場合も出てくる。
せっかくDBを使用しているので和暦の元年の西暦年月日を追加登録するとその和暦に対応できるようにしてみた。

DB登録(tbl_年号)
年号略号日付
昭和S1926-12-25
平成H1989-01-08
大正T1912-07-30


// --------------------------------------------------------------------
//   西暦 -> 和暦変換用の関数
//     引数     $flg 1: 元号アルファベット, 1以外 : 昭和、平成
//                 $dt  年月日(西暦,和暦も可)
//     戻り値: 和暦 元号yy年mm月dd日
// --------------------------------------------------------------------
function to_wareki($dt,$flg) {
   $SV_MySQL=xx;  $USER_MySQL=yy;  $PASS_MYSQL = zz;

   //データベースへの接続
   $link= mysql_connect($SV_MySQL, $USER_MySQL, $PASS_MYSQL) or die('接続に失敗しました。');
   mysql_select_db($DB_Name,$link) or die('データベース選択に失敗しました。');
   mysql_set_charset('utf8');
		
   //年号データ取得
   $sql = "SELECT * FROM tbl_年号 ORDER BY 日付";
   $result = mysql_query($sql, $link) or die('検索に失敗しました。'.mysql_error($link).'
'.$sql); $NENGOU_DT = array(); $NENGOU_DT_AL = array(); $NENGOU_DATE = array(); while($row = mysql_fetch_assoc($result)) { array_push($NENGOU_DT, $row['年号']); array_push($NENGOU_DT_AL, $row['略号']); array_push($NENGOU_DATE, $row['日付']); } $dt = strtolower(mb_convert_kana($dt,"a","UTF-8")); //小文字化 $dt = preg_replace('/\s/', '',$dt); $dt = str_replace("/","-",$dt); if(preg_match("/^[0-9-]+$/", $dt)) { //西暦の時 list($yy, $mm, $dd) = explode("-", $dt); if(strlen($mm)==1) $mm = "0".$mm; if(strlen($dd)==1) $dd = "0".$dd; $ymd = $yy.$mm.$dd; $count_nengou = count($NENGOU_DT); for($i = 0; $i <= $count_nengou - 1; $i++ ) { $nengou_dtt = date("Y-m-d",strtotime($NENGOU_DATE[$i]) - 2); list($nengou_yy, $nengou_mm, $nengou_dd) = explode("-", $nengou_dtt); $nengou_dt = $nengou_yy. $nengou_mm. $nengou_dd; $nengou_dtt = $NENGOU_DATE[$i + 1]; list($nengou_yy_next, $nengou_mm_next, $nengou_dd_next) = explode("-", $nengou_dtt); $nengou_dt_next = $nengou_yy_next. $nengou_mm_next. $nengou_dd_next; if($ymd > $nengou_dt && ($ymd < $nengou_dt_next || $nengou_dt_next == "")) { if($flg <> 1) { $gg = $NENGOU_DT[$i]; } else { $gg = $NENGOU_DT_AL[$i]; } $yy -= $nengou_yy - 1; break; } } $wareki = $gg.$yy."年".$mm."月".$dd."日"; return $wareki; } elseif($flg <> 1) { if(preg_match("/^[a-z]/", $dt)) { $count_nengou = count($NENGOU_DT); for($i = 0; $i < $count_nengou -1; $i++) { if(substr($dt,0,1) == strtolower($NENGOU_DT_AL[$i])) { $gg = $NENGOU_DT[$i]; } } $ymd = substr($dt,1); list($yy, $mm, $dd) = explode("-", $ymd); $wareki = $gg.$yy."年".$mm."月".$dd."日"; return $wareki; } else { return $dt; } } } 和暦 -> 西暦変換用の関数は省略



機種依存文字のダウンロードで文字化け [PHP]


 WebページでDBデータをダウンロードできるようにするため、以下のようなコードで試した。しかし特定の文字が"?"に化けてします。調べてみるとWindows固有の機種依存文字("⑫㈱㈲㎏"等)が"?"に化けてしまう。ネットで調べると文字エンコードを"SJIS"ではなく"SJIS-win"にすると解決できるらしい。早速試すと問題なく表示されるようになった。
"⑫㈱㈲㎏"等の機種依存文字はSJIS-winにあるがSJISには無いため文字化けするらしい。

// テストデータ.txtの作成(PHP 内部エンコードUTF-8)

// 改善前
$file_name = mb_convert_encoding("./tmp/テストデータ.txt","SJIS");
$fp = fopen($file_name,"w");
$dt_str = DBから取り出したデータ;
fwrite($fp,mb_convert_encoding($dt_str,"SJIS"));
fclose($fp);

// 改善後
$file_name = mb_convert_encoding("./tmp/テストデータ.txt","SJIS");
$fp = fopen($file_name,"w");
$dt_str = DBから取り出したデータ;
fwrite($fp,mb_convert_encoding($dt_str,"SJIS-win"));
fclose($fp);



PHPからJavascriptにデータ渡し(Ajaxを使わないで) [PHP]


 会員番号管理WebDBを作成するには会員番号のダブリチェックが必要になる。必要な項目を全て入力し登録ボタンでDB登録に遷移した後にダブリチェックする方法だと、ダブッていた場合に入力画面に戻ったときに入力データを元に処理が必要となる。面倒なので会員番号入力時(番号入力からファーカスが外れたとき)にチェックすることにした。会員番号入力時に画面遷移してPHPからDB問い合わせをする方法が直ぐに思いつくが、画面遷移でチラチラする。Ajaxを使用してDB問い合わせすると簡単に実装できるが、PHP側からJavascriptにデータを渡す方法で実装してみた。

概要
  • PHPにて会員番号入力画面の先頭で会員番号リストを作成
  • Javascriptに会員番号リストを渡す(echoでJavascriptに書き出す)
  • 会員番号入力テキストボックスからフォーカスが外れたとき(onblur)、Javascriptにて入力値と会員番号リストを比較

実際のコード
*** PHP部
//会員リスト作成
$sql = "SELECT 会員番号 FROM tbl_会員マスタ ORDER BY 会員番号";
$result = mysql_query($sql, $link) or die("検索に失敗しました。");
$kaiin_list = array();
while($row = mysql_fetch_assoc($result)) {
	$kaiin_dt .= $row['会員番号'].",";
}
$kaiin_dt = mb_substr($kaiin_dt,0,-1);                               //最後の","削除

*** Javascript部


*** HTML部(会員番号入力部分)
会員番号;



PHPでディレクトリ丸ごとコピーではまる [PHP]



 Windows上のPHPで運用しているサイトをWeb上でバックアップを取る必要でた。PHPでディレクトリ丸ごとコピーをネットで検索すると、簡単に色んなサイトで以下のコードが見つかる。これ幸いと思い何も考えずそのまま使用した。
//PHPの内部エンコードはUTF-8
//------------------------------------------------------------------------------
// ディレクトリ階層以下のコピー
// 引数: コピー元ディレクトリ、コピー先ディレクトリ
// 戻り値: 結果
function dir_copy($dir_name, $new_dir)
{
  if (!is_dir($new_dir)) {
    mkdir($new_dir);
  }
 
  if (is_dir($dir_name)) {
    if ($dh = opendir($dir_name)) {
      while (($file = readdir($dh)) !== false) {
        if ($file == "." || $file == "..") {
          continue;
        }
        if (is_dir($dir_name . "/" . $file)) {
          dir_copy($dir_name . "/" . $file, $new_dir . "/" . $file);
        }
        else {
          copy($dir_name . "/" . $file, $new_dir . "/" . $file);
        }
      }
      closedir($dh);
    }
  }
  return true;
}


 結果をみるとエラーもしていないのに、コピーされるはずの日本語ファイル名の一部がコピーされていない。コードを見直してみるとcopy()の返り値を見ていない。これではcopyが失敗しても判らない。エラー処理を追加して失敗するファイル名を調べると、失敗するのはShift_JISの2バイト目が「5C」(ASCII バックスラッシュ)が含まれているファイル名らしい。
漢字
コード95 5C97 5C94 5C90 5C83 5C8F 5C8D 5C96 5C8C 5C93 5C


 PHPのcopy()関数がShift_JIS文字コードの2バイト名に「5C」を含む場合上手く処理できないので、copy()を使う限りディレクトリ丸ごとコピーが上手くいかない。Shift_JISコードを作った人、もう少し考えて欲しかったなーあ。

そこで、Windows コマンドプロンプトのxcopyコマンドを使用してディレクトリ丸ごとコピー関数を作り目的を達することが出来きました。
function dir_copy($dir_name, $new_dir) {
   $ret = system('xcopy '.$dir_name.' '.$new_dir.' /E /Y /Q /I', $ret);
	return $ret;
}


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。