CPIでの嫌なPHP設定

レンタルサーバCPIのサーバを、実はあまり好きではない。デフォルトの設定が嫌なのだ。

mbstring.encoding_translation on
mbstring.internal_encoding EUC-JP

いまどき、こんな初期設定がされているサーバって…と思うが、それはまぁ、仕方のないこと。注意としては.htaccessでは設定できないところ。設定方法はSixCore共用サーバに近い。php.iniファイルを作成して、以下のように記述し、設定を反映させたいディレクトリにファイルを設置する。

mbstring.encoding_translation=off

設置したディレクトリの下位のディレクトリには、この設定は反映されない。反映させるには別途設定が必要。もしくは同じ記述のphp.iniを、やはり設定を反映させたいディレクトリに設置する。

最初から、何の設定もされてなければいいのに。

PostGISなデータをSELECTしてみる

2009/09/06 | PostgreSQL

さて、今度はPostGISなデータをSELECTしてみる。まず単純に「SELECT * FROM table;」なんてしてみたら位置データの入っているカラムには長い文字列が入っていた。

0101000020E61000000000000000E060400000000000804140

え、何これ。どうやって解釈するの。でも、きっと解釈する関数があるはず、と思って調べたらありました。

SELECT AsText(column) FROM table;

これでちゃんと目で見て判る形式で出力されました。

POINT(135 35)

PostGISを使うには、やっぱり関数郡には一通り目を通しておく必要がありそうだ。

ちなみに経度と緯度それぞれに分けて表示させるにはX関数、Y関数を使うとのこと。

SELECT X(column),Y(column) FROM table;

こっちのほうが使いやすいかな。

PostGISなデータを実際にINSERTしてみた

2009/09/05 | PostgreSQL

PostGISなデータをINSERTする方法は「GeomFromText」という関数を使うことは前にもメモした。試しに、実際のデータベースにINSERTしようとしてみたらうまくいかない。エラーが出る。こんな感じ。

ERROR:  parse error – invalid geometry
CONTEXT:  SQL function “geomfromtext” statement 1
********** エラー **********
ERROR: parse error – invalid geometry
SQLステート:XX000
コンテキスト:SQL function “geomfromtext” statement 1

とりあえずエラーの意味がよくわからなかった(後々考えてみれば「geomfromtextの第1引数だよ」といっていることに気づいた・・・メッセージ読めよって感じ)。

なぜ、と思ってよく見てみたら関数の第1引数を以下のように指定していたことが原因だった。

‘POINT(135,35)’

なんのことはない。経度と緯度を「,(カンマ)」で区切るのは間違い。スペースだった。

‘POINT(135 35)’

でけた。

少なくとも一つのフィールドを指定しなければなりません。

2009/09/04 | PostgreSQL

MySQL同様、PostgreSQLにもウェブベースの管理画面がある。phpPgAdminだ。以前(5年位前)PostgreSQLを使っていたときは知らなかったのだが、最近はデータの中身を見るときなど、便利なので使うことがある。今回は位置情報以外のテーブル操作はphpPgAdminを使うことにした。

行の操作では使ったことがあったけど、phpPgAdminでテーブルを作ったりしたことがなかったのでいきなり躓いた。テーブルを作ろうとするといきなりエラーが出てしまった。

少なくとも一つのフィールドを指定しなければなりません。

意味わかんない。でも、ウェブで調べて解決。どうやらカラムの追加でintegerを設定する際、長さを指定しているとこのエラーが出るらしい。ためしにintegerを設定したカラムの長さを空欄にするとテーブルは作成できた。

phpPgAdminで、例えばtext型を指定すると、そのカラムで入力する必要がない部分(長さ)の入力ボックスはグレーアウトして入力できなくなる。だったらinteger型でも同じようにできなかったのかね。しかしそれにしてもエラーメッセージがまったく的を得ていない。やっぱりphpMyAdminのように使い込まれていないからなのだろうか。当分phpPgAdminの使い方でも迷いそうだ。でもまぁ、これもまた勉強、か。

PostGISなデータベースを使えるようにする

2009/09/03 | PostgreSQL

Windowsな環境で試しているときは、所詮ローカルな環境だからユーザとか気にせずテストしていたけれど、さすがに外部公開するサーバではまずいので、ユーザを追加して使用することになる。ユーザの追加はpostgresユーザになって「createuser -P」。あとpg_hba.confでPostgreSQLへの接続設定。ここまでは一般的なことで、別にPostGISに限った話ではない(いや、結局全てPostGISに限ったことではないのだけれど)。

で、早速新しいユーザでデータベースを作ろうとしてみた。コマンドは-Tオプションで新しく作ったテンプレートデータベースを指定する。しかしエラーで作ることができない。

createdb: database creation failed: ERROR:  permission denied to copy database “template_postgis”

どうやらtemplate_postgisへのアクセス権がないからだめだ、といわれているらしい。そこでtemplate_postgisのアクセス権について考えることにした。まず、データベースの状態を知るために、postgresユーザになって以下のコマンドを実行。

SELECT * FROM pg_database;

これでデータベースの状態(?)を見ることができるのだが、デフォルトのデータベーステンプレートであるtemplate1と比較してみた。その中でdatistemplateなるカラムがあり、そこが違うようだ。読んで字のごとく「データがテンプレートか否か」ということらしい。これをtureにしてやればよさそうなので、以下のコマンドを発行。

update pg_database set datistemplate=true where datname=’template_postgis’

これで多分テンプレート化できた(と思う)。その後、元のユーザになってデータベースを作成したところ、問題なく作成できた。ほっとして、データベースの中身を確認し、二つのテーブルが作成されていたので「よしよし」と思い、いちおうテーブルの中身を確認しようとselect文を発行しようとしたところまたエラー。どうやらデータベースのテンプレート可はできたものの、中身のテーブルのオーナーはpostgresのままらしい。データベース作成時にデフォルトで中のテーブルのオーナーも設定してくれる方法がわからない。しかたないので、postgresユーザになってデータベースにログインし、grantコマンドで新ユーザにフルアクセスで権限を与えた。

これでようやく新ユーザでPostGISなデータベースを使えるようになった(はず)。ためしにデータベースにログインして「SELECT postgis_version();」コマンドを発行したら、ちゃんと応答を返してくれた。

postgis_version
—————————————
1.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

なんとか動いてるみたい。やっとスタートラインに立てた(かも)。

守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net