PHP雑記帳 ITかあさん

ITかあさん

phppgadminのdumpが動かないとき

PostgresqlのPHPベースのGUI管理ツール phppgadminですが、バックアップを実行しても空のファイルが生成されたりと、どう~してもDBのバックアップを取ることが出来ませんでした。

結論:pg_dumpの場所を確認する

この手のエラーはpg_dumpのパスがphppgadminに記載されているものとで相違があるから発生するケースがほとんどなのだそうです。

参考

phpPgAdminでエクスポートをする方法 WEBサイト+phpリファレンスより

デフォルトでは
正しくエクスポート出来ない場合、
conf/config.inc.php のpg_dumpのパス設定を直すとエクスポートできます。
デフォルトでは
$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’] = ‘/usr/bin/pg_dumpall’;
となっているので
$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/local/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’] = ‘/usr/local/bin/pg_dumpall’;
とか
$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/local/pgsql/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’]= ‘/usr/local/pgsql/bin/pg_dumpall’;
とかに変更するとエクスポートできるようになります。
ちなみに私は後者の設定でエクスポートできるようになりました。

・・・それでも出来ません。

冷静にpg_dumpの場所を確認

すると、私の環境では以下のディレクトリの中にありました。

/usr/local/postgresql/bin

と、いうわけで、以下のように変更して、無事dumpの実行ができましたとさっ!
pgadminのcomf/config.inc.phpの35行目あたり

$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/local/postgresql/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’] = ‘/usr/local/postgresql/bin/pg_dumpall’;

まとめ:phppgadminのdumpが動かないとき

多くの先人が語るとおり、phppgadminでdumpが動かない場合ほとんどがpg_dumpの場所が間違っているケース。それぞれ環境によって場所が違うようですから、どうしてもdumpがうまくいかないときは/usr/local下のpostgresqlまたはpgsqlなどからpg_dumpの場所を確認してみてください。

配列の差分を取得するarray_diff()

データベースの情報が変更されたかどうかが知りたい。
変更前と、変更後のデータの差を見つけて処理を行うにはどうすればよいかと悩んでいましたが、よい関数を見つけました。

array_diff()で配列の差分を取得

結論は、変更前をsessionに格納し、変更後(postされたほう)の2つをarray_diff()でデータを比べればよい。

$array1 = array('aa','bb','cc','dd','ee','ff','gg');
$array2 = array('aa','cc','ddd','ee','fff','gg');
$hoge = array_diff( $array1 , $array2 );
print_r($hoge);

出力結果は以下。

Array ( [2] => ddd [4] => fff )

このように、差分のみが配列となって結果が返ってきます。

注意点:連想配列は空になる

この便利なarray_diff()ですが、連想配列は差分が取得できないようです。この点だけ注意が必要です。

GoogleMapsAPI 日本語住所から 携帯用地図

GoogleMapsAPIを使って、携帯でも住所から地図画像を出力する方法です。
以前PC用も日本語住所から経度・緯度を取得してGooglemapを表示する方法を紹介しましたが、
今回はそれの携帯バージョンを紹介します。

結論:日本語住所をエンコード、simplexml_load_file

まずはエンコード

$p = urlencode('何か住所を入れる');

次にsimplexml_load_fileを使います。

$xml = simplexml_load_file("http://www.geocoding.jp/api/?q=$p");

これだけで経度、緯度を取得することが出来ました。

$lat = $xml->coordinate->lat;//経度
$lng = $xml->coordinate->lng;//緯度

取得した経度と緯度を

画像として出力


各パラメータについてはこちらの記事を参考にされるといいかもしれません。
携帯サイトにGoogleマップ画像を住所で表示させる方法 渡辺大祐ブログ

出力例

GooglemapAPI携帯用の例

Googlemapへのリンクも設置

これだけで画像の出力はおしまいなんですが、もっと詳細な検索をしたい人のために、Googlemap携帯用のリンクも設置しておいてあげましょう。
何気にGooglemap携帯用のリンクがどうしても分からずに、けっこう悩んでしまいました。忘れないためにメモメモ。

GoogleMapで表示する

スマートフォンの場合、これだけで写真のようなマップ表示に切り替わるので使い勝手がよいです。

iphone


androidやガラケーも問題なく動作することが確認できました。

補足:GoogleMapsAPIの規約に注意!

多くのブログがこのことにふれていますが、出力される画像は1000/日と決まっています。
小規模なサイトや、アクセスがそれほど携帯から無い場合は気にしなくてもいいのかもしれませんが、注意が必要です。

UTF8で携帯サイト auでのformのテキストが文字化ける

UTF-8にて携帯サイトを作って、フリーワード検索なるものを作っていたところ、auでのみ、テキストのフォームデータのみが文字化けしてしまうことが判明しました。

UTF8環境の携帯ページのformはmb_convert_encodingで変換

getでフォームの内容をいくら渡しても、auでは文字化けをしてしまいます。

<form method="get" action="/m/searches/free_searches/">
<input type="text" size="10" name="data">
<input type="submit" value="検索">
</form>

このように、UTF8として、変換をかけてあげればよかったのですね。

$this->params['url']['data'] = htmlspecialchars(mb_convert_encoding($this->params['url']['data'],"UTF-8", "UTF-8,SJIS,EUC-JP"));	

ちなみに今回の現象はauのガラケーのみで確認できました。firemobileシュミレータ
ではそのような現象は確認できなかったので、やはり実機でのデバックは大事だな~と思いました。

たたみラボ

htmlspecialchars nl2br でHTMLを排除しつつ 改行する

htmlspecialchars nl2brのあわせ技で、HTMLは排除しつつも\nはしっかりbrタグに変換する方法です

<?php echo nl2br(htmlspecialchars($hotel[‘Hotel’][‘text’]));?>

ごめんね、これだけです。

PHPディレクトリ作成 mkdir

mkdir($dir, 0777)でパーミッションが変更されない。

どうしてもmkdirだけでパーミッション777にならなければ、chmod($dir, 0777)も一緒に使ってみるといいみたい。
知りませんでした・・・

//ディレクトリ、無ければ作成		
		if(!is_dir($dir)) {
		mkdir($dir, 0777);
		chmod($dir, 0777);
		}

PHPで文字コードを宣言、指定する

HTMLで文字コードを宣言せず、PHP側で文字コードを宣言する方法です。
ページがHTMLベースのWEBページではない、
例えばCSVファイルを表示させて、ブラウザの『ページを保存』させたいときに有効な手法です。

$charset = $_REQUEST[‘charset’];
ob_start(‘mb_output_handler’);
header("Content-Type: text/plain;charset=".$charset);

なお、この方法はあくまでファイルの文字コードの宣言であって、特定の変数の文字コードを変換するものではありません。その場合はmb_convert_encodingを使ってください。

PHP 配列の要素削除

こういう連想配列があったとして 1つ目の恵太(夫)を削除したいとする。
$hogeのprint_rの実行結果。

Array
(
            [User] => Array
                (
		[0] => 恵太
		[1] => 良夫
		[2] => 太郎
                )
 )

unsetで配列要素削除

unset($hoge[‘user’][0]);

Array
(
            [User] => Array
                (
		[1] => 良夫
		[2] => 太郎
                )
 )

削除は出来たものの、0というキーも一緒に削除された。

array_spliceで配列要素削除

$hogehoge = array_splice($hoge[‘user’], 1);
print_r($hogehoge);

Array
(
            [User] => Array
                (
		[0] => 良夫
		[1] => 太郎
                )
 )

先ほどの0番目が削除され、新たに良夫が0番から始まった。
配列の順番を崩すことなくキーを削除したい場合はarray_splice()の第2引数まで指定すればよさげ。

夫を削除しましたが、夫婦仲は良好です。

PHP 連想配列にKeyを追加

連想配列にkeyを追加

こういう連想配列があったとして

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1
                    [name] => 太郎
                )

            [Login] => Array
                (
                    [id] => 1
                    [login] => xxx
		    [password] => password
                )

        )

    [1] => Array
        (
            [User] => Array
                (
                    [id] => 2
                    [name] => 良夫
                )

            [Login] => Array
                (
                    [id] => 2
                    [login] => vvv
		    [password] => password
                )

        )

    [2] => Array
        (
            [User] => Array
                (
                    [id] => 3
                    [name] => 恵太
                )

            [Login] => Array
                (
                    [id] => 3
                    [login] => yyy
                    [password] => password
                )

        )

[3]は夫の名前です。(どうでもいい)
[User] に対して何か[kana]というkeyを追加したいとする。

array_pushを使ってもいけるんですが、

$hoge[0]['User']['kana'] = 'タロウ';
$hoge[1]['User']['kana'] = 'ヨシオ';
$hoge[2]['User']['kana'] = 'ケイタ';

foreachを使って動的にkeyを追加する

foreach($hoge as $key =>$hogehoge){
$hoge[$key]['User']['kana'] = 'カナ';
}

これがどう~~しても分からなくて何時間も悩んだのですが、$hogehogeには代入せずに$hogeに代入すればいいってことで。
要は$hogehogeは●●回目のループのデータが入っているわけで、全てのループに対しては$hoge。
メモメモ。

PHP 連想配列に追加あれこれ

PHPのフレームワークを使っていると、理想の形に配列を変形したくなることがちょいちょいある。

連想配列を 単純な配列に。

$test = array();
foreach($shop_area as $value ){
array_push($test, $value['ShopArea']['area_id']);
}

こうすることで、単純配列に。
連想配列を、単純な配列にすることはよくあって、
連想配列だと 配列の中身をうまく検索できないのだ。
ちなみに$test = array();はけっこう大事。array_pushはあらかじめ配列になっているところにデータを追加する関数だから、
空でよいのであらかじめ配列を代入しておく必要があります。

連想配列に追加してみる

$today の中身はすでに連想配列が入っていると過程して、全ての$today[‘user’]のループ中に[‘dir’]といkeyを追加したい場合はこんなカンジ。

foreach($today as $val =>$taday){
$today[$val]['user']['dir'] = "test";
}

ちなみに、

foreach($today as $val ){
$today['user']['dir'] = "test";
}

こうすると、連想配列のループが壊れてしまいます。どうも、ループの最終データにだけ入って終わります。

いや、こんなことで30分も悩んだのであっしも修行が足りない。

配列を自在に操作できるようになってくると、『PHP極めた』感が出てくるね。