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)● —-↑