list_dao

Last-modified: 2014-12-01 (月) 16:12:23
<?php
/**
 *-----------------------------------------------------------------------------
 *  list DAO class
 *-----------------------------------------------------------------------------
 * 2014-09-01 initial version by ushizawa
 *
 * 一覧を扱うDAO
 */
class list_dao extends DAO {
	var $tablename = "";
	var $idname = "";
	var $where_arr = array();
	var $pageing_str = "";

	/**
	 * (non-PHPdoc)
	 * @see DAO::search_query()
	 * search_queryのオーバーライド。不適切なSQLだったら、SQL文を表示して終了。
	 */
	function search_query($sql){
	//echoblue($sql);
		$con = parent::search_query($sql);
		//echored($sql);
		if(empty($con->mtst)) {
			echo mysql_errno($con->dbid) . ": " . mysql_error($con->dbid) . "<br /><br />" . $sql ."<br />";
			exit;
		}
		return $con;
	}


	/**
	 * 一覧を取得する
	 * @param string $cols
	 * @param string $tablename
	 * @param array $where_arr
	 * @param int $limit
	 * @return array
	 * ☆★$tablename JOIN等で参照しているばあい、hasFieldでは判定できない!
	 * 削除フラグ=0のなどの指定が必要な場合、別途指定の必要がある。
	 */
	function getList($cols, $tablename, $where_str="", $order_str="", $limit=30) {

		// SQL
		$sql = "SELECT * FROM (SELECT ". $cols ." FROM " . $tablename.")t" ;

		///////////////////////////////////////////////
		// WHERE
		///////////////////////////////////////////////
		// POSTされた検索値をセット!!
		$this->setSearchWhere($tablename);

		if(!empty($this->where_arr)){
			if(empty($where_str)){
				$where_str .= implode(" AND ", $this->where_arr);
			} else {
				$where_str .= " AND ".implode(" AND ", $this->where_arr);
			}
		}
		if(!empty($where_str)){
			$sql .= " WHERE ".$where_str;
		}

		///////////////////////////////////////////////
		// 全件数を取得する
		///////////////////////////////////////////////
		$total_rec = parent::query($sql);

		///////////////////////////////////////////////
		// 並び
		///////////////////////////////////////////////
		if(!empty($order_str)) $sql .= " ORDER BY ".$order_str;

		///////////////////////////////////////////////
		// LIMIT
		///////////////////////////////////////////////
		if(!empty($_REQUEST['c_page']))	{
			$current_page = $_REQUEST['c_page'];
			$offset = ($current_page-1) * $limit;

		} else {
			$current_page = 1;
			$offset = 0;
		}
		$sql .= " LIMIT ".$offset.",".$limit;

		///////////////////////////////////////////////
		// ページ情報・ページングHTMLタグをセット
		///////////////////////////////////////////////
		$this->page_str = $this->_createPaging($total_rec, $limit);
		$this->page_str .= "<span class=red>" . number_format($total_rec) . "件</span> 該当しました。\n";	// 件数
		$this->page_str .= $current_page . "/" . ceil($total_rec/$limit) . "ページ";

		///////////////////////////////////////////////
		// 結果を取得する
		///////////////////////////////////////////////
		$con = $this->search_query($sql);
		$result = array();
		for ($i = 0; $i < $con->numrows(); $i++) {
			$result[] = $con->fetch();
		}
		return $result;
	}


	/**
	 * 検索条件をセットする
	 * @param array $postdata
	 */
	function setSearchWhere($tablename) {

		if(empty($_POST)) return ;

		// テーブルのカラムを取得
	//	$fields = parent::getFields($tablename);

		foreach($_POST as $key=>$val){
			if(substr($key,0,7)=="search_"){
				if($key=="search_limit") continue;

				// キー名
				$tmp_key = str_replace("search_", "", $key);
				// カラムにない項目だったらスルー
			//	if(!array_key_exists($tmp_key, $fields)) continue;

				if(!empty($val)){
					// 検索値が配列のばあい!!
					//if(is_array($postdata[$key])){
					if(is_array($val)){
						$tmp_array = array();
						foreach($val as $v){
							$tmp_array[] = $tmp_key. " like '%".mb_convert_encoding($v, "EUC-JP", "UTF-8")."%'";
						}
						$this->where_arr[] = "(".implode(" OR ", $tmp_array).")";

					} else if(strcasecmp($val, "")!=0){
						$this->where_arr[] = $tmp_key . " like '%".mb_convert_encoding($val, "EUC-JP", "UTF-8")."%'";
					}
				}
			}//
		}
	}


	/**
	 * 一覧の検索ボタンを返す
	 * @return string $tag
	 */
	function getSearchBtn() {

		$tag = "<input type=\"submit\" value=\"この条件で検索する\">&nbsp;&nbsp;\n".
		       "<input type=\"button\" value=\"条件をクリア\" onClick=\"setReset(this.form);return false;\">\n";

		return $tag;
	}

	/**
	 * 一覧のCSVボタンを返す
	 * @param $frm_name
	 * @return string $tag
	 */
	function getCsvBtn($frm_name="") {
		if(empty($frm_name)) $frm_name = "frm";

		$js = "$('export_flg').value=1; ";
		$js .= "if($('back_flg')) $('back_flg').value=1; document.{$frm_name}.submit(); ";
		$js .= "$('export_flg').value='';";

		$tag = "<div><input type=\"hidden\" name=\"export_flg\" id=\"export_flg\">\n".
			   "<input type=\"button\" value=\"csvダウンロード\" onClick=\"{$js}\"></div>\n";

		return $tag;
	}



	/**
	 * ページングの作成
	 * $current_page	現在のページ
	 * $total_rec	総レコード数
	 * $limit		1ページに表示するレコード
	 */
	function _createPaging($total_rec, $limit=10) {
		$pager = "";

		$current_page = (!empty($_REQUEST['c_page'])) ? $_REQUEST['c_page'] : 1;
		$start = ($current_page - 1) * $limit;
		$end = $start + $limit;
		//echored($total_rec."--".$limit);
		$total_page = ceil($total_rec / $limit); //総ページ数
		$show_nav = 5;  	//表示するナビゲーションの数

		//全てのページ数が表示するページ数より小さい場合、総ページを表示する数にする
		if ($total_page < $show_nav) {
			$show_nav = $total_page;
		}

		//トータルページ数が2以下か、現在のページが総ページより大きい場合表示しない
		if ($total_page <= 1 || $total_page < $current_page ) return $pager;

		//総ページの半分
		$show_navh = floor($show_nav / 2);
		//現在のページをナビゲーションの中心にする
		$loop_start = $current_page - $show_navh;
		$loop_end = $current_page + $show_navh;
		//現在のページが両端だったら端にくるようにする
		if ($loop_start <= 0) {
			$loop_start  = 1;
			$loop_end = $show_nav;
		}
		if ($loop_end > $total_page) {
			$loop_start  = $total_page - $show_nav +1;
			$loop_end =  $total_page;
		}




※ これ以下エラーになるので貼付けられなかった