1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: | |
19: | |
20: |
|
21: | defined('XOOPS_ROOT_PATH') || exit('Restricted access');
|
22: |
|
23: | |
24: | |
25: | |
26: | |
27: | |
28: | |
29: |
|
30: | class CriteriaElement
|
31: | {
|
32: | |
33: | |
34: | |
35: | |
36: |
|
37: | public $order = 'ASC';
|
38: |
|
39: | |
40: | |
41: | |
42: |
|
43: | public $sort = '';
|
44: |
|
45: | |
46: | |
47: | |
48: | |
49: |
|
50: | public $limit = 0;
|
51: |
|
52: | |
53: | |
54: | |
55: | |
56: |
|
57: | public $start = 0;
|
58: |
|
59: | |
60: | |
61: | |
62: |
|
63: | public $groupby = '';
|
64: |
|
65: | |
66: | |
67: |
|
68: | public function __construct()
|
69: | {
|
70: | }
|
71: |
|
72: | |
73: | |
74: | |
75: |
|
76: | public function render()
|
77: | {
|
78: | }
|
79: |
|
80: | |
81: | |
82: | |
83: |
|
84: | public function setSort($sort)
|
85: | {
|
86: | $this->sort = $sort;
|
87: | }
|
88: |
|
89: | |
90: | |
91: | |
92: |
|
93: | public function getSort()
|
94: | {
|
95: | return $this->sort;
|
96: | }
|
97: |
|
98: | |
99: | |
100: | |
101: |
|
102: | public function setOrder($order)
|
103: | {
|
104: | if ('DESC' === strtoupper($order)) {
|
105: | $this->order = 'DESC';
|
106: | }
|
107: | }
|
108: |
|
109: | |
110: | |
111: | |
112: |
|
113: | public function getOrder()
|
114: | {
|
115: | return $this->order;
|
116: | }
|
117: |
|
118: | |
119: | |
120: | |
121: |
|
122: | public function setLimit($limit = 0)
|
123: | {
|
124: | $this->limit = (int)$limit;
|
125: | }
|
126: |
|
127: | |
128: | |
129: | |
130: |
|
131: | public function getLimit()
|
132: | {
|
133: | return $this->limit;
|
134: | }
|
135: |
|
136: | |
137: | |
138: | |
139: |
|
140: | public function setStart($start = 0)
|
141: | {
|
142: | $this->start = (int)$start;
|
143: | }
|
144: |
|
145: | |
146: | |
147: | |
148: |
|
149: | public function getStart()
|
150: | {
|
151: | return $this->start;
|
152: | }
|
153: |
|
154: | |
155: | |
156: | |
157: |
|
158: | public function setGroupBy($group)
|
159: | {
|
160: | $this->groupby = $group;
|
161: | }
|
162: |
|
163: | |
164: | |
165: | |
166: |
|
167: | public function getGroupby()
|
168: | {
|
169: | return $this->groupby ? " GROUP BY {$this->groupby}" : '';
|
170: | }
|
171: | |
172: | |
173: |
|
174: | }
|
175: |
|
176: | |
177: | |
178: | |
179: |
|
180: | class CriteriaCompo extends CriteriaElement
|
181: | {
|
182: | |
183: | |
184: | |
185: | |
186: |
|
187: | public $criteriaElements = array();
|
188: |
|
189: | |
190: | |
191: | |
192: | |
193: |
|
194: | public $conditions = array();
|
195: |
|
196: | |
197: | |
198: | |
199: | |
200: | |
201: |
|
202: | public function __construct(CriteriaElement $ele = null, $condition = 'AND')
|
203: | {
|
204: | if (isset($ele)) {
|
205: | $this->add($ele, $condition);
|
206: | }
|
207: | }
|
208: |
|
209: | |
210: | |
211: | |
212: | |
213: | |
214: | |
215: |
|
216: | public function &add(CriteriaElement $criteriaElement, $condition = 'AND')
|
217: | {
|
218: | if (is_object($criteriaElement)) {
|
219: | $this->criteriaElements[] =& $criteriaElement;
|
220: | $this->conditions[] = $condition;
|
221: | }
|
222: |
|
223: | return $this;
|
224: | }
|
225: |
|
226: | |
227: | |
228: | |
229: | |
230: |
|
231: | public function render()
|
232: | {
|
233: | $ret = '';
|
234: | $count = count($this->criteriaElements);
|
235: | if ($count > 0) {
|
236: | $render_string = $this->criteriaElements[0]->render();
|
237: | for ($i = 1; $i < $count; ++$i) {
|
238: | if (!$render = $this->criteriaElements[$i]->render()) {
|
239: | continue;
|
240: | }
|
241: | $render_string .= (empty($render_string) ? '' : ' ' . $this->conditions[$i] . ' ') . $render;
|
242: | }
|
243: | $ret = empty($render_string) ? '' : "({$render_string})";
|
244: | }
|
245: |
|
246: | return $ret;
|
247: | }
|
248: |
|
249: | |
250: | |
251: | |
252: | |
253: |
|
254: | public function renderWhere()
|
255: | {
|
256: | $ret = $this->render();
|
257: | $ret = ($ret != '') ? 'WHERE ' . $ret : $ret;
|
258: |
|
259: | return $ret;
|
260: | }
|
261: |
|
262: | |
263: | |
264: | |
265: | |
266: | |
267: |
|
268: | public function renderLdap()
|
269: | {
|
270: | $retval = '';
|
271: | $count = count($this->criteriaElements);
|
272: | if ($count > 0) {
|
273: | $retval = $this->criteriaElements[0]->renderLdap();
|
274: | for ($i = 1; $i < $count; ++$i) {
|
275: | $cond = strtoupper($this->conditions[$i]);
|
276: | $op = ($cond === 'OR') ? '|' : '&';
|
277: | $retval = "({$op}{$retval}" . $this->criteriaElements[$i]->renderLdap() . ')';
|
278: | }
|
279: | }
|
280: |
|
281: | return $retval;
|
282: | }
|
283: | }
|
284: |
|
285: | |
286: | |
287: | |
288: |
|
289: | class Criteria extends CriteriaElement
|
290: | {
|
291: | |
292: | |
293: | |
294: |
|
295: | public $prefix;
|
296: | public $function;
|
297: | public $column;
|
298: | public $operator;
|
299: | public $value;
|
300: |
|
301: | |
302: | |
303: | |
304: | |
305: | |
306: | |
307: | |
308: | |
309: |
|
310: | public function __construct($column, $value = '', $operator = '=', $prefix = '', $function = '')
|
311: | {
|
312: | $this->prefix = $prefix;
|
313: | $this->function = $function;
|
314: | $this->column = $column;
|
315: | $this->value = $value;
|
316: | $this->operator = $operator;
|
317: |
|
318: | |
319: | |
320: | |
321: | |
322: | |
323: | |
324: | |
325: | |
326: |
|
327: | if ((int) $column === 1 && (int) $value === 1 && $operator === '=') {
|
328: | $this->column = '';
|
329: | $this->value = '';
|
330: | }
|
331: | }
|
332: |
|
333: | |
334: | |
335: | |
336: | |
337: |
|
338: | public function render()
|
339: | {
|
340: | $backtick = (false === strpos($this->column, '.')) ? '`' : '';
|
341: | $backtick = (false !== strpos($this->column, '(')) ? '' : $backtick;
|
342: | $clause = (!empty($this->prefix) ? "{$this->prefix}." : '') . $backtick . $this->column . $backtick;
|
343: | if (!empty($this->function)) {
|
344: | $clause = sprintf($this->function, $clause);
|
345: | }
|
346: | if (in_array(strtoupper($this->operator), array('IS NULL', 'IS NOT NULL'))) {
|
347: | $clause .= ' ' . $this->operator;
|
348: | } else {
|
349: | if ('' === ($value = trim((string)$this->value))) {
|
350: | return '';
|
351: | }
|
352: | if (!in_array(strtoupper($this->operator), array('IN', 'NOT IN'))) {
|
353: | if ((substr($value, 0, 1) !== '`') && (substr($value, -1) !== '`')) {
|
354: | $value = "'{$value}'";
|
355: | } elseif (!preg_match('/^[a-zA-Z0-9_\.\-`]*$/', $value)) {
|
356: | $value = '``';
|
357: | }
|
358: | }
|
359: | $clause .= " {$this->operator} {$value}";
|
360: | }
|
361: |
|
362: | return $clause;
|
363: | }
|
364: |
|
365: | |
366: | |
367: | |
368: | |
369: | |
370: |
|
371: | public function renderLdap()
|
372: | {
|
373: | if ($this->operator === '>') {
|
374: | $this->operator = '>=';
|
375: | }
|
376: | if ($this->operator === '<') {
|
377: | $this->operator = '<=';
|
378: | }
|
379: |
|
380: | if ($this->operator === '!=' || $this->operator === '<>') {
|
381: | $operator = '=';
|
382: | $clause = '(!(' . $this->column . $operator . $this->value . '))';
|
383: | } else {
|
384: | if ($this->operator === 'IN') {
|
385: | $newvalue = str_replace(array('(', ')'), '', $this->value);
|
386: | $tab = explode(',', $newvalue);
|
387: | $clause = '';
|
388: | foreach ($tab as $uid) {
|
389: | $clause .= "({$this->column}={$uid})";
|
390: | }
|
391: | $clause = '(|' . $clause . ')';
|
392: | } else {
|
393: | $clause = '(' . $this->column . $this->operator . $this->value . ')';
|
394: | }
|
395: | }
|
396: |
|
397: | return $clause;
|
398: | }
|
399: |
|
400: | |
401: | |
402: | |
403: | |
404: |
|
405: | public function renderWhere()
|
406: | {
|
407: | $cond = $this->render();
|
408: |
|
409: | return empty($cond) ? '' : "WHERE {$cond}";
|
410: | }
|
411: | }
|
412: | |