同じことやるの2度目なのに、すっかり忘れてしまっていたので、3度めに備えてメモ。
やりたいこと
(MySQLに入っている)あるデータを、Google Spreadsheets APIを使ってスプレッドシートに書き込む。
使うもの
以下のライブラリを使う。
自宅警備員兼エンジニアのブログ
同じことやるの2度目なのに、すっかり忘れてしまっていたので、3度めに備えてメモ。
(MySQLに入っている)あるデータを、Google Spreadsheets APIを使ってスプレッドシートに書き込む。
以下のライブラリを使う。
PHPの歴史って長くて、その間に付けたし付けたしでどんどん関数が増えていき、PECLモジュールもかなりの数になっている。
なので、普段PHPをよく使っている人でも、結構知らない関数や機能があったりする。かくいう自分もちょくちょく新しい関数を発見して、その都度「もっと早くに知っていれば」という悔しい思いをしていたんだけど、この度
PHPマニュアルの関数リファレンスを全部読んで、知らない関数や機能を発見しよう!
と思いついたので、実行してみた。
以下、筆者が知らなかった、あるいは知っていたけど載せる価値がある、と思ったものを載せているので、読んでいる方にとって自明の事であったり、あるいはここに載っていないけど読んでいる方にとって知らないものとかがあるかもしれない。
と言う事で、善良なPHPerの皆さんは、各自でマニュアルを読み込む事をお勧めする。
新しいサーバー(VPS)にsymfonyを入れている。
schema.ymlを書き換えてsymfony doctrine:insert-sqlを実行したら以下のエラー。
$ symfony doctrine:insert-sql >> doctrine creating tables Couldn't locate driver named mysql
まぁメッセージの通りドライバーが足りないんだろう。以下のコマンドで確認できる。
php /usr/share/pear/data/symfony/bin/check_configuration.php
結論から言うと、php-mysqlとphp-pdoをインストールすれば解決。
環境:CentOS 5.5
最近PHPを使う時はいつもsymfonyを使ってるので、DBに接続したりSQLを投げるコードを直接書くことはなかったんだけど、つい最近、ほんのお遊びプログラムを作る時に、わざわざsymfonyを使うまでもないと思ったので、プレーンなPHPで書くことにした。
普通のPHPを使うのなんて久しぶりなので、最初はmysql_connectとかの昔ながらのやり方をやってたんだけど、それだとさすがに芸がないので他のやり方をすることにした。
どうやら調べてみたら、ここ最近ではPDOを使う人が多いみたいなので自分もそうしてみることにした。CodeZineにPDOの記事が載ってたのでそれを見つつやってみる。PDOにしろ何にしろ、そもそも人間の労力を減らすための物なので、そんなに難しいわけがない。
で、次に引っかかったのが定番の文字コード。色々見てると例の
set names utf8
ってのを実行してる例が多かったけど、これって筋が悪いというかあまり美しくないって個人的には思う。で、調べている途中にこんなページが見付かった。
Shift JISの場合、set namesで文字コードを指定しても、PDOが文字コードを意識した作りになってないから(?)、SQLインジェクションが起こる可能性があるらしい。
shema.ymlに色々書いてsymfony doctrine:build –modelを実行すると色々なクラスが自動的に生成される。lib/model/doctrine以下には、各モデル毎に[ModelName].class.phpと[ModelName]Table.class.phpという2つのクラスが生成される。
その2つの使い分けは何となくやってたんだけど、最近明快な答が載ったページ(英語)を見つけたのですっきりした。
まぁソースコードを見ればすぐ分かるんだけど、継承関係としては以下の通り。
てことで、[ModelName]Tableの方は、テーブルからデータを取ってきたりする処理を記載して、取ってきたレコードに対する処理は[ModelName]クラスの方に記載する。
symfonyでコマンドを入力する。例えばsymfony project:deploy –go xxxxとか。で、何かエラーが出るとする。画面に出力されるメッセージから色々判断しなきゃいけないんだけど、出力が長い場合、画面の幅に収まるように、symfonyの内部で勝手に…..とかに省略されてしまい非常に不便。
設定で簡単に変えられないか調べたんだけど、分からなかったので結局ソースを直接修正した。
/lib/command/sfFormatter.class.php の38行目辺り(symfony 1.4.5の場合)。以下の値を大きな値に変更すればOK。
$maxLineSize = 65;
参考にしたページ(英語)。
symfony 1.4だとDoctrineが標準になったので必然的に使う事になってる。
もしかしたら世間的には常識なのかもしれないけど、昨日発見して感動した事。
Doctrine::getTable("TableA")->findByField1AndField2("val1", "val2");
ってやると以下のSQLが実行される。
SELECT * FROM TableA WHERE Field1='val1' AND Field2 ='val2'
複数のカラムにまたがる検索も一発で出来るのは非常に便利。当然 findByField1AndField2 なんてメソッドは自分で用意しなくても使える。
最近のORマッパーってこんなもん?
自分用メモ。
symfonyでは、独自の設定項目をapp.ymlに追加していく事が出来る。それの読み込み方は以下の通り。
sfConfig::get('app_foo')
まぁこれはすぐ分かるんだけど、app.ymlの中身が以下のように階層構造になってたらどうすれば良いんだろうと思ってググってみたら、このページが見付かった。実際にまだ試してないけど・・・
all: foo: bar: "val"
LimeSurveyを触っていたら以下のようなPHPのNoticeが出た。
Notice: Use of undefined constant auto - assumed 'auto' in C:xampphtdocslimesurveycommon.php on line 4505
autoって定数が定義されていないのか。調べてみたら、該当行ではmb_convert_encoding関数が使われてた。でも、autoって指定すると自動的に文字コードを判別するはずだし、定義されていないはずはないよなぁと思って色々調べたけど、結局以下のように引用符でくくったらエラーが出なくなった。あほらし・・・
auto → "auto"
ちなみに、ほんとに"auto"っていう引数が使えないケースもあるらしく、php.iniの設定を変えたなんていう人もいた(→)。