PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.1.6
Tutor LMS – eLearning and online course solution v2.1.6
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / helpers / QueryHelper.php
tutor / helpers Last commit date
QueryHelper.php 3 years ago
QueryHelper.php
392 lines
1 <?php
2 /**
3 * Query helper class contains static helper methods to perform basic
4 * operations
5 *
6 * @package Tutor\Helper
7 * @since v2.0.7
8 */
9
10 namespace Tutor\Helpers;
11
12 /**
13 * Do the common db operations through helper
14 * methods
15 */
16 class QueryHelper {
17
18 /**
19 * Insert data in the table
20 *
21 * @param string $table table name.
22 * @param array $data | data to insert in the table.
23 *
24 * @return int, inserted id.
25 *
26 * @since v2.0.7
27 */
28 public static function insert( string $table, array $data ): int {
29 global $wpdb;
30 // Sanitize text field.
31 $data = array_map(
32 function( $value ) {
33 return sanitize_text_field( $value );
34 },
35 $data
36 );
37
38 $insert = $wpdb->insert(
39 $table,
40 $data
41 );
42 return $insert ? $wpdb->insert_id : 0;
43 }
44
45 /**
46 * Update data
47 *
48 * @param string $table table name.
49 * @param array $data | data to update in the table.
50 * @param array $where | condition array.
51 *
52 * @return bool, true on success false on failure
53 *
54 * @since v2.0.7
55 */
56 public static function update( string $table, array $data, array $where ): bool {
57 global $wpdb;
58 // Sanitize text field.
59 $data = array_map(
60 function( $value ) {
61 return sanitize_text_field( $value );
62 },
63 $data
64 );
65
66 $where = array_map(
67 function( $value ) {
68 return sanitize_text_field( $value );
69 },
70 $where
71 );
72
73 $update = $wpdb->update(
74 $table,
75 $data,
76 $where
77 );
78 return $update ? true : false;
79 }
80
81 /**
82 * Delete rows from table
83 *
84 * @param string $table table name.
85 * @param array $where key value pairs.Where key is the name of
86 * column & value is the value to match.
87 * For ex: [ 'id' => 1 ].
88 *
89 * @since v2.0.7
90 */
91 public static function delete( string $table, array $where ): bool {
92 global $wpdb;
93 $delete = $wpdb->delete(
94 $table,
95 $where
96 );
97 return $delete ? true : false;
98 }
99
100 /**
101 * Clean everything from table
102 *
103 * @since v2.0.7
104 *
105 * @param string $table table name.
106 *
107 * @return bool
108 */
109 public static function table_clean( string $table ): bool {
110 global $wpdb;
111 $delete = $wpdb->query(
112 $wpdb->prepare(
113 "DELETE FROM
114 {$table}
115 WHERE 1 = %d
116 ",
117 1
118 )
119 );
120 return $delete ? true : false;
121 }
122
123 /**
124 * Insert multiple rows without knowing key value
125 *
126 * @since v2.0.7
127 *
128 * @param string $table table name.
129 * @param array $request two dimensional array
130 * for ex: [ [id => 1], [id => 2] ].
131 *
132 * @return mixed wpdb response true or int on success,
133 * false on failure
134 */
135 public static function insert_multiple_rows( $table, $request ) {
136 global $wpdb;
137 $column_keys = '';
138 $column_values = '';
139 $sql = '';
140 $last_key = array_key_last( $request );
141 $first_key = array_key_first( $request );
142 foreach ( $request as $k => $value ) {
143 $keys = array_keys( $value );
144
145 // Prepare column keys & values.
146 foreach ( $keys as $v ) {
147 $column_keys .= sanitize_key( $v ) . ',';
148 $sanitize_value = sanitize_text_field( $value[ $v ] );
149 $column_values .= is_numeric( $sanitize_value ) ? $sanitize_value . ',' : "'$sanitize_value'" . ',';
150 }
151 // Trim trailing comma.
152 $column_keys = rtrim( $column_keys, ',' );
153 $column_values = rtrim( $column_values, ',' );
154 if ( $first_key === $k ) {
155 $sql .= "INSERT INTO {$table} ($column_keys) VALUES ($column_values),";
156 } elseif ( $last_key == $k ) {
157 $sql .= "($column_values)";
158 } else {
159 $sql .= "($column_values),";
160 }
161
162 // Reset keys & values to avoid duplication.
163 $column_keys = '';
164 $column_values = '';
165 }
166 return $wpdb->query( $sql );
167 }
168
169 /**
170 * Build where clause string
171 *
172 * @param array $where assoc array with field and value
173 * @return string
174 *
175 * @since 2.0.9
176 */
177 private function build_where_clause( array $where ) {
178 $arr = array();
179 foreach ( $where as $field => $value ) {
180 $value = is_numeric( $value ) ? ( $value + 0 ) : "'" . $value . "'";
181 $arr[] = "{$field}={$value}";
182 }
183
184 return implode( ' AND ', $arr );
185 }
186
187 /**
188 * Sanitize assoc array
189 *
190 * @param array $array an assoc array
191 * @return array
192 *
193 * @since 2.0.9
194 */
195 private function sanitize_assoc_array( array $array ) {
196 return array_map(
197 function( $value ) {
198 return sanitize_text_field( $value );
199 },
200 $array
201 );
202 }
203
204 /**
205 * Delete comment with associate meta data
206 *
207 * @param array $where associative array with field and value.
208 * Example: array( 'comment_type' => 'comment', 'comment_id' => 1 )
209 * @return bool
210 *
211 * @since 2.0.9
212 */
213 public static function delete_comment_with_meta( array $where ) {
214 if ( count( $where ) === 0 || ! tutor_utils()->is_assoc( $where ) ) {
215 return false;
216 }
217
218 $obj = new self();
219 $where = $obj->build_where_clause( $obj->sanitize_assoc_array( $where ) );
220
221 global $wpdb;
222 $ids = $wpdb->get_col( "SELECT comment_id FROM {$wpdb->comments} WHERE {$where}" );
223
224 if ( is_array( $ids ) && count( $ids ) ) {
225 $ids_str = "'" . implode( "','", $ids ) . "'";
226 // delete comment metas
227 $wpdb->query( "DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN({$ids_str}) " );
228 // delete comment
229 $wpdb->query( "DELETE FROM {$wpdb->comments} WHERE {$where}" );
230
231 return true;
232 }
233
234 return false;
235 }
236
237 /**
238 * Delete post with associate meta data
239 *
240 * @param array $where associative array with field and value.
241 * Example: array( 'post_type' => 'post', 'id' => 1 )
242 * @return bool
243 *
244 * @since 2.0.9
245 */
246 public static function delete_post_with_meta( array $where ) {
247 if ( count( $where ) === 0 || ! tutor_utils()->is_assoc( $where ) ) {
248 return false;
249 }
250
251 $obj = new self();
252 $where = $obj->build_where_clause( $obj->sanitize_assoc_array( $where ) );
253
254 global $wpdb;
255 $ids = $wpdb->get_col( "SELECT id FROM {$wpdb->posts} WHERE {$where}" );
256
257 if ( is_array( $ids ) && count( $ids ) ) {
258 $ids_str = "'" . implode( "','", $ids ) . "'";
259 // delete post metas
260 $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN({$ids_str}) " );
261 // delete post
262 $wpdb->query( "DELETE FROM {$wpdb->posts} WHERE {$where}" );
263
264 return true;
265 }
266
267 return false;
268 }
269
270 /**
271 * Get a single row from any table with where clause
272 *
273 * @param string $table table name with prefix.
274 *
275 * @param array $where assoc_array. For ex: [col_name => value ].
276 * @param string $order_by order by column name.
277 * @param string $order DESC or ASC, default is DESC.
278 * @param string $output expected output type, default is object.
279 *
280 * @return mixed based on output param, default object
281 */
282 public static function get_row( string $table, array $where, string $order_by, string $order = 'DESC', string $output = 'OBJECT' ) {
283 global $wpdb;
284 $obj = new self();
285 $where_clause = $obj->build_where_clause( $where );
286 $query = $wpdb->prepare(
287 "SELECT *
288 FROM {$table}
289 WHERE {$where_clause}
290 ORDER BY {$order_by} {$order}
291 LIMIT %d
292 ",
293 1
294 );
295 return $wpdb->get_row(
296 $query,
297 $output
298 );
299 }
300
301
302 /**
303 * Update multiple rows by using where in
304 * clause
305 *
306 * @since v2.1.0
307 *
308 * @param string $table table name.
309 * @param array $data assoc_array data to update
310 * ex: [id => 2, name => 'john' ].
311 * @param string $where_in comma separated values, ex: 1,2,3.
312 * @param string $where_col default is ID but could be other.
313 *
314 * @return bool true on success, false on failure
315 */
316 public static function update_where_in( string $table, array $data, string $where_in, string $where_col = 'ID' ) {
317 global $wpdb;
318 if ( empty( $where_in ) || empty( $where_col ) ) {
319 return false;
320 }
321 $set_clause = self::prepare_set_clause( $data );
322 if ( '' === $set_clause ) {
323 return false;
324 }
325 // @codingStandardsIgnoreStart
326 $query = $wpdb->prepare(
327 "UPDATE {$table}
328 {$set_clause}
329 WHERE $where_col IN ( $where_in )
330 AND 1 = %d
331 ",
332 1
333 );
334 return $wpdb->query( $query ) ? true : false;
335 }
336
337 /**
338 * Prepare MySQL SET clause for update query
339 *
340 * @since v2.1.0
341 *
342 * @param array $data single dimension assoc_array.
343 *
344 * @return string
345 */
346 public static function prepare_set_clause( array $data ) {
347 $set = '';
348 foreach ( $data as $key => $value ) {
349 if ( $key === array_key_first ( $data ) ) {
350 $set .= "SET ";
351 }
352 // Multi dimension not allowed.
353 if ( is_array( $value ) ) {
354 continue;
355 }
356 $value = sanitize_text_field( $value );
357 $set .= is_numeric( $value ) ? "$key = $value" : "$key = '" . $value ."'";
358 $set .= ",";
359 }
360 return rtrim( $set, ',' );
361 }
362
363 /**
364 * Make sanitized SQL IN clause value from an array
365 *
366 * @param array $arr a sequentital array.
367 * @return string
368 * @since 2.1.1
369 */
370 public static function prepare_in_clause( array $arr ) {
371 $escaped = array_map(
372 function( $value ) {
373 global $wpdb;
374 $escaped_value = null;
375 if ( is_int( $value ) ) {
376 $escaped_value = $wpdb->prepare( '%d', $value );
377 } else if( is_float( $value ) ) {
378 list( $whole, $decimal ) = explode( '.', $value );
379 $expression = '%.'. strlen( $decimal ) . 'f';
380 $escaped_value = $wpdb->prepare( $expression, $value );
381 } else {
382 $escaped_value = $wpdb->prepare( '%s', $value );
383 }
384 return $escaped_value;
385 },
386 $arr
387 );
388
389 return implode( ',', $escaped );
390 }
391 }
392