Friday, March 7, 2008

データベースへの接続

マニュアルにある以下の接続方法を使った場合に、データベース接続ができなかったので調査。
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$config['active_r'] = TRUE;

$this->load->database($config);


system/database/DB.php のコンストラクタを見ると引数が配列の場合でも、DSNとして扱われてしまっているみたい。
DSN用の処理を回避するように修正。
- else
+ elseif (is_string($params))

Monday, March 3, 2008

コマンドラインから実行

コマンドラインからCIのコントローラ経由で実行できるようにする。

CIそのままでは引数によるコントローラ、メソッドのマッピングができないのだが、今後使う必要が出てきそうなのでいじってみる。

処理を追ってみると、CodeIgniter.php 内で pre_system フックの後に CI_Router クラスの読み込みを行っている。
CI_Router クラス内では $_SERVER の値によりコントローラとメソッドの選択を行っているので、無理矢理だがそこを書き換えることで動作の制御ができそう。

1. system/applications/config/hooks.php に以下を追加。
$hook['pre_system'] = array(
'class' => 'CLI',
'function' => 'set_route',
'filename' => 'CLI.php',
'filepath' => 'hooks',
'params' => null
);


2. system/applications/hooks/ 内に 1.で指定した名称のクラスファイルを作成し、以下のコードを保存。
<?php

class CLI
{
public function set_route()
{
if (php_sapi_name() != "cli") return;

if ((array_key_exists("argv", $_SERVER)))
{
$argv = $_SERVER["argv"];
array_shift($argv);
$_SERVER["PATH_INFO"] = "/" . implode("/", $argv);
}
}
}

?>


3. 実行するときはこんな感じで。
$ php index.php controller method data


TODO: $config['uri_protocol'] の設定によって $_SERVER のキーを変える必要がある。上のコードであればAUTOもしくはPATH_INFOを指定すればとりあえず動くはず。