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を検索してみましょう。