PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 1.1.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v1.1.1
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / Core / Database / Model.php

Model.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 1.1.1, at includes/Core/Database/Model.php

460 lines 15.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Provides Base Model Class
5 */
6
7 namespace BitCode\BitForm\Core\Database;
8
9 /**
10 * Undocumented class
11 */
12
13 use WP_Error;
14
15 class Model
16 {
17 protected static $table;
18 protected static $primary_key;
19 protected $app_db;
20 protected $table_name;
21 protected $db_response;
22 /**
23 * Undocumented function
24 */
25 public function __construct()
26 {
27 global $wpdb;
28 $this->app_db = $wpdb;
29 $this->table_name = $wpdb->prefix . static::$table;
30 }
31 /**
32 * Undocumented function
33 *
34 * @return void
35 */
36 public function insert($data = array())
37 {
38 if (is_null($data)) {
39 return new WP_Error('empty_data', __('Form data is empty', 'bitform'));
40 }
41 $result = $this->app_db->insert(
42 $this->table_name,
43 $data
44 );
45 return $this->getResult($result);
46 }
47 /**
48 * Undocumented function
49 *
50 * @param string $item
51 * @param array $condition
52 *
53 * @return void
54 */
55 public function get($item = "*", $condition = [], $limit = null, $offset = null, $order_by = null, $order_follow = null)
56 {
57 if (\is_array($item)) {
58 $column_to_select = implode(",", $item);
59 } else {
60 $column_to_select = $item;
61 }
62 $checkCondition = $this->checkCondition($condition);
63 if (is_wp_error($checkCondition)) {
64 return $checkCondition;
65 }
66 $order = null;
67 if (!\is_null($order_by)) {
68 $order_follow = \is_null($order_follow) ? 'ASC' : $order_follow;
69 $order .= " ORDER BY $order_by $order_follow";
70 }
71 $paginate = null;
72 if (!\is_null($limit)) {
73 $limit = \intval($limit);
74 $paginate .= " LIMIT $limit ";
75 }
76 if (!\is_null($offset)) {
77 $offset = \intval($offset);
78 $paginate .= " OFFSET $offset ";
79 }
80 if (empty($condition)) {
81 $sql = "SELECT $column_to_select FROM `$this->table_name` $order $paginate";
82 $all_values = null;
83 } else {
84 $formatted_conditions = $this->getFormatedCondition($condition);
85 if ($formatted_conditions) {
86 $condition_to_check = $formatted_conditions['conditions'];
87 $all_values = $formatted_conditions['values'];
88 } else {
89 $condition_to_check = null;
90 $all_values = null;
91 }
92 $sql = "SELECT $column_to_select FROM `$this->table_name`"
93 . $condition_to_check . $order . $paginate;
94 }
95 // var_dump($sql);
96 return $this->execute($sql, $all_values)->getResult();
97 }
98 /**
99 * Undocumented function
100 *
101 * @param string $item
102 * @param array $condition
103 *
104 * @return void
105 */
106 public function count($condition = null)
107 {
108 $checkCondition = $this->checkCondition($condition);
109 if (is_wp_error($checkCondition)) {
110 return $checkCondition;
111 }
112 if (empty($condition)) {
113 $result = $this->app_db->query(
114 "SELECT COUNT(*) FROM `$this->table_name`"
115 );
116 } else {
117 $formatted_conditions = $this->getFormatedCondition($condition);
118 if ($formatted_conditions) {
119 $condition_to_check = $formatted_conditions['conditions'];
120 $all_values = $formatted_conditions['values'];
121 } else {
122 $condition_to_check = null;
123 $all_values = null;
124 }
125 $result = $this->app_db->query(
126 $this->app_db->prepare(
127 "SELECT COUNT(*) as count FROM `$this->table_name`"
128 . $condition_to_check,
129 $all_values
130 )
131 );
132 }
133 if (!$result) {
134 if ($this->app_db->last_error) {
135 return new WP_Error('db_error', $this->app_db->last_error);
136 }
137 return new WP_Error('db_error', __("Result is empty", "bitform"));
138 } else {
139 return $this->app_db->last_result;
140 }
141 }
142 /**
143 * Undocumented function
144 *
145 * @param array $data_to_update
146 * @param array $condition
147 *
148 * @return void
149 */
150 public function update(array $data, array $condition)
151 {
152 if (
153 !\is_null($data)
154 && \is_array($data)
155 && array_keys($data) !== range(0, count($data) - 1)
156 ) {
157 $data_to_update = $data;
158 } else {
159 return new WP_Error(
160 'update_error',
161 __('Nothing to update', 'bitform')
162 );
163 }
164 $update_condition = (!\is_null($condition) &&
165 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
166 $result = $this->app_db->update(
167 $this->table_name,
168 $data_to_update,
169 $update_condition
170 );
171 return $this->getResult($result);
172 }
173 /**
174 * Undocumented function
175 *
176 * @param array $data_to_update
177 * @param array $condition
178 *
179 * @return void
180 */
181 public function bulkUpdate(array $data = null, array $condition = null)
182 {
183 if (
184 !\is_null($data)
185 && \is_array($data)
186 && array_keys($data) !== range(0, count($data) - 1)
187 ) {
188 $data_to_update = $data;
189 } else {
190 return new WP_Error(
191 'update_error',
192 __('Nothing to update', 'bitform')
193 );
194 }
195
196 $update_fields = '';
197 $all_values = array();
198 $index_checker = 0;
199 $data_count = count($data_to_update) - 1;
200 foreach ($data_to_update as $field_name => $field_value) {
201 $update_fields .= $field_name . ' = ' . $this->getFieldFormat($field_value);
202 if ($index_checker < $data_count) {
203 $update_fields .= ',';
204 }
205 $index_checker = $index_checker + 1;
206 $all_values[] = $field_value;
207 }
208 $update_condition = (!\is_null($condition) &&
209 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
210 $formatted_conditions = $this->getFormatedCondition($update_condition);
211 if ($formatted_conditions) {
212 $condition_to_check = $formatted_conditions['conditions'];
213 $all_values = array_merge($all_values, $formatted_conditions['values']);
214 } else {
215 $condition_to_check = null;
216 }
217 $result = $this->app_db->query(
218 $this->app_db->prepare(
219 "UPDATE $this->table_name SET $update_fields $condition_to_check",
220 $all_values
221 )
222 );
223 return $this->getResult($result);
224 }
225 /**
226 * Duplicate's row
227 *
228 * @param array $data_to_update
229 * @param array $condition
230 *
231 * @return void
232 */
233 public function duplicate(array $columns, array $duplicate, array $condition)
234 {
235 if (!(!\is_null($columns)
236 && \is_array($columns)
237 && array_keys($columns) === range(0, count($columns) - 1)
238 && !\is_null($duplicate)
239 && \is_array($duplicate)
240 && array_keys($duplicate) === range(0, count($duplicate) - 1))) {
241 return new WP_Error(
242 'duplicate_error',
243 __('Nothing to duplicate', 'bitform')
244 );
245 }
246
247 $dupCol = '';
248 $insCol = \implode(',', $columns);
249 $all_values = array();
250 $data_count = count($duplicate) - 1;
251 foreach ($duplicate as $dupKey => $dupColName) {
252 if (in_array($dupColName, $columns)) {
253 $dupCol .= $dupColName;
254 } else {
255 $dupCol .= $this->getFieldFormat($dupColName);
256 $all_values[] = $dupColName;
257 }
258 if ($dupKey < $data_count) {
259 $dupCol .= ',';
260 }
261 }
262 $condition_to_check = null;
263 $update_condition = (!\is_null($condition) &&
264 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
265 $formatted_conditions = $this->getFormatedCondition($update_condition);
266 if ($formatted_conditions) {
267 $condition_to_check = $formatted_conditions['conditions'];
268 $all_values = array_merge($all_values, $formatted_conditions['values']);
269 }
270 $query = "INSERT INTO $this->table_name ($insCol)
271 SELECT $dupCol FROM $this->table_name $condition_to_check";
272 $this->execute($query, $all_values);
273 return $this->getResult($result);
274 }
275 public function trash(array $condition = null)
276 {
277 if (
278 !\is_null($condition)
279 && \is_array($condition)
280 && array_keys($condition) !== range(0, count($condition) - 1)
281 ) {
282 $delete_condition = $condition;
283 } else {
284 return new WP_Error(
285 'deletion_error',
286 __('At least 1 condition needed', 'bitform')
287 );
288 }
289 $update_condition = (!\is_null($condition) &&
290 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
291 $result = $this->app_db->update(
292 $this->table_name,
293 $data_to_update,
294 $update_condition
295 );
296 return $this->getResult($result);
297 }
298 public function delete(array $condition = null)
299 {
300 if (
301 !\is_null($condition)
302 && \is_array($condition)
303 && array_keys($condition) !== range(0, count($condition) - 1)
304 ) {
305 $delete_condition = $condition;
306 } else {
307 return new WP_Error(
308 'deletion_error',
309 __('At least 1 condition needed', 'bitform')
310 );
311 }
312 $result = $this->app_db->delete(
313 $this->table_name,
314 $delete_condition
315 );
316 return $this->getResult($result);
317 }
318 public function bulkDelete(array $condition = null)
319 {
320 if (
321 !\is_null($condition)
322 && \is_array($condition)
323 && array_keys($condition) !== range(0, count($condition) - 1)
324 ) {
325 $delete_condition = $condition;
326 } else {
327 return new WP_Error(
328 'deletion_error',
329 __('At least 1 condition needed', 'bitform')
330 );
331 }
332 $formatted_conditions = $this->getFormatedCondition($delete_condition);
333 if ($formatted_conditions) {
334 $condition_to_check = $formatted_conditions['conditions'];
335 $all_values = $formatted_conditions['values'];
336 } else {
337 $condition_to_check = null;
338 return new WP_Error(
339 'deletion_error',
340 __('At least 1 condition needed', 'bitform')
341 );
342 }
343 $result = $this->app_db->query(
344 $this->app_db->prepare(
345 "DELETE FROM $this->table_name $condition_to_check",
346 $all_values
347 )
348 );
349 return $this->getResult($result);
350 }
351
352 protected function getFieldFormat($value)
353 {
354 return (gettype($value) == 'integer') ?
355 '%d' : ((gettype($value) == 'double') ? '%f' : '%s');
356 }
357
358 protected function getFormatedCondition($condition, $check_operator = null, $join_operator = ' AND ')
359 {
360 if (\is_null($condition)) {
361 return false;
362 }
363 $no_condition = count($condition);
364 $index_checker = 0;
365 $condition_to_check = ' WHERE ';
366 $all_values = array();
367 foreach ($condition as $key => $value) {
368 $value_type = '';
369 if (is_array($value)) {
370 if (isset($value['operator'])) {
371 $set_check_operator = $value['operator'];
372 $value_type .= $this->getFieldFormat($value['value']);
373 $all_values[] = $value['value'];
374 } else {
375 $set_check_operator = \is_null($check_operator) ? 'in' : $check_operator;
376 $value_type .= ' ( ';
377 $value_index_checker = 0;
378 $value_count = count($value) - 1;
379 foreach ($value as $condKey => $condValue) {
380 $value_type .= $this->getFieldFormat($condValue);
381 $all_values[] = $condValue;
382 if ($value_index_checker < $value_count) {
383 $value_type .= ', ';
384 }
385 $value_index_checker = $value_index_checker + 1;
386 }
387 $value_type .= ' )';
388 }
389 } else {
390 $set_check_operator = \is_null($check_operator) ? '=' : $check_operator;
391 $value_type .= $this->getFieldFormat($value);
392 $all_values[] = $value;
393 }
394 $condition_to_check = $condition_to_check . $key . " $set_check_operator " . $value_type;
395 if ($index_checker < $no_condition - 1) {
396 $condition_to_check = $condition_to_check . " $join_operator ";
397 }
398 $index_checker = $index_checker + 1;
399 }
400 return array(
401 'conditions' => $condition_to_check,
402 'values' => $all_values
403 );
404 }
405
406 protected function checkCondition(array $condition)
407 {
408 if (!is_null($condition) && array_keys($condition) === range(0, count($condition) - 1)) {
409 return new WP_Error(
410 'get_condition',
411 'Require ASSOC_ARRAY but found N_ARRAY'
412 );
413 }
414 return true;
415 }
416
417 protected function execute($sql, $values = null)
418 {
419 if (is_null($values)) {
420 $preparedQuery = $this->app_db->prepare($sql);
421 } else {
422 $preparedQuery = $this->app_db->prepare($sql, $values);
423 }
424 // echo " Q S " . $preparedQuery . " Q EE";
425 if (empty($preparedQuery)) {
426 $this->db_response = new WP_Error('null_query', __("prepared query is empty", "bitform"));
427 } else {
428 $this->db_response = stripos($preparedQuery, 'DELETE') !== false ? $this->app_db->query($preparedQuery)
429 : $this->app_db->get_results($preparedQuery, OBJECT_K);
430 }
431 // print_r($this->app_db->last_query);
432 return $this;
433 }
434
435 protected function getResult($db_response = null)
436 {
437 $db_response = !empty($this->db_response) ? $this->db_response : $db_response;
438 if (!empty($this->app_db->last_error)) {
439 return new WP_Error('db_error', $this->app_db->last_error);
440 }
441 if (!$db_response) {
442 if ($this->app_db->num_rows > 0) {
443 $response = $this->app_db->num_rows;
444 }
445 if (is_wp_error($db_response)) {
446 $response = $db_response;
447 }
448 $response = new WP_Error('result_empty', __("Result is empty", "bitform"));
449 } elseif (is_array($this->app_db->last_result) && !empty($this->app_db->last_result)) {
450 $response = $this->app_db->last_result;
451 } elseif ($this->app_db->insert_id) {
452 $response = $this->app_db->insert_id;
453 } else {
454 $response = $db_response;
455 }
456 $this->app_db->flush();
457 return $response;
458 }
459 }
460