. */ require_once('CFDBAbstractQueryResultsIterator.php'); class CFDBQueryResultIterator extends CFDBAbstractQueryResultsIterator { /** * @var resource|mysqli_result */ var $results; /** * @var boolean */ var $useMysqli; /** * If you do not iterate over all the rows returned, be sure to call this function * on all remaining rows to free resources. * @return void */ public function freeResult() { if ($this->results) { if ($this->useMysqli) { mysqli_free_result($this->results); } else { mysql_free_result($this->results); } $this->results = null; } } /** * @return array associative */ public function fetchRow() { if ($this->useMysqli) { return mysqli_fetch_assoc($this->results); } else { return mysql_fetch_assoc($this->results); } } public function hasResults() { return !empty($this->results); } /** * @param $sql * @param $queryOptions * @return void */ public function queryDataSource(&$sql, $queryOptions) { // For performance reasons, we bypass $wpdb so we can call mysql_unbuffered_query $this->useMysqli = $this->shouldUseMySqli(); $con = null; if ($this->useMysqli) { $con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if (!$con) { trigger_error("MySQL Connection failed: " . mysqli_error($con), E_USER_NOTICE); return; } } else { $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, true); if (!$con) { trigger_error("MySQL Connection failed: " . mysql_error($con), E_USER_NOTICE); return; } } // Target charset is in wp-config.php DB_CHARSET if (defined('DB_CHARSET')) { if (DB_CHARSET != '') { global $wpdb; if (method_exists($wpdb, 'set_charset')) { $collate = null; if (defined('DB_COLLATE')) { if (DB_COLLATE != '') { $collate = DB_COLLATE; } } $wpdb->set_charset($con, DB_CHARSET, $collate); } else { $setCharset = 'SET NAMES \'' . DB_CHARSET . '\''; if (defined('DB_COLLATE')) { if (DB_COLLATE != '') { $setCharset = $setCharset . ' COLLATE \'' . DB_COLLATE . '\''; } } if ($this->useMysqli) { mysqli_query($con, $setCharset); } else { mysql_query($setCharset, $con); } } } } if (!$this->useMysqli) { if (!mysql_select_db(DB_NAME, $con)) { trigger_error('MySQL DB Select failed: ' . mysql_error(), E_USER_NOTICE); return; } } if (isset($queryOptions['unbuffered']) && $queryOptions['unbuffered'] === 'true') { // FYI: using mysql_unbuffered_query disrupted nested shortcodes if the nested one does a query also if ($this->useMysqli) { $this->results = mysqli_query($con, $sql, MYSQLI_USE_RESULT); if (!$this->results) { trigger_error('mysqli_query failed: ' . mysql_error(), E_USER_NOTICE); return; } } else { $this->results = mysql_unbuffered_query($sql, $con); if (!$this->results) { trigger_error('mysql_unbuffered_query failed: ' . mysql_error(), E_USER_NOTICE); return; } } } else { if ($this->useMysqli) { $this->results = @mysqli_query($con, $sql); if (!$this->results) { trigger_error('mysqli_query failed. Try adding unbuffered="true" to your short code.
' . mysql_error(), E_USER_WARNING); return; } } else { $this->results = @mysql_query($sql, $con); if (!$this->results) { trigger_error('mysql_query failed. Try adding unbuffered="true" to your short code.
' . mysql_error(), E_USER_WARNING); return; } } } } public function shouldUseMySqli() { // This code taken from wp-db.php and adapted $use_mysqli = false; if ( function_exists( 'mysqli_connect' ) ) { if ( defined( 'WP_USE_EXT_MYSQL' ) ) { $use_mysqli = ! WP_USE_EXT_MYSQL; } elseif ( version_compare( phpversion(), '5.5', '>=' ) || ! function_exists( 'mysql_connect' ) ) { $use_mysqli = true; } elseif ( false !== strpos( $GLOBALS['wp_version'], '-' ) ) { $use_mysqli = true; } } return $use_mysqli; } }