1: <?php
2: /*****************************************************************************************
3: * X2Engine Open Source Edition is a customer relationship management program developed by
4: * X2Engine, Inc. Copyright (C) 2011-2016 X2Engine Inc.
5: *
6: * This program is free software; you can redistribute it and/or modify it under
7: * the terms of the GNU Affero General Public License version 3 as published by the
8: * Free Software Foundation with the addition of the following permission added
9: * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10: * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
11: * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12: *
13: * This program is distributed in the hope that it will be useful, but WITHOUT
14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15: * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
16: * details.
17: *
18: * You should have received a copy of the GNU Affero General Public License along with
19: * this program; if not, see http://www.gnu.org/licenses or write to the Free
20: * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21: * 02110-1301 USA.
22: *
23: * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
24: * California 95067, USA. or at email address contact@x2engine.com.
25: *
26: * The interactive user interfaces in modified source and object code versions
27: * of this program must display Appropriate Legal Notices, as required under
28: * Section 5 of the GNU Affero General Public License version 3.
29: *
30: * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31: * these Appropriate Legal Notices must retain the display of the "Powered by
32: * X2Engine" logo. If the display of the logo is not reasonably feasible for
33: * technical reasons, the Appropriate Legal Notices must display the words
34: * "Powered by X2Engine".
35: *****************************************************************************************/
36:
37: /**
38: * Utility class for simplifying generation SQL parameters
39: */
40: class QueryParamGenerator extends CComponent {
41:
42: /**
43: * Number of parameters bound
44: */
45: private $count = 0;
46:
47: /**
48: * Parameter namespace
49: */
50: private $prefix = ':QueryParamGenerator';
51:
52: /**
53: * Bound parameters
54: */
55: private $params = array ();
56:
57: /**
58: * @param string $prefix parameter prefix which should be used to prevent parameter name
59: * collisions
60: */
61: public function __construct ($prefix=':QueryParamGenerator') {
62: $this->prefix = $prefix;
63: }
64:
65: /**
66: * Binds and array of parameters, optionally generating a string representation of the array
67: * which can be embedded into a SQL in statement
68: */
69: public function bindArray (array $values, $createInStmt=false) {
70: if ($createInStmt) {
71: $inStmt = '(';
72: }
73: foreach ($values as $val) {
74: $currParam = $this->prefix.++$this->count;
75: $this->params[$currParam] = $val;
76: if ($createInStmt) {
77: if ($inStmt !== '(') {
78: $inStmt .= ',';
79: }
80: $inStmt.=$currParam;
81: }
82: }
83: if ($createInStmt) {
84: $inStmt .= ')';
85: return $inStmt;
86: }
87: }
88:
89: /**
90: * Bind a value to a parameter name
91: * @return string the generated parameter name
92: */
93: public function nextParam ($val) {
94: $currParam = $this->prefix.++$this->count;
95: $this->params[$currParam] = $val;
96: return $currParam;
97: }
98:
99: /**
100: * @return string the name of the most recently generated parameter
101: */
102: public function currParam () {
103: return $this->prefix.$this->count;
104: }
105:
106: public function setParam ($val) {
107: $this->params[$this->currParam ()] = $val;
108: }
109:
110: /**
111: * @return array all generated parameters (bound values indexed by parameter names)
112: */
113: public function getParams () {
114: return $this->params;
115: }
116:
117: /**
118: * Merge the internal parameters array with an arbitrary number of other parameters arrays
119: * @param {...array}
120: * @throws CException if parameter name collision occurs
121: */
122: public function mergeParams () {
123: $arguments = func_get_args ();
124: foreach ($arguments as $params) {
125: if (count (array_intersect (array_keys ($params), $this->params))) {
126: throw new CException ('parameter name collision');
127: }
128: $this->params = array_merge ($this->params, $params);
129: }
130: return $this;
131: }
132: }
133: