PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 1.4
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v1.4
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.4, at includes/Core/Database/Model.php

476 lines 15.6 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 public function single_row($condition, $item = "*")
100 {
101 if (\is_array($item)) {
102 $column_to_select = implode(",", $item);
103 } else {
104 $column_to_select = $item;
105 }
106
107 $sql = "SELECT $column_to_select FROM `$this->table_name`"
108 . $condition;
109 return $this->app_db->get_row($sql);
110
111 }
112
113
114 /**
115 * Undocumented function
116 *
117 * @param string $item
118 * @param array $condition
119 *
120 * @return void
121 */
122 public function count($condition = null)
123 {
124 $checkCondition = $this->checkCondition($condition);
125 if (is_wp_error($checkCondition)) {
126 return $checkCondition;
127 }
128 if (empty($condition)) {
129 $result = $this->app_db->query(
130 "SELECT COUNT(*) FROM `$this->table_name`"
131 );
132 } else {
133 $formatted_conditions = $this->getFormatedCondition($condition);
134 if ($formatted_conditions) {
135 $condition_to_check = $formatted_conditions['conditions'];
136 $all_values = $formatted_conditions['values'];
137 } else {
138 $condition_to_check = null;
139 $all_values = null;
140 }
141 $result = $this->app_db->query(
142 $this->app_db->prepare(
143 "SELECT COUNT(*) as count FROM `$this->table_name`"
144 . $condition_to_check,
145 $all_values
146 )
147 );
148 }
149 if (!$result) {
150 if ($this->app_db->last_error) {
151 return new WP_Error('db_error', $this->app_db->last_error);
152 }
153 return new WP_Error('db_error', __("Result is empty", "bitform"));
154 } else {
155 return $this->app_db->last_result;
156 }
157 }
158 /**
159 * Undocumented function
160 *
161 * @param array $data_to_update
162 * @param array $condition
163 *
164 * @return void
165 */
166 public function update(array $data, array $condition)
167 {
168 if (
169 !\is_null($data)
170 && \is_array($data)
171 && array_keys($data) !== range(0, count($data) - 1)
172 ) {
173 $data_to_update = $data;
174 } else {
175 return new WP_Error(
176 'update_error',
177 __('Nothing to update', 'bitform')
178 );
179 }
180 $update_condition = (!\is_null($condition) &&
181 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
182 $result = $this->app_db->update(
183 $this->table_name,
184 $data_to_update,
185 $update_condition
186 );
187 return $this->getResult($result);
188 }
189 /**
190 * Undocumented function
191 *
192 * @param array $data_to_update
193 * @param array $condition
194 *
195 * @return void
196 */
197 public function bulkUpdate(array $data = null, array $condition = null)
198 {
199 if (
200 !\is_null($data)
201 && \is_array($data)
202 && array_keys($data) !== range(0, count($data) - 1)
203 ) {
204 $data_to_update = $data;
205 } else {
206 return new WP_Error(
207 'update_error',
208 __('Nothing to update', 'bitform')
209 );
210 }
211
212 $update_fields = '';
213 $all_values = array();
214 $index_checker = 0;
215 $data_count = count($data_to_update) - 1;
216 foreach ($data_to_update as $field_name => $field_value) {
217 $update_fields .= $field_name . ' = ' . $this->getFieldFormat($field_value);
218 if ($index_checker < $data_count) {
219 $update_fields .= ',';
220 }
221 $index_checker = $index_checker + 1;
222 $all_values[] = $field_value;
223 }
224 $update_condition = (!\is_null($condition) &&
225 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
226 $formatted_conditions = $this->getFormatedCondition($update_condition);
227 if ($formatted_conditions) {
228 $condition_to_check = $formatted_conditions['conditions'];
229 $all_values = array_merge($all_values, $formatted_conditions['values']);
230 } else {
231 $condition_to_check = null;
232 }
233 $result = $this->app_db->query(
234 $this->app_db->prepare(
235 "UPDATE $this->table_name SET $update_fields $condition_to_check",
236 $all_values
237 )
238 );
239 return $this->getResult($result);
240 }
241 /**
242 * Duplicate's row
243 *
244 * @param array $data_to_update
245 * @param array $condition
246 *
247 * @return void
248 */
249 public function duplicate(array $columns, array $duplicate, array $condition)
250 {
251 if (!(!\is_null($columns)
252 && \is_array($columns)
253 && array_keys($columns) === range(0, count($columns) - 1)
254 && !\is_null($duplicate)
255 && \is_array($duplicate)
256 && array_keys($duplicate) === range(0, count($duplicate) - 1))) {
257 return new WP_Error(
258 'duplicate_error',
259 __('Nothing to duplicate', 'bitform')
260 );
261 }
262
263 $dupCol = '';
264 $insCol = \implode(',', $columns);
265 $all_values = array();
266 $data_count = count($duplicate) - 1;
267 foreach ($duplicate as $dupKey => $dupColName) {
268 if (in_array($dupColName, $columns)) {
269 $dupCol .= $dupColName;
270 } else {
271 $dupCol .= $this->getFieldFormat($dupColName);
272 $all_values[] = $dupColName;
273 }
274 if ($dupKey < $data_count) {
275 $dupCol .= ',';
276 }
277 }
278 $condition_to_check = null;
279 $update_condition = (!\is_null($condition) &&
280 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
281 $formatted_conditions = $this->getFormatedCondition($update_condition);
282 if ($formatted_conditions) {
283 $condition_to_check = $formatted_conditions['conditions'];
284 $all_values = array_merge($all_values, $formatted_conditions['values']);
285 }
286 $query = "INSERT INTO $this->table_name ($insCol)
287 SELECT $dupCol FROM $this->table_name $condition_to_check";
288 $this->execute($query, $all_values);
289 return $this->getResult();
290 }
291 public function trash(array $condition = null)
292 {
293 if (
294 !\is_null($condition)
295 && \is_array($condition)
296 && array_keys($condition) !== range(0, count($condition) - 1)
297 ) {
298 $delete_condition = $condition;
299 } else {
300 return new WP_Error(
301 'deletion_error',
302 __('At least 1 condition needed', 'bitform')
303 );
304 }
305 $update_condition = (!\is_null($condition) &&
306 array_keys($condition) !== range(0, count($condition) - 1)) ? $condition : null;
307 $result = $this->app_db->update(
308 $this->table_name,
309 $data_to_update,
310 $update_condition
311 );
312 return $this->getResult($result);
313 }
314 public function delete(array $condition = null)
315 {
316 if (
317 !\is_null($condition)
318 && \is_array($condition)
319 && array_keys($condition) !== range(0, count($condition) - 1)
320 ) {
321 $delete_condition = $condition;
322 } else {
323 return new WP_Error(
324 'deletion_error',
325 __('At least 1 condition needed', 'bitform')
326 );
327 }
328 $result = $this->app_db->delete(
329 $this->table_name,
330 $delete_condition
331 );
332 return $this->getResult($result);
333 }
334 public function bulkDelete(array $condition = null)
335 {
336 if (
337 !\is_null($condition)
338 && \is_array($condition)
339 && array_keys($condition) !== range(0, count($condition) - 1)
340 ) {
341 $delete_condition = $condition;
342 } else {
343 return new WP_Error(
344 'deletion_error',
345 __('At least 1 condition needed', 'bitform')
346 );
347 }
348 $formatted_conditions = $this->getFormatedCondition($delete_condition);
349 if ($formatted_conditions) {
350 $condition_to_check = $formatted_conditions['conditions'];
351 $all_values = $formatted_conditions['values'];
352 } else {
353 $condition_to_check = null;
354 return new WP_Error(
355 'deletion_error',
356 __('At least 1 condition needed', 'bitform')
357 );
358 }
359 $result = $this->app_db->query(
360 $this->app_db->prepare(
361 "DELETE FROM $this->table_name $condition_to_check",
362 $all_values
363 )
364 );
365 return $this->getResult($result);
366 }
367
368 protected function getFieldFormat($value)
369 {
370 return (gettype($value) == 'integer') ?
371 '%d' : ((gettype($value) == 'double') ? '%f' : '%s');
372 }
373
374 protected function getFormatedCondition($condition, $check_operator = null, $join_operator = ' AND ')
375 {
376 if (\is_null($condition)) {
377 return false;
378 }
379 $no_condition = count($condition);
380 $index_checker = 0;
381 $condition_to_check = ' WHERE ';
382 $all_values = array();
383 foreach ($condition as $key => $value) {
384 $value_type = '';
385 if (is_array($value)) {
386 if (isset($value['operator'])) {
387 $set_check_operator = $value['operator'];
388 $value_type .= $this->getFieldFormat($value['value']);
389 $all_values[] = $value['value'];
390 } else {
391 $set_check_operator = \is_null($check_operator) ? 'in' : $check_operator;
392 $value_type .= ' ( ';
393 $value_index_checker = 0;
394 $value_count = count($value) - 1;
395 foreach ($value as $condKey => $condValue) {
396 $value_type .= $this->getFieldFormat($condValue);
397 $all_values[] = $condValue;
398 if ($value_index_checker < $value_count) {
399 $value_type .= ', ';
400 }
401 $value_index_checker = $value_index_checker + 1;
402 }
403 $value_type .= ' )';
404 }
405 } else {
406 $set_check_operator = \is_null($check_operator) ? '=' : $check_operator;
407 $value_type .= $this->getFieldFormat($value);
408 $all_values[] = $value;
409 }
410 $condition_to_check = $condition_to_check . $key . " $set_check_operator " . $value_type;
411 if ($index_checker < $no_condition - 1) {
412 $condition_to_check = $condition_to_check . " $join_operator ";
413 }
414 $index_checker = $index_checker + 1;
415 }
416 return array(
417 'conditions' => $condition_to_check,
418 'values' => $all_values
419 );
420 }
421
422 protected function checkCondition(array $condition)
423 {
424 if (!is_null($condition) && array_keys($condition) === range(0, count($condition) - 1)) {
425 return new WP_Error(
426 'get_condition',
427 'Require ASSOC_ARRAY but found N_ARRAY'
428 );
429 }
430 return true;
431 }
432
433 protected function execute($sql, $values = null)
434 {
435 if (is_null($values)) {
436 $preparedQuery = $sql;
437 } else {
438 $preparedQuery = $this->app_db->prepare($sql, $values);
439 }
440 // echo " Q S " . $preparedQuery . " Q EE";
441 if (empty($preparedQuery)) {
442 $this->db_response = new WP_Error('null_query', __("prepared query is empty", "bitform"));
443 } else {
444 $this->db_response = stripos($preparedQuery, 'DELETE') !== false ? $this->app_db->query($preparedQuery)
445 : $this->app_db->get_results($preparedQuery, OBJECT_K);
446 }
447 // print_r($this->app_db->last_query);
448 return $this;
449 }
450
451 protected function getResult($db_response = null)
452 {
453 $db_response = !empty($this->db_response) ? $this->db_response : $db_response;
454 if (!empty($this->app_db->last_error)) {
455 return new WP_Error('db_error', $this->app_db->last_error);
456 }
457 if (!$db_response) {
458 if ($this->app_db->num_rows > 0) {
459 $response = $this->app_db->num_rows;
460 }
461 if (is_wp_error($db_response)) {
462 $response = $db_response;
463 }
464 $response = new WP_Error('result_empty', __("Result is empty", "bitform"));
465 } elseif (is_array($this->app_db->last_result) && !empty($this->app_db->last_result)) {
466 $response = $this->app_db->last_result;
467 } elseif ($this->app_db->insert_id) {
468 $response = $this->app_db->insert_id;
469 } else {
470 $response = $db_response;
471 }
472 $this->app_db->flush();
473 return $response;
474 }
475 }
476