CodeZine(コードジン)

特集ページ一覧

Zend Framework入門(6):抽象化レイヤによるデータベースアクセス手法 - Zend_Db(前編) -

Zend Frameworkによる実践的なPHPアプリケーション開発 6

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/05/15 14:00
目次

Zend_Dbでテーブル更新

 データベースの検索ができるようになったので、次は更新を行います。SQL文を指定する基本的な方法と、SQL文を書く必要のない便利なメソッドを使う方法の2通りを取り上げます。

SQL文を指定して更新

 まずはSQL文を指定して更新を行う方法です。この方法ではZend_Db_Statement_Pdoオブジェクトを使います。プリペアドステートメントという便利な機能の使い方も取り上げます。テーブルmessage_boardにレコードを1行追加する例を見てみましょう。

insert_statement.php
<html>
<head>
<title>INSERTの例</title>
</head>
<body>
<?php
require_once 'Zend/Db.php';
require_once 'Zend/Config/Ini.php';

$config = new Zend_Config_Ini('config/db_info.ini', 'sample_db');
$db = Zend_Db::factory($config->db);

// プリペアドステートメント用のSQL文を作ります
$sql = "INSERT INTO message_board VALUES(?, ?)";
// Zend_Db_Statement_Pdoオブジェクトを作ります
$statement = new Zend_Db_Statement_Pdo($db, $sql);

// プレースホルダに入れる値を指定してINSERT文を実行します
$result = $statement->execute(array(3, 'I am fine.'));

echo "$result" . "行のレコードを追加しました。<br/>";
?>
</body>
</html>

 basic_select.phpの例ではアダプタのqueryメソッドを用いてZend_Db_Statement_Pdoオブジェクトを作りました。この方法では、オブジェクト生成と同時にSQL文が実行されます。一方、insert_statement.phpの例のようにコンストラクタを使ってオブジェクトを作ることもできます。この場合はexecuteメソッドでSQL文が実行されます。

 SQL文の文字列「$sql」の中に「?」が2個入っています。これはSQL文を実行するときにパラメータを入れる場所を示し、プレースホルダと言います。パラメータは、executeメソッドでSQL文を実行する際に配列で指定します。パラメータの値だけが異なるSQL文を実行するときはexecuteメソッドの引数を変えればよく、Zend_Db_Statement_Pdoのオブジェクトを作り直す必要がありません。このように可変のパラメータを含むSQL文を、プリペアドステートメントと呼びます。INSERT文の例を取り上げましたが、SELECT文、UPDATE文、DELETE文でも同様にプリペアドステートメントを使うことができます。

 パラメータを含む文字列を結合してSQL文を作った場合、意図しないSQL文が実行されることがあります。例えば"SELECT * FROM message_board WHERE id = "という文字列の後ろに"1 or true"という文字列を結合し、WHERE句を常に真にするような場合が考えられます。このようにして意図しないSQL文を実行させることをSQLインジェクションと呼びます。プリペアドステートメントは、SQLインジェクションを避けるのにも役立ちます。

 insert_statement.phpでレコードを追加したら、basic_select.phpを再度実行してテーブルmessage_boardを検索してみましょう。テーブルに入っていたレコードに加えて今追加したレコードが表示されます。

INSERTの結果を確認
INSERTの結果を確認
表示のキャッシュについて
 INSERTの結果を確認するためにbasic_select.phpを実行しても、表示内容がブラウザにキャッシュされて更新前の情報が表示される場合があります。その場合はブラウザで「最新の情報に更新」を行ってみてください。

便利なメソッドで更新

 次はSQL文を書かずにテーブルを更新できる、アダプタクラスの便利なメソッドを使います。先ほど追加したレコードのmessage列を変更する例を取り上げます。

adapter_update.php
<html>
<head>
<title>UPDATEの例</title>
</head>
<body>
<?php
require_once 'Zend/Db.php';
require_once 'Zend/Config/Ini.php';

$config = new Zend_Config_Ini('config/db_info.ini', 'sample_db');
$db = Zend_Db::factory($config->db);

// 更新する列名をキーに、新しい値を格納した配列を作ります
$data = array('message' => "I'm fine. How about you?");
// UPDATE文を実行します
$result = $db->update('message_board', $data, 'id = 3');

echo "$result" . "行のレコードを変更しました。<br/>";
?>
</body>
</html>

 例ではUPDATE文に相当するメソッドを取り上げましたが、他にINSERT文とINSERT文を実行するメソッドも用意されています。

アダプタのテーブル更新用メソッド
操作メソッド
INSERTinsert($table_name, $value_array)
UPDATEupdate($table_name, $value_array, $condition)
DELETEdelete($table_name, $condition)

 $value_arrayは列名をキーにして値を格納した配列で、INSERT文のVALUES句、UPDATE文のSET句に相当します。$conditionはUPDATE文またはDELETE文のWHERE句に相当する文字列を指定します。$conditionは省略可能ですが、省略するとテーブルの全レコードが変更されます。adapter_update.phpでレコードの変更を行ったら、basic_select.phpを再度実行してテーブルmessage_boardを検索してみましょう。

UPDATEの結果を確認
UPDATEの結果を確認

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Zend Framework入門

もっと読む

著者プロフィール

  • WINGSプロジェクト 川北 季(カワキタ ミノル)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5