getPath('class', 'com_kingyoya_mosabstract'); /** * 開発支援抽象クラス * @see mosDBTable, mosUser * @abstract */ class mosKingyoyaDBTable extends mosKingyoyaAbstract { /** @var array find where */ var $_wheres = array(); /** @var array find order by */ var $_order_by = array(); /** @var array list for find */ var $_list = array(); /** @var int iterate for find */ var $_iterate = 0; /** * コンストラクタ * @param string tablename * @param database &db */ function mosKingyoyaDBTable($tablename, &$db) { if (!$db || !is_object($db)) { $msg = 'Failed get database'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return; } if (!$tablename || !is_string($tablename)) { $msg = 'Failed get table name'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return; } parent::mosKingyoyaAbstract($tablename, $db); } /** * 複数検索 * @param int offset * @param int limit * @return boolean */ function find($offset = 0, $limit = 0) { /** @var int offset */ $offset = (int) $offset; $limit = (int) $limit; if ($offset && $offset < 0) { $msg = 'Offset is not natural integer'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } /** @var int limit */ if ($limit && $limit < 0) { $this->_error = 'Limit is not natural integer'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } /** @var string table name */ $tablename =& $this->_tbl; if (!$tablename || !is_string($tablename)) { $msg = 'Failed get table name'; $this->_error = $msg; trigger_error($msg, E_USER_WARNING); return false; } /** @var object database */ $database =& $this->_db; if (!$database || !is_object($database)) { $msg = 'Failed get database'; $this->_error = $msg; trigger_error($msg, E_USER_WARNING); return false; } /** @var array properties */ $properties = $this->getPublicProperties(); /** @var array wheres */ $wheres = array(); foreach ($properties as $key) { $value = $this->$key; if (isset($value)) { $value = $database->quote($value); $wheres[] = "`{$key}` = {$value}"; } } reset($properties); /** @var array where by user */ $userwheres =& $this->_wheres; if (!isset($userwheres) || !is_array($userwheres)) { $msg = 'Failed get where'; $this->_error = $msg; trigger_error($msg, E_USER_WARNING); return false; } foreach ($userwheres as $where) { if (!$where || !is_string($where)) { $msg = 'Failed get where'; $this->_error = $msg; trigger_error($msg, E_USER_WARNING); return false; } $wheres[] = $where; } /** @var array orderby */ $orderby = array(); if ($this->_order_by && !is_array($this->_order_by)) { $msg = 'OrderBy property has broken'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } foreach ($this->_order_by as $key=>$asc) { $orderby[] = "`{$key}` ".($asc ? 'asc' : 'desc'); } /** @var string Query */ $query = <<<__SQL__ SELECT id FROM {$tablename} __SQL__; if ($wheres) { /** @var string wheres */ $wheres = implode("\n\tAND ", $wheres); $query .= <<<__SQL__ WHERE {$wheres} __SQL__; } if ($orderby) { $orderby = implode("\n\t,", $orderby); $query .= <<<__SQL__ ORDER BY {$orderby} __SQL__; } $database->setQuery($query, $offset, $limit); if ($database->getErrorNum()) { $msg = "Failed query: {$query}"; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } /** @var array id list by find */ $this->_list = $database->loadResultArray(); if (!isset($this->_list)) { $msg = "Failed query: ".$database->getErrorNum(). ' '. $database->getErrorMsg(); $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } /** @var int iterater for find */ $this->_iterate = 0; /** @var int count of data */ $count = count($this->_list); if (!$count) return true; // no data for ($i=0; $i<$count; $i++) { /** @var int cast to int data */ $this->_list[$i] = (int) $this->_list[$i]; } return true; } /** * find 用の条件式を追加 * @param string key * @param boolean asc * @return true */ function appendWhere($where) { if (!isset($this->_wheres)) { $this->_wheres = array(); } else if (!is_array($this->_wheres)) { $msg = 'Where property has broken'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } if (!$where || !is_string($where)) { $msg = 'Failed get where'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } $this->_wheres[] = $where; return true; } /** * find 用のLIKE 条件式を追加 * @param string key * @param boolean asc * @return true */ function appendWhereLike($key, $value) { if (!isset($this->_wheres)) { $this->_wheres = array(); } else if (!is_array($this->_wheres)) { $msg = 'Where property has broken'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } if (!$key || !is_string($key)) { $msg = 'Failed get key'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } if (!$value || !is_string($value)) { $msg = 'Failed get value'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } $this->_wheres[] = "`{$key}` LIKE ". $this->_db->quote($value); return true; } /** * find 用の並び替えのキーと昇順・降順を追加指定する * @param string key * @param boolean asc * @return true */ function appendOrderBy($key, $asc = true) { if (!isset($this->_order_by)) { $this->_order_by = array(); } else if (!is_array($this->_order_by)) { $msg = 'OrderBy property has broken'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } if (!$key || !is_string($key)) { $msg = 'Failed get key'; $this->_error =& $msg; trigger_error($msg, E_USER_WARNING); return false; } $this->_order_by[$key] = $asc ? true : false; return true; } /** * find の結果 * データ数を返す * @return int */ function count() { $list =& $this->_list; if (!$list || !is_array($list)) { return 0; } return count($list); } /** * find の結果、次のデータがあるか * @return boolean */ function hasNext() { /** @var array list by find */ $list =& $this->_list; if (!$list || !is_array($list)) { return false; } /** @var int interator for find */ $iterate =& $this->_iterate; if (!isset($iterate) || !is_int($iterate)) { return false; } /** @var int count for list by find */ $count = $this->count(); return ($iterate < $count) ? true : false; } /** * find の結果 * 次のデータを読み込んでオブジェクトに bind する * @return boolean */ function next() { if (!$this->hasNext()) return false; /** @var object next data */ $id =& $this->_list[$this->_iterate ++]; if (!$id || !is_int($id)) return false; /** @var boolean result of load by id */ $result = $this->load($id); return true; } /** * オブジェクトのクローンを返す * @return object */ function & clone() { $classname = get_class($this); $clone = new $classname($this->_db); /** @var array properties */ $properties = $this->getPublicProperties(); foreach ($properties as $key) { $clone->$key = $this->$key; } $clone->_wheres = $this->_wheres; $clone->_order_by = $this->_order_by; $clone->_list = $this->_list; $clone->_iterate = $this->_iterate; return $clone; } /** * find の結果 * next() のポインタを先頭に戻す */ function resetList() { $this->_iterate = 0; } }