DataObjectを使ってデータベースに登録

さくっと登録すっか。

まずはテーブル設定

面倒なんで1テーブルで。

CREATE TABLE `PL_Entry` (
`id` INT DEFAULT '0' NOT NULL AUTO_INCREMENT ,
`datetime` INT DEFAULT '0' NOT NULL ,
`attachments` VARCHAR( 255 ) NOT NULL ,
`category` VARCHAR( 255 ) NOT NULL ,
`subject` TEXT NOT NULL ,
`contents` TEXT NOT NULL ,
`latitude` DOUBLE DEFAULT '0' NOT NULL ,
`longitude` DOUBLE DEFAULT '0' NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `category` )
) TYPE = MYISAM ;

複数の添付ファイルはattachmentsにカンマ区切りででも入れとくか。
配列作ったり別テーブルにしたり面倒だし('A`)
複数の画像があった場合最初のイメージからGPS情報を拾うことにすべ。

Data_Object用のスタブ作成

まずはマニュアルに従って設定ファイルを作る。

[DB_DataObject]
database    = mysql://root:@localhost/test
schema_location = /var/www/html/php/imagemaps
class_location  = /var/www/html/php/imagemaps
require_prefix  = do/
class_prefix    = DO_
debug=5

あとはpear/DB/DataObject/createTables.phpに食わせればOK

$ php /usr/share/pear/DB/DataObject/createTables.php /var/www/html/php/imagemaps/tables.ini

これでPL_Entry.phpが出来た。

<?php
/**
 * Table Definition for PL_Entry
 */
require_once 'DB/DataObject.php';

class DO_PL_Entry extends DB_DataObject 
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    var $__table = 'PL_Entry';                        // table name
    var $id;                              // int(11)  not_null primary_key auto_increment
    var $datetime;                        // int(11)  not_null
    var $attachments;                     // string(255)  not_null
    var $category;                        // string(255)  not_null multiple_key
    var $subject;                         // blob(65535)  not_null blob
    var $contents;                        // blob(65535)  not_null blob
    var $latitude;                        // real(22)  not_null
    var $longitude;                       // real(22)  not_null

    /* ZE2 compatibility trick*/
    function __clone() { return $this;}

    /* Static get */
    function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DO_PL_Entry',$k,$v); }

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
}

おし。

まずはテスト

<?php

include_once("PEAR.php");
$config = parse_ini_file('do_pl_entry.ini',TRUE);
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$options = $config['DB_DataObject'];
include_once("DB/DataObject.php");

 function store(){
 	$entry = DB_DataObject::factory('PL_Entry');
 	$entry->datetime = date('U');
 	$entry->attachments = 'test.jpg';
 	$entry->category='test';
 	$entry->subject ='テスト';
 	$entry->contents='これはテストエントリです';
 	$entry->latitude = 142;
 	$entry->longitude = 43 ;
 	var_dump($entry);
 	$id = $entry->insert();
 	echo $id ;
 }
?>
無茶苦茶ハマったポイント
  • $optionsの読み込み

PEAR::getStaticProperty(...)を参照で取り出してINIで読み込んだデータをバインドしないと、データベースへの接続ができんかった。
ま、そのとおりなんだが。

  • DB_DataObject::factory()の引数

ここはオブジェクト名じゃなくてテーブル名じゃないとアカン。
最初上のOptionsの設定をする前にオブジェクト名でロードして、なんとなくロードできてたから余計にハマった。

とりあえず更新できたってことで

あとはバインドコード書くだけだな。