2013年03月08日(金) 21時20分 / FuelPHP, PostgreSQL

FuelPHP、PDO、PostgreSQLで実験。(校正後)

以前にlivedoorブログで書いていたこと(2012/9/6)を校正して転載することに。
FuelPHPで、PostgreSQLに接続する方法です。成功してます。
今は迷うこともないけど、記事は当時のまま残しておきます。
ちなみに、今だと下リンクの公式ドキュメント(訳)を見たほうが早いです。
http://press.nekoget.com/fuelphp_doc/classes/database/introduction.html


●追記(2013/3/8) 与太話—-↓

この記事を書いた当時は、
FuelPHPとPostgreSQLの連携方法について
ネット内にも全く記事が見つからなかったんですよね(長い時間探したんですけどね)。
上記リンクのドキュメントさえも。
なので、自分で試行錯誤を繰り返して、ようやく動作に成功したものを記事にした感じです。
結果、この記事だけアクセス数が異常に伸び、参考になさった方もいらっしゃるようで、お力になれたのならなによりです。
同時に、ご自身の経験を記事にしてくださる、他のブロガーの方々にも改めて大感謝です。
●追記(2013/3/8) 与太話—-↑

FuelPHPで、標準のPDOでPostgreSQLに接続できないか実験してみた。
・Model_Crudを派生したクラスを作成したものを用いる
・PDO接続(Postgresに接続するなら、これしか選択肢がない)
APPPATH/config/db.phpを設定して、いざ!

…で、こんなエラーが出た。
Fuel\Core\Database_Exception [ Error ]: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near “.” LINE 1: SELECT `User`.* FROM `User` ^ with query: “SELECT `User`.* FROM `User`”

クエリのSintaxエラー!?
SELECT ‘User’.* FROM ‘User’;
Userを囲うシングルクォーテーションが不要である。もしくはPostgreSQLの場合はダブルクォーテーションを用いるべきなのだが。
いやいや、オレ何にもしてなくて、ただFuelPHPにお任せしてるだけなんだけど、、、。
PDOが原因なのかFuelPHPが原因なのかオレのソースが悪いのか。
んー。

で、twitterでつぶやいてみたら、友人のヒントで上記の件は解決。
よく見たら、`User` ←Userを囲っている[ ` ]これバッククォートだ。
/自分のプロジェクト/fuel/app/config/db.php内のidentifierがポイントだった。

return array(
 'active' => 'default',

/**
 * Base config, just need to set the DSN, username and password in env. config.
 */
 'default' => array(
 'type' => 'pdo',
 'connection' => array(
 'persistent' => false,
 ),
 'identifier' => '`',  ←ここ
 'table_prefix' => '',
 'charset' => 'utf8',
 'enable_cache' => true,
 'profiling' => false,
 ),

ここでバッククォートが指定されているのを、
‘”‘ ←ダブルクオーテーション(“)をシングルクォーテーションで囲う
または
” ←空にする

これで一歩前進。ダブルクオーテーションが正しいでしょうけど。
identifier はテーブル名を何で囲うか、を示すものらしい。
PostgreSQLでは、テーブル名の大文字小文字とかのルールが
他のDBとちょっとだけ違うので、ダブルクオーテーション(“)で囲ってあげるのが正解ですね。追記(2013/3/8)



// ●コメントアウト(?)(2013/3/8)● —-↓
ここより下は単純なエンコードの設定ミスだったので、目立たない色にしておきます。

●次なる問題。
とりあえず、このUserテーブルに、適当にデータを挿入するコントローラをつくってみたところ、
次はこんなエラーになった。
invalid byte sequence for encoding “UTF8”
ネットで調べてみると、PostgreSQLのエンコードUTF8に対応してない文字が入ってますよ、というもの。
登録データを半角英数のみにしたところ、正常にINSERTできたので、
あとはこの文字コードの対応か。。。
・Postgres上のDBは、エンコードはUTF8。
・psqlで、set client_encoding = “utf8”; で対応済み
・/自分のプロジェクト/fuel/app/config/db.phpファイル内の、charsetはutrf8
うーむ、設定漏れはなさそうなのだが。。。

:
1時間ほど格闘。。。
:

とりあえずは解決。綺麗な方法じゃないけどね。
文字列を代入する部分で、mb_convert_encodingを使う。
$row[‘UserName’] = ‘テストtest山田あい1235KIGOU#@+*’ ←INSERT時に上記エラー
$row[‘UserName’] = mb_convert_encoding(‘テストtest山田あい1235KIGOU#@+*’ , ‘utf8’ , );←INSERTは完了するが、ひらがな等全角文字が変なふうになる
$row[‘UserName’] = mb_convert_encoding(‘テストtest山田あいうえお12345KIGOU#@+*’ , ‘utf8’ , ‘SJIS’ );←INSERTも完了し、正しくデータもDBに登録される
とりあえずはFuelPHP、PDO、PostgresでもINSERTとSELECTが「できる」ことまで確認できたので、
これは大きな進展。
// ●コメントアウト(?)(2013/3/8)● —-↑


Leave a Reply