Zend Framework入門(6):抽象化レイヤによるデータベースアクセス手法 - Zend_Db(前編) -
Zend Frameworkによる実践的なPHPアプリケーション開発 6
ダウンロード サンプルファイル (4.1 KB)
Zend_Dbでテーブル更新
データベースの検索ができるようになったので、次は更新を行います。SQL文を指定する基本的な方法と、SQL文を書く必要のない便利なメソッドを使う方法の2通りを取り上げます。
SQL文を指定して更新
まずはSQL文を指定して更新を行う方法です。この方法ではZend_Db_Statement_Pdoオブジェクトを使います。プリペアドステートメントという便利な機能の使い方も取り上げます。テーブルmessage_boardにレコードを1行追加する例を見てみましょう。
<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を検索してみましょう。テーブルに入っていたレコードに加えて今追加したレコードが表示されます。

便利なメソッドで更新
次はSQL文を書かずにテーブルを更新できる、アダプタクラスの便利なメソッドを使います。先ほど追加したレコードのmessage列を変更する例を取り上げます。
<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文を実行するメソッドも用意されています。
| 操作 | メソッド |
| INSERT | insert($table_name, $value_array) |
| UPDATE | update($table_name, $value_array, $condition) |
| DELETE | delete($table_name, $condition) |
$value_arrayは列名をキーにして値を格納した配列で、INSERT文のVALUES句、UPDATE文のSET句に相当します。$conditionはUPDATE文またはDELETE文のWHERE句に相当する文字列を指定します。$conditionは省略可能ですが、省略するとテーブルの全レコードが変更されます。adapter_update.phpでレコードの変更を行ったら、basic_select.phpを再度実行してテーブルmessage_boardを検索してみましょう。

この記事は参考になりましたか?
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 川北 季(カワキタ ミノル)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
