- Timestamp:
- 2007/09/03 20:20:29 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/feature-module-update/data/class/SC_SelectSql.php
r15532 r15570 8 8 /* ---- SQL文を作るクラス ---- */ 9 9 class SC_SelectSql { 10 11 var $sql;12 13 var $select; 14 var $where;15 var $order;16 var $group;17 var $limit;18 var $offset;19 var $arrSql;20 var $arrVal;21 22 //-- コンストラクタ。23 function SC_SelectSql($array = "") {24 if (is_array($array)) {25 $this->arrSql = $array;26 }27 }28 29 //-- SQL分生成30 function getSql( $mode = "" ){31 $this->sql = $this->select ." ". $this->where ." ". $this->group ." ";32 33 // $mode == 1 は limit & offset無し 34 if ($mode == 2) {35 $this->sql .= $this->order;36 }elseif ( $mode != 1 ){37 $this->sql .= $this->order . " " .$this->limit ." ". $this->offset; 38 }39 40 return $this->sql; 41 }42 43 // 検索用44 function addSearchStr($val) {45 $return = sfManualEscape($val);46 $return = "%" .$return. "%";47 return $return;48 }49 50 //-- 範囲検索(○ ~ ○ まで)51 function selectRange($from, $to, $column) {52 53 // ある単位のみ検索($from = $to)54 if( $from == $to ) {55 $this->setWhere( $column ." = ?" );56 $return = array($from);57 // ~$toまで検索58 } elseif( strlen($from) == 0 && strlen($to) > 0 ) {59 $this->setWhere( $column ." <= ? "); 60 $return = array($to);61 // ~$from以上を検索62 } elseif( strlen($from) > 0 && strlen($to) == 0 ) {63 $this->setWhere( $column ." >= ? ");64 $return = array($from);65 // $from~$toの検索66 } else {67 $this->setWhere( $column ." BETWEEN ? AND ?" ); 68 $return = array($from, $to);69 }70 return $return;71 }72 73 //-- 期間検索(○年○月○日か~○年○月○日まで)74 function selectTermRange($from_year, $from_month, $from_day, $to_year, $to_month, $to_day, $column) {75 76 // FROM77 $date1 = $from_year . "/" . $from_month . "/" . $from_day;78 79 // TO80 $date2 = mktime (0, 0, 0, $to_month, $to_day, $to_year);81 $date2 = $date2 + 86400;82 // SQL文のdate関数に与えるフォーマットは、yyyy/mm/ddで指定する。83 $date2 = date('Y/m/d', $date2);84 85 // 開始期間だけ指定の場合86 if( ( $from_year != "" ) && ( $from_month != "" ) && ( $from_day != "" ) &&( $to_year == "" ) && ( $to_month == "" ) && ( $to_day == "" ) ) {87 $this->setWhere( $column ." >= '" . $date1 . "'");88 }89 90 // 開始〜終了91 if( ( $from_year != "" ) && ( $from_month != "" ) && ( $from_day != "" ) && 92 ( $to_year != "" ) && ( $to_month != "" ) && ( $to_day != "" ) ) {93 $this->setWhere( $column ." >= '" . $date1 ."' AND ". $column . " < date('" . $date2 . "')" );94 }95 96 // 終了期間だけ指定の場合97 if( ( $from_year == "" ) && ( $from_month == "" ) && ( $from_day == "" ) && ( $to_year != "" ) && ( $to_month != "" ) && ( $to_day != "" ) ) {98 $this->setWhere( $column ." < date('" . $date2 . "')");99 }100 return $return;101 } 102 103 // checkboxなどで同一カラム内で単一、もしくは複数選択肢が有る場合 例: AND ( sex = xxx OR sex = xxx OR sex = xxx ) AND ... 104 function setItemTerm( $arr, $ItemStr ) {105 106 foreach( $arr as $data ) {107 108 if( count( $arr ) > 1 ) {109 if( ! is_null( $data ) ) $item .= $ItemStr . " = ? OR "; 110 } else {111 if( ! is_null( $data ) ) $item = $ItemStr . " = ?"; 112 }113 $return[] = $data;114 }115 116 if( count( $arr ) > 1 ) $item = "( " . rtrim( $item, " OR " ) . " )";117 $this->setWhere( $item );118 return $return;119 }120 121 // NULL値が必要な場合122 function setItemTermWithNull( $arr, $ItemStr ) {123 124 $item = " ${ItemStr} IS NULL ";125 126 if ( $arr ){127 foreach( $arr as $data ) { 128 if ($data != "不明") {129 $item .= " OR ${ItemStr} = ?";130 $return[] = $data;131 }132 }133 }134 135 $item = "( ${item} ) ";136 $this->setWhere( $item );137 return $return;138 }139 // NULLもしくは''で検索する場合140 function setItemTermWithNullAndSpace( $arr, $ItemStr ) {141 $count = count($arr);142 $item = " ${ItemStr} IS NULL OR ${ItemStr} = '' ";143 $i = 1;144 if ( $arr ){145 foreach( $arr as $data ) { 146 if ($i == $count) break;147 $item .= " OR ${ItemStr} = ?"; 148 $return[] = $data;149 $i ++;150 }151 }152 $item = "( ${item} ) ";153 $this->setWhere( $item );154 return $return;155 }156 157 158 159 /* 複数のカラムでORで優先検索する場合 例: AND ( item_flag1 = xxx OR item_flag2 = xxx OR item_flag3 = xxx ) AND ... 160 161 配列の構造例162 if ( $_POST['show_site1'] ) $arrShowsite_1 = array( "column" => "show_site1",163 "value" => $_POST['show_site1'] );164 165 */166 function setWhereByOR( $arrWhere ){167 168 $count = count( $arrWhere );169 170 for( $i = 0; $i < $count; $i++ ) {171 172 if( isset( $arrWhere[$i]["value"] ) ) $statement .= $arrWhere[$i]["column"] ." = '" . addslashes( $arrWhere[$i]["value"] ) ."' OR " ;173 }174 175 $statement = "( " . rtrim( $statement, " OR " ) . " )";176 177 if( $this->where ) {178 179 $this->where .= " AND " . $statement;180 181 } else {182 183 $this->where = "WHERE " . $statement;184 }185 }186 187 function setWhere($where){188 if ($where != "") { 189 if( $this->where ) {190 191 $this->where .= " AND " . $where;192 193 } else {194 195 $this->where = "WHERE " . $where;196 }197 }198 }199 200 function setOrder($order){201 202 $this->order = "ORDER BY " . $order;203 204 }205 206 function setGroup( $group ) {207 208 $this->group = "GROUP BY " . $group;209 210 }211 212 213 function setLimitOffset( $limit, $offset ){214 215 if ( is_numeric($limit) and is_numeric($offset) ){216 217 $this->limit = " LIMIT " .$limit;218 $this->offset = " OFFSET " .$offset;219 } 220 }221 222 function clearSql(){223 $this->select = "";224 $this->where = "";225 $this->group = "";226 $this->order = "";227 $this->limit = "";228 $this->offset = "";229 }230 231 function setSelect($sql) {232 $this->select = $sql;233 }10 11 var $sql; 12 13 var $select; 14 var $where; 15 var $order; 16 var $group; 17 var $limit; 18 var $offset; 19 var $arrSql; 20 var $arrVal; 21 22 //-- コンストラクタ。 23 function SC_SelectSql($array = "") { 24 if (is_array($array)) { 25 $this->arrSql = $array; 26 } 27 } 28 29 //-- SQL分生成 30 function getSql( $mode = "" ){ 31 $this->sql = $this->select ." ". $this->where ." ". $this->group ." "; 32 33 // $mode == 1 は limit & offset無し 34 if ($mode == 2) { 35 $this->sql .= $this->order; 36 }elseif ( $mode != 1 ){ 37 $this->sql .= $this->order . " " .$this->limit ." ". $this->offset; 38 } 39 40 return $this->sql; 41 } 42 43 // 検索用 44 function addSearchStr($val) { 45 $return = sfManualEscape($val); 46 $return = "%" .$return. "%"; 47 return $return; 48 } 49 50 //-- 範囲検索(○ ~ ○ まで) 51 function selectRange($from, $to, $column) { 52 53 // ある単位のみ検索($from = $to) 54 if( $from == $to ) { 55 $this->setWhere( $column ." = ?" ); 56 $return = array($from); 57 // ~$toまで検索 58 } elseif( strlen($from) == 0 && strlen($to) > 0 ) { 59 $this->setWhere( $column ." <= ? "); 60 $return = array($to); 61 // ~$from以上を検索 62 } elseif( strlen($from) > 0 && strlen($to) == 0 ) { 63 $this->setWhere( $column ." >= ? "); 64 $return = array($from); 65 // $from~$toの検索 66 } else { 67 $this->setWhere( $column ." BETWEEN ? AND ?" ); 68 $return = array($from, $to); 69 } 70 return $return; 71 } 72 73 //-- 期間検索(○年○月○日か~○年○月○日まで) 74 function selectTermRange($from_year, $from_month, $from_day, $to_year, $to_month, $to_day, $column) { 75 76 // FROM 77 $date1 = $from_year . "/" . $from_month . "/" . $from_day; 78 79 // TO 80 $date2 = mktime (0, 0, 0, $to_month, $to_day, $to_year); 81 $date2 = $date2 + 86400; 82 // SQL文のdate関数に与えるフォーマットは、yyyy/mm/ddで指定する。 83 $date2 = date('Y/m/d', $date2); 84 85 // 開始期間だけ指定の場合 86 if( ( $from_year != "" ) && ( $from_month != "" ) && ( $from_day != "" ) && ( $to_year == "" ) && ( $to_month == "" ) && ( $to_day == "" ) ) { 87 $this->setWhere( $column ." >= '" . $date1 . "'"); 88 } 89 90 // 開始〜終了 91 if( ( $from_year != "" ) && ( $from_month != "" ) && ( $from_day != "" ) && 92 ( $to_year != "" ) && ( $to_month != "" ) && ( $to_day != "" ) ) { 93 $this->setWhere( $column ." >= '" . $date1 ."' AND ". $column . " < date('" . $date2 . "')" ); 94 } 95 96 // 終了期間だけ指定の場合 97 if( ( $from_year == "" ) && ( $from_month == "" ) && ( $from_day == "" ) && ( $to_year != "" ) && ( $to_month != "" ) && ( $to_day != "" ) ) { 98 $this->setWhere( $column ." < date('" . $date2 . "')"); 99 } 100 return $return; 101 } 102 103 // checkboxなどで同一カラム内で単一、もしくは複数選択肢が有る場合 例: AND ( sex = xxx OR sex = xxx OR sex = xxx ) AND ... 104 function setItemTerm( $arr, $ItemStr ) { 105 106 foreach( $arr as $data ) { 107 108 if( count( $arr ) > 1 ) { 109 if( ! is_null( $data ) ) $item .= $ItemStr . " = ? OR "; 110 } else { 111 if( ! is_null( $data ) ) $item = $ItemStr . " = ?"; 112 } 113 $return[] = $data; 114 } 115 116 if( count( $arr ) > 1 ) $item = "( " . rtrim( $item, " OR " ) . " )"; 117 $this->setWhere( $item ); 118 return $return; 119 } 120 121 // NULL値が必要な場合 122 function setItemTermWithNull( $arr, $ItemStr ) { 123 124 $item = " ${ItemStr} IS NULL "; 125 126 if ( $arr ){ 127 foreach( $arr as $data ) { 128 if ($data != "不明") { 129 $item .= " OR ${ItemStr} = ?"; 130 $return[] = $data; 131 } 132 } 133 } 134 135 $item = "( ${item} ) "; 136 $this->setWhere( $item ); 137 return $return; 138 } 139 // NULLもしくは''で検索する場合 140 function setItemTermWithNullAndSpace( $arr, $ItemStr ) { 141 $count = count($arr); 142 $item = " ${ItemStr} IS NULL OR ${ItemStr} = '' "; 143 $i = 1; 144 if ( $arr ){ 145 foreach( $arr as $data ) { 146 if ($i == $count) break; 147 $item .= " OR ${ItemStr} = ?"; 148 $return[] = $data; 149 $i ++; 150 } 151 } 152 $item = "( ${item} ) "; 153 $this->setWhere( $item ); 154 return $return; 155 } 156 157 158 159 /* 複数のカラムでORで優先検索する場合 例: AND ( item_flag1 = xxx OR item_flag2 = xxx OR item_flag3 = xxx ) AND ... 160 161 配列の構造例 162 if ( $_POST['show_site1'] ) $arrShowsite_1 = array( "column" => "show_site1", 163 "value" => $_POST['show_site1'] ); 164 165 */ 166 function setWhereByOR( $arrWhere ){ 167 168 $count = count( $arrWhere ); 169 170 for( $i = 0; $i < $count; $i++ ) { 171 172 if( isset( $arrWhere[$i]["value"] ) ) $statement .= $arrWhere[$i]["column"] ." = '" . addslashes( $arrWhere[$i]["value"] ) ."' OR " ; 173 } 174 175 $statement = "( " . rtrim( $statement, " OR " ) . " )"; 176 177 if( $this->where ) { 178 179 $this->where .= " AND " . $statement; 180 181 } else { 182 183 $this->where = "WHERE " . $statement; 184 } 185 } 186 187 function setWhere($where){ 188 if ($where != "") { 189 if( $this->where ) { 190 191 $this->where .= " AND " . $where; 192 193 } else { 194 195 $this->where = "WHERE " . $where; 196 } 197 } 198 } 199 200 function setOrder($order){ 201 202 $this->order = "ORDER BY " . $order; 203 204 } 205 206 function setGroup( $group ) { 207 208 $this->group = "GROUP BY " . $group; 209 210 } 211 212 213 function setLimitOffset( $limit, $offset ){ 214 215 if ( is_numeric($limit) and is_numeric($offset) ){ 216 217 $this->limit = " LIMIT " .$limit; 218 $this->offset = " OFFSET " .$offset; 219 } 220 } 221 222 function clearSql(){ 223 $this->select = ""; 224 $this->where = ""; 225 $this->group = ""; 226 $this->order = ""; 227 $this->limit = ""; 228 $this->offset = ""; 229 } 230 231 function setSelect($sql) { 232 $this->select = $sql; 233 } 234 234 } 235 235 ?>
Note: See TracChangeset
for help on using the changeset viewer.
