2008/11/24以降のメインブログはこちらになります。 : http://www.glamenv-septzen.net/
本はてなダイアリにはコメント・トラックバックを受け付ける記事を公開します。
2008-02-21
■[PHP][CakePHP]DboSource::query()がご丁寧にも勝手にfromのテーブル名を返り値の配列のキーにセットしてくれる件
CakePHP 1.1.19 です。
ようやく以下のようなコードで、「さて、どんな構造で返ってくるか・・・。」と試すことが出来ました。
$ds =& ConnectionManager::getDataSource(CAKEAPP_SHOP_ENV);
$sql = "select * from hoge where id = " . $ds->value('1');
$results = $ds->query($sql);
var_dump($results);
ちなみに
$ds->value('1')
というのは、DboMysqlにおいてはvalue()は一応ちゃんと、
function value($data, $column = null, $safe = false) {
switch ($column) {
default:
$data = "'" . mysql_real_escape_string($data, $this->connection) . "'";
break;
}
...
}
みたいにmysql_real_escape_string()してくれてます。あ、ちなみに上記コードをそのまま信用しちゃだめですよ。$column部分の判断条件とか、$dataの"空"判断とかbool型独特の処理とかも隠れてますので。
まぁ、'encoding'を指定したときのsetEncoding()では"SET NAMES"を発行してたりするのですが。
で、さて、どんな構造で返ってくるのか・・・。
array(1) {
[0]=>
array(1) {
["hoge"]=> # ... テーブル名?
array(16) {
["id"]=>
string(1) "1"
["gender"]=>
string(1) "f"
・・・誰がいつ、勝手にテーブル名をレコードの戻り値のキーにセットしろと言ったんだよ《゚Д゚》ゴラァァァァァァァァァァァァア!!
(*`Д´)=○)Д゚) ´Д゚)・;’
・・・落ち着いてコードを確認してみると、dbo_mysql.phpでこのようなコードがあり、これが呼ばれているためのようだ。
function resultSet(&$results) {
...
while ($j < $num_fields) {
$column = mysql_fetch_field($results,$j);
if (!empty($column->table)) {
$this->map[$index++] = array($column->table, $column->name);
} else {
$this->map[$index++] = array(0, $column->name);
}
...
}
...
}
うわぁ・・・何これ。JDBCを使ったデータアクセスに慣れた身としては、キモイの一言なんだけど。例えばOracle使ってUNIONとかばりばり使う凶悪なSQL発行したときとか、フォローできるの?あるいは他のDBMSとI/F併せられるの?
なんっつーか、これ、複雑なSQLを発行した場合にいやーな結果になりそうな予感がしてならないです。
というか、そういう予感を抱かせる時点でキモイ。
symfonyはなぁ・・・。Creoleが結構JDBCな感じで素直にラップしてくれてて、Propelもそれなりに癖はあるけど比較的「ここまでの用途だったら快適ですよー。」という線引きがわかりやすかった。また最終的にPropelを通さずベタに扱うための「逃げ」というか「マージン」があったからこんな窮屈な感じはしなかったんだけど。
きっつー。
- 6 http://reader.livedoor.com/reader/
- 5 http://www.google.co.jp/reader/view/
- 2 http://cakephp.jp/rss/
- 2 http://d.hatena.ne.jp/essa/20080130/p1
- 2 http://d.hatena.ne.jp/keyword/拡張正規表現
- 2 http://d.hatena.ne.jp/magiwo/comment?date=20080221
- 2 http://d.hatena.ne.jp/makoto_2006jp/edit?date=20080220
- 2 http://events.php.gr.jp/event.php/event_show/33
- 2 http://search.yahoo.co.jp/search?p=インストール+RPM+PHP+セッション&search.x=1&fr=tbt-a1&tid=tbt-a1&ei=UTF-8
- 1 http://72.14.235.104/search?q=cache:T8-tFjZo-jUJ:d.hatena.ne.jp/msakamoto-sf/20071219/1197997556+ErrorDocument+VirtualHost&hl=ja&ct=clnk&cd=6&gl=jp&lr=lang_ja&client=firefox