implicit conversion of array to boolean.
1 | <?php |
||
2 | |||
3 | namespace Elgg\SystemLog; |
||
4 | |||
5 | use Doctrine\DBAL\Query\Expression\CompositeExpression; |
||
6 | use Elgg\Database\QueryBuilder; |
||
7 | use Elgg\Database\Repository; |
||
8 | use Elgg\Database\Select; |
||
9 | use Elgg\Values; |
||
10 | |||
11 | /** |
||
12 | * System Log database table query |
||
13 | */ |
||
14 | class SystemLogQuery extends Repository { |
||
15 | |||
16 | /** |
||
17 | * @var int[] |
||
18 | */ |
||
19 | public $id; |
||
20 | |||
21 | /** |
||
22 | * @var int[] |
||
23 | */ |
||
24 | public $object_id; |
||
25 | |||
26 | /** |
||
27 | * @var string[] |
||
28 | */ |
||
29 | public $object_class; |
||
30 | |||
31 | /** |
||
32 | * @var string[] |
||
33 | */ |
||
34 | public $object_type; |
||
35 | |||
36 | /** |
||
37 | * @var string[] |
||
38 | */ |
||
39 | public $object_subtype; |
||
40 | |||
41 | /** |
||
42 | * @var string[] |
||
43 | */ |
||
44 | public $event; |
||
45 | |||
46 | /** |
||
47 | * @var int[] |
||
48 | */ |
||
49 | public $performed_by_guid; |
||
50 | |||
51 | /** |
||
52 | * @var int[] |
||
53 | */ |
||
54 | public $owner_guid; |
||
55 | /** |
||
56 | * @var int[] |
||
57 | */ |
||
58 | public $access_id; |
||
59 | /** |
||
60 | * @var string |
||
61 | */ |
||
62 | public $enabled; |
||
63 | /** |
||
64 | * @var int|string|\DateTime |
||
65 | */ |
||
66 | public $created_after; |
||
67 | |||
68 | /** |
||
69 | * @var int|string|\DateTime |
||
70 | */ |
||
71 | public $created_before; |
||
72 | |||
73 | /** |
||
74 | * @var string[] |
||
75 | */ |
||
76 | public $ip_address; |
||
77 | |||
78 | /** |
||
79 | * @var int |
||
80 | */ |
||
81 | public $limit; |
||
82 | |||
83 | /** |
||
84 | * @var int |
||
85 | */ |
||
86 | public $offset; |
||
87 | |||
88 | /** |
||
89 | * Count rows |
||
90 | * @return int |
||
91 | */ |
||
92 | 1 | public function count() { |
|
93 | 1 | $this->normalizeOptions(); |
|
94 | |||
95 | 1 | $qb = Select::fromTable('system_log'); |
|
96 | 1 | $qb->select('COUNT(*) as total'); |
|
97 | 1 | $wheres = $this->buildQuery($qb); |
|
98 | 1 | if ($wheres) { |
|
99 | 1 | $qb->where($wheres); |
|
100 | } |
||
101 | |||
102 | 1 | $result = _elgg_services()->db->getDataRow($qb); |
|
103 | 1 | if (!$result) { |
|
0 ignored issues
–
show
|
|||
104 | return 0; |
||
105 | } |
||
106 | |||
107 | 1 | return (int) $result->total; |
|
108 | } |
||
109 | |||
110 | /** |
||
111 | * Apply numeric calculation to a column |
||
112 | * |
||
113 | * @param string $function Calculation, e.g. max, min, avg |
||
114 | * @param string $property Property name |
||
115 | * @param string $property_type Property type |
||
116 | * |
||
117 | * @return int|float |
||
118 | */ |
||
119 | public function calculate($function, $property, $property_type = null) { |
||
120 | throw new \LogicException(__METHOD__ . ' not implemented'); |
||
121 | } |
||
122 | |||
123 | /** |
||
124 | * Fetch rows |
||
125 | * |
||
126 | * @param int $limit Number of rows to fetch |
||
127 | * @param int $offset Index of the first row |
||
128 | * @param callable|false $callback Callback function to run database rows through |
||
129 | * |
||
130 | * @return \ElggData[]|false |
||
131 | */ |
||
132 | 2 | public function get($limit = null, $offset = null, $callback = null) { |
|
133 | |||
134 | 2 | $this->normalizeOptions(); |
|
135 | |||
136 | 2 | $qb = Select::fromTable('system_log'); |
|
137 | 2 | $qb->select('*'); |
|
138 | 2 | $wheres = $this->buildQuery($qb); |
|
139 | 2 | if ($wheres) { |
|
140 | 1 | $qb->where($wheres); |
|
141 | } |
||
142 | |||
143 | 2 | if ($limit) { |
|
144 | $qb->setMaxResults($limit); |
||
145 | $qb->setFirstResult($offset); |
||
146 | } |
||
147 | |||
148 | 2 | $qb->orderBy('time_created', 'DESC'); |
|
149 | |||
150 | 2 | return _elgg_services()->db->getData($qb); |
|
151 | } |
||
152 | |||
153 | /** |
||
154 | * Apply correct execution method based on calculation, count or other criteria |
||
155 | * @return mixed |
||
156 | */ |
||
157 | 2 | public function execute() { |
|
158 | |||
159 | 2 | if ($this->count) { |
|
160 | 1 | return $this->count(); |
|
161 | } |
||
162 | |||
163 | 2 | return $this->get($this->limit, $this->offset); |
|
164 | } |
||
165 | |||
166 | /** |
||
167 | * Normalizes options |
||
168 | * @return void |
||
169 | */ |
||
170 | 2 | protected function normalizeOptions() { |
|
171 | $defaults = [ |
||
172 | 2 | 'limit' => elgg_get_config('default_limit'), |
|
173 | 2 | 'offset' => 0, |
|
174 | ]; |
||
175 | |||
176 | 2 | foreach ($defaults as $key => $value) { |
|
177 | 2 | if (!isset($this->$key)) { |
|
178 | 2 | $this->$key = $value; |
|
179 | } |
||
180 | } |
||
181 | |||
182 | 2 | $this->performed_by_guid = Values::normalizeGuids($this->performed_by_guid); |
|
183 | 2 | $this->owner_guid = Values::normalizeGuids($this->owner_guid); |
|
184 | 2 | $this->object_id = Values::normalizeIds($this->object_id); |
|
185 | 2 | $this->access_id = Values::normalizeIds($this->access_id); |
|
186 | 2 | $this->created_after = Values::normalizeTimestamp($this->created_after); |
|
187 | 2 | $this->created_before = Values::normalizeTimestamp($this->created_before); |
|
188 | 2 | } |
|
189 | |||
190 | /** |
||
191 | * Build where clauses |
||
192 | * |
||
193 | * @param QueryBuilder $qb Query builder |
||
194 | * @return CompositeExpression |
||
195 | */ |
||
196 | 2 | protected function buildQuery(QueryBuilder $qb) { |
|
197 | |||
198 | 2 | $wheres = []; |
|
199 | |||
200 | 2 | $wheres[] = $qb->compare('performed_by_guid', '=', $this->performed_by_guid, ELGG_VALUE_INTEGER); |
|
201 | 2 | $wheres[] = $qb->compare('event', '=', $this->event, ELGG_VALUE_STRING); |
|
202 | 2 | $wheres[] = $qb->compare('object_id', '=', $this->object_id, ELGG_VALUE_INTEGER); |
|
203 | 2 | $wheres[] = $qb->compare('object_class', '=', $this->object_class, ELGG_VALUE_STRING); |
|
204 | 2 | $wheres[] = $qb->compare('object_type', '=', $this->object_type, ELGG_VALUE_STRING); |
|
205 | 2 | $wheres[] = $qb->compare('object_subtype', '=', $this->object_subtype, ELGG_VALUE_STRING); |
|
206 | 2 | $wheres[] = $qb->compare('ip_address', '=', $this->ip_address, ELGG_VALUE_STRING); |
|
207 | 2 | $wheres[] = $qb->compare('owner_guid', '=', $this->owner_guid, ELGG_VALUE_INTEGER); |
|
208 | 2 | $wheres[] = $qb->compare('access_id', '=', $this->access_id, ELGG_VALUE_INTEGER); |
|
209 | 2 | $wheres[] = $qb->compare('enabled', '=', $this->enabled, ELGG_VALUE_STRING); |
|
210 | 2 | $wheres[] = $qb->between('time_created', $this->created_after, $this->created_before, ELGG_VALUE_INTEGER); |
|
211 | |||
212 | 2 | return $qb->merge($wheres); |
|
213 | } |
||
214 | } |
||
215 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.