prepare(); this class * never receives SQL. The first argument is the $wpdb->suppress_errors( true ) call made just * before the query (PHP evaluates arguments left to right), so database errors stay hidden * while the query runs. The previous state is then restored, and a database error throws. * * Db::rows( $wpdb->suppress_errors( true ), $wpdb->get_results( $wpdb->prepare( '...', $id ), ARRAY_A ), 'error_code' ); * * @package Abientot */ namespace Abientot\Support; if ( ! defined( 'ABSPATH' ) ) { exit; } final class Db { /** * @param bool $previous Return value of $wpdb->suppress_errors( true ), called just before the query. * @param mixed $result Return value of $wpdb->get_results( ..., ARRAY_A ). * @return array> */ public static function rows( bool $previous, $result, string $error ): array { self::finish( $previous, $error, ! is_array( $result ) ); return $result; } /** * @param mixed $result Return value of $wpdb->get_row( ..., ARRAY_A ). * @return array|null */ public static function row( bool $previous, $result, string $error ): ?array { self::finish( $previous, $error, null !== $result && ! is_array( $result ) ); return $result; } /** * @param mixed $result Return value of $wpdb->get_var(). * @return string|null */ public static function value( bool $previous, $result, string $error ): ?string { self::finish( $previous, $error, false ); return null === $result ? null : (string) $result; } /** * @param mixed $result Return value of $wpdb->get_col(). * @return array */ public static function col( bool $previous, $result, string $error ): array { self::finish( $previous, $error, ! is_array( $result ) ); return $result; } /** * @param mixed $result Return value of $wpdb->query(): affected rows, or false on failure. */ public static function done( bool $previous, $result, string $error ): int { self::finish( $previous, $error, false === $result ); return (int) $result; } private static function finish( bool $previous, string $error, bool $failed ): void { global $wpdb; $database_error = (string) $wpdb->last_error; $wpdb->suppress_errors( $previous ); if ( $failed || '' !== $database_error ) { throw new \RuntimeException( esc_html( $error ) ); } } }