アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

CodeIgniter入門 #6:データベースの操作

CodeIgniter入門シリーズ カテゴリーの記事一覧 - アナログCPU:5108843109


まあ公式マニュアルにまとまってるんですけどね。
データベースへの接続 — CodeIgniter 3.2.0-dev ドキュメント
クエリ — CodeIgniter 3.2.0-dev ドキュメント

今回やること

  • コントローラからデータベースの操作(SELECT、INSERT、UPDATE、DELETE)を行う
  • プレースホルダを使う
  • エスケープする

データベース

データベースはこんな感じ。
ユーザーマスタ的なものを想定。
とはいえお試しなので超シンプルに、users テーブルに、連番の id と文字列を入れる name で。

CREATE TABLE `user` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(16) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

データベースへの接続

以前書いたことと少しかぶるので簡単に。
まず、設定値は config の database.php へ。
そこだけ設定しておけば、コントローラ内に

$this->load->database('default');

と書くだけで接続できます。

ほとんどのコントローラで接続を行う場合など、これをいちいち書きたくない場合は config の autoload.php のライブラリに「database」を追加しておけばOKです。

$autoload['libraries'] = array(
	'database',
	// 他にもライブラリ系を毎回ロードしておきたい場合はここに追加するものと思われる
);

INSERTする

テストデータを手動で入れるのすら面倒なので、INSERTから作ります。

今回はUserコントローラを用意し、その中に insert 関数を設置しました。
/user/insert/ でアクセスできます。

一番シンプルなのはこれだけ。

public function insert()
{
    $sql  = "INSERT INTO `user` (`name`) ";
    $sql .= "VALUES('なまえ') ";
    $this->db->query($sql);
}

SELECT

次はINSERTされているかどうか確認するためにもSELECT作ります。

とりあえず全行SELECTしてくるやつ。

public function select()
{
    $sql  = "SELECT `id`, `name` ";
    $sql .= "FROM `user` ";
    var_dump($this->db->query($sql)->result());
}

UPDATE

無事にINSERTしたやつがSELECTできることを確認できたので、次はUPDATEしてみます。
変わり映えしないですが…。

public function update()
{
    $sql  = "UPDATE `user` ";
    $sql .= "SET `name` = '変更後だよ!!!!!' ";
    $sql .= "WHERE `id` = 3 ";
    $this->db->query($sql);
}

SELECT動かして変更されることを確認。

DELETE

追加・変更・取得ときたので最後は削除。

public function delete()
{
    $sql  = "DELETE FROM `user` ";
    $sql .= "WHERE `id` = 3 ";
    $this->db->query($sql);
}

これで一通り動かしてみることができました。

プレースホルダを使う

値を動的に組み込みたい場合はプレースホルダを使います。
もちろんエスケープ等はCodeIgniterさんがやってくれるのでこれだけで安全になります。
INSERTのコードの、VALUES句の中身を動的にしてみます。

public function insert()
{
    $sql  = "INSERT INTO `user` (`name`) ";
    $sql .= "VALUES(?) ";
    $this->db->query($sql, array("ほげ"));
}

query の第二引数に渡した値が「?」に入ってくれます。

複数にも当然対応しています。
例えばSELECTで検索条件やページャ用の取得件数制御を入れてみます。

public function select()
{
    $sql  = "SELECT `id`, `name` ";
    $sql .= "FROM `users` ";
    $sql .= "WHERE `id` > ? ";
    $sql .= "LIMIT ?, ? ";
    $arg_list = array(
        1,
        0,
        5,
    );
    var_dump($this->db->query($sql, $arg_list)->result());
}

この場合はクエスチョンの順番通りに当てはめられていきますので、「WHERE `id` > 1 LIMIT 0, 5」となります。

明示的にエスケープする

escape メソッドを使えばクエリの文字列にエスケープした文字列を結合することもできます。
動的な値を入れるときはプレースホルダが使えればOKなんですけど、
テーブル名やカラム名を動的にするときなど場合によっては必要になるかも…?

public function insert()
{
    $sql  = "INSERT INTO `user` (`name`) ";
    $sql .= "VALUES(" . $this->db->escape("'',''ふが~~") . ") "; // なんか危なそうな文字列をエスケープして結合
    $this->db->query($sql);
}