title: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in "link to the file"
body: <p>I have this error in a Component in Joomla</p>
  
  <p>That's my code (the error is in line 263):</p>
  
  <pre><code>&lt;?php
  /**
   * @package     Joomla.Platform
   * @subpackage  Database
   *
   * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
   * @license     GNU General Public License version 2 or later; see LICENSE
   */
  
  defined('JPATH_PLATFORM') or die;
  
  JLoader::register('JDatabaseMySQL', dirname(__FILE__) . '/mysql.php');
  JLoader::register('JDatabaseQueryMySQLi', dirname(__FILE__) . '/mysqliquery.php');
  JLoader::register('JDatabaseExporterMySQLi', dirname(__FILE__) . '/mysqliexporter.php');
  JLoader::register('JDatabaseImporterMySQLi', dirname(__FILE__) . '/mysqliimporter.php');
  
  /**
   * MySQLi database driver
   *
   * @package     Joomla.Platform
   * @subpackage  Database
   * @see         http://php.net/manual/en/book.mysqli.php
   * @since       11.1
   */
  class JDatabaseMySQLi extends JDatabaseMySQL
  {
      /**
       * The name of the database driver.
       *
       * @var    string
       * @since  11.1
       */
      public $name = 'mysqli';
  
      /**
       * Constructor.
       *
       * @param   array  $options  List of options used to configure the connection
       *
       * @since   11.1
       */
      protected function __construct($options)
      {
          // Get some basic values from the options.
          $options['host'] = (isset($options['host'])) ? $options['host'] : 'localhost';
          $options['user'] = (isset($options['user'])) ? $options['user'] : 'root';
          $options['password'] = (isset($options['password'])) ? $options['password'] : '';
          $options['database'] = (isset($options['database'])) ? $options['database'] : '';
          $options['select'] = (isset($options['select'])) ? (bool) $options['select'] : true;
          $options['port'] = null;
          $options['socket'] = null;
  
          /*
           * Unlike mysql_connect(), mysqli_connect() takes the port and socket as separate arguments. Therefore, we
           * have to extract them from the host string.
           */
          $tmp = substr(strstr($options['host'], ':'), 1);
          if (!empty($tmp))
          {
              // Get the port number or socket name
              if (is_numeric($tmp))
              {
                  $options['port'] = $tmp;
              }
              else
              {
                  $options['socket'] = $tmp;
              }
  
              // Extract the host name only
              $options['host'] = substr($options['host'], 0, strlen($options['host']) - (strlen($tmp) + 1));
  
              // This will take care of the following notation: ":3306"
              if ($options['host'] == '')
              {
                  $options['host'] = 'localhost';
              }
          }
  
          // Make sure the MySQLi extension for PHP is installed and enabled.
          if (!function_exists('mysqli_connect'))
          {
  
              // Legacy error handling switch based on the JError::$legacy switch.
              // @deprecated  12.1
              if (JError::$legacy)
              {
                  $this-&gt;errorNum = 1;
                  $this-&gt;errorMsg = JText::_('JLIB_DATABASE_ERROR_ADAPTER_MYSQLI');
                  return;
              }
              else
              {
                  throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_ADAPTER_MYSQLI'));
              }
          }
  
          $this-&gt;connection = @mysqli_connect(
              $options['host'], $options['user'], $options['password'], null, $options['port'], $options['socket']
          );
  
          // Attempt to connect to the server.
          if (!$this-&gt;connection)
          {
              // Legacy error handling switch based on the JError::$legacy switch.
              // @deprecated  12.1
              if (JError::$legacy)
              {
                  $this-&gt;errorNum = 2;
                  $this-&gt;errorMsg = JText::_('JLIB_DATABASE_ERROR_CONNECT_MYSQL');
                  return;
              }
              else
              {
                  throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_CONNECT_MYSQL'));
              }
          }
  
          // Finalize initialisation
          JDatabase::__construct($options);
  
          // Set sql_mode to non_strict mode
          mysqli_query($this-&gt;connection, "SET @@SESSION.sql_mode = '';");
  
          // If auto-select is enabled select the given database.
          if ($options['select'] &amp;&amp; !empty($options['database']))
          {
              $this-&gt;select($options['database']);
          }
      }
  
      /**
       * Destructor.
       *
       * @since   11.1
       */
      public function __destruct()
      {
          if (is_callable(array($this-&gt;connection, 'close')))
          {
              mysqli_close($this-&gt;connection);
          }
      }
  
      /**
       * Method to escape a string for usage in an SQL statement.
       *
       * @param   string   $text   The string to be escaped.
       * @param   boolean  $extra  Optional parameter to provide extra escaping.
       *
       * @return  string  The escaped string.
       *
       * @since   11.1
       */
      public function escape($text, $extra = false)
      {
          $result = mysqli_real_escape_string($this-&gt;getConnection(), $text);
  
          if ($extra)
          {
              $result = addcslashes($result, '%_');
          }
  
          return $result;
      }
  
      /**
       * Test to see if the MySQL connector is available.
       *
       * @return  boolean  True on success, false otherwise.
       *
       * @since   11.1
       */
      public static function test()
      {
          return (function_exists('mysqli_connect'));
      }
  
      /**
       * Determines if the connection to the server is active.
       *
       * @return  boolean  True if connected to the database engine.
       *
       * @since   11.1
       */
      public function connected()
      {
          if (is_object($this-&gt;connection))
          {
              return mysqli_ping($this-&gt;connection);
          }
  
          return false;
      }
  
      /**
       * Get the number of affected rows for the previous executed SQL statement.
       *
       * @return  integer  The number of affected rows.
       *
       * @since   11.1
       */
      public function getAffectedRows()
      {
          return mysqli_affected_rows($this-&gt;connection);
      }
  
      /**
       * Gets an exporter class object.
       *
       * @return  JDatabaseExporterMySQLi  An exporter object.
       *
       * @since   11.1
       * @throws  JDatabaseException
       */
      public function getExporter()
      {
          // Make sure we have an exporter class for this driver.
          if (!class_exists('JDatabaseExporterMySQLi'))
          {
              throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_EXPORTER'));
          }
  
          $o = new JDatabaseExporterMySQLi;
          $o-&gt;setDbo($this);
  
          return $o;
      }
  
      /**
       * Gets an importer class object.
       *
       * @return  JDatabaseImporterMySQLi  An importer object.
       *
       * @since   11.1
       * @throws  JDatabaseException
       */
      public function getImporter()
      {
          // Make sure we have an importer class for this driver.
          if (!class_exists('JDatabaseImporterMySQLi'))
          {
              throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_IMPORTER'));
          }
  
          $o = new JDatabaseImporterMySQLi;
          $o-&gt;setDbo($this);
  
          return $o;
      }
  
      /**
       * Get the number of returned rows for the previous executed SQL statement.
       *
       * @param   resource  $cursor  An optional database cursor resource to extract the row count from.
       *
       * @return  integer   The number of returned rows.
       *
       * @since   11.1
       */
      public function getNumRows($cursor = null)
      {
          return mysqli_num_rows($cursor ? $cursor : $this-&gt;cursor);
      }
  
      /**
       * Get the current or query, or new JDatabaseQuery object.
       *
       * @param   boolean  $new  False to return the last query set, True to return a new JDatabaseQuery object.
       *
       * @return  mixed  The current value of the internal SQL variable or a new JDatabaseQuery object.
       *
       * @since   11.1
       * @throws  JDatabaseException
       */
      public function getQuery($new = false)
      {
          if ($new)
          {
              // Make sure we have a query class for this driver.
              if (!class_exists('JDatabaseQueryMySQLi'))
              {
                  throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_QUERY'));
              }
              return new JDatabaseQueryMySQLi($this);
          }
          else
          {
              return $this-&gt;sql;
          }
      }
  
      /**
       * Get the version of the database connector.
       *
       * @return  string  The database connector version.
       *
       * @since   11.1
       */
      public function getVersion()
      {
          return mysqli_get_server_info($this-&gt;connection);
      }
  
      /**
       * Determines if the database engine supports UTF-8 character encoding.
       *
       * @return  boolean  True if supported.
       *
       * @since   11.1
       * @deprecated 12.1
       */
      public function hasUTF()
      {
          JLog::add('JDatabaseMySQLi::hasUTF() is deprecated.', JLog::WARNING, 'deprecated');
          return true;
      }
  
      /**
       * Method to get the auto-incremented value from the last INSERT statement.
       *
       * @return  integer  The value of the auto-increment field from the last inserted row.
       *
       * @since   11.1
       */
      public function insertid()
      {
          return mysqli_insert_id($this-&gt;connection);
      }
  
      /**
       * Execute the SQL statement.
       *
       * @return  mixed  A database cursor resource on success, boolean false on failure.
       *
       * @since   11.1
       * @throws  JDatabaseException
       */
      public function execute()
      {
          if (!is_object($this-&gt;connection))
          {
              // Legacy error handling switch based on the JError::$legacy switch.
              // @deprecated  12.1
              if (JError::$legacy)
              {
                  if ($this-&gt;debug)
                  {
                      JError::raiseError(500, 'JDatabaseMySQLi::query: ' . $this-&gt;errorNum . ' - ' . $this-&gt;errorMsg);
                  }
                  return false;
              }
              else
              {
                  JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $this-&gt;errorNum, $this-&gt;errorMsg), JLog::ERROR, 'database');
                  throw new JDatabaseException($this-&gt;errorMsg, $this-&gt;errorNum);
              }
          }
  
          // Take a local copy so that we don't modify the original query and cause issues later
          $sql = $this-&gt;replacePrefix((string) $this-&gt;sql);
          if ($this-&gt;limit &gt; 0 || $this-&gt;offset &gt; 0)
          {
              $sql .= ' LIMIT ' . $this-&gt;offset . ', ' . $this-&gt;limit;
          }
  
          // If debugging is enabled then let's log the query.
          if ($this-&gt;debug)
          {
              // Increment the query counter and add the query to the object queue.
              $this-&gt;count++;
              $this-&gt;log[] = $sql;
  
              JLog::add($sql, JLog::DEBUG, 'databasequery');
          }
  
          // Reset the error values.
          $this-&gt;errorNum = 0;
          $this-&gt;errorMsg = '';
  
          // Execute the query.
          $this-&gt;cursor = mysqli_query($this-&gt;connection, $sql);
  
          // If an error occurred handle it.
          if (!$this-&gt;cursor)
          {
              $this-&gt;errorNum = (int) mysqli_errno($this-&gt;connection);
              $this-&gt;errorMsg = (string) mysqli_error($this-&gt;connection) . ' SQL=' . $sql;
  
              // Legacy error handling switch based on the JError::$legacy switch.
              // @deprecated  12.1
              if (JError::$legacy)
              {
                  if ($this-&gt;debug)
                  {
                      JError::raiseError(500, 'JDatabaseMySQLi::query: ' . $this-&gt;errorNum . ' - ' . $this-&gt;errorMsg);
                  }
                  return false;
              }
              else
              {
                  JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $this-&gt;errorNum, $this-&gt;errorMsg), JLog::ERROR, 'databasequery');
                  throw new JDatabaseException($this-&gt;errorMsg, $this-&gt;errorNum);
              }
          }
  
          return $this-&gt;cursor;
      }
  
      /**
       * Select a database for use.
       *
       * @param   string  $database  The name of the database to select for use.
       *
       * @return  boolean  True if the database was successfully selected.
       *
       * @since   11.1
       * @throws  JDatabaseException
       */
      public function select($database)
      {
          if (!$database)
          {
              return false;
          }
  
          if (!mysqli_select_db($this-&gt;connection, $database))
          {
              // Legacy error handling switch based on the JError::$legacy switch.
              // @deprecated  12.1
              if (JError::$legacy)
              {
                  $this-&gt;errorNum = 3;
                  $this-&gt;errorMsg = JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT');
                  return false;
              }
              else
              {
                  throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT'));
              }
          }
  
          return true;
      }
  
      /**
       * Set the connection to use UTF-8 character encoding.
       *
       * @return  boolean  True on success.
       *
       * @since   11.1
       */
      public function setUTF()
      {
          mysqli_query($this-&gt;connection, "SET NAMES 'utf8'");
      }
  
      /**
       * Method to fetch a row from the result set cursor as an array.
       *
       * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
       *
       * @return  mixed  Either the next row from the result set or false if there are no more rows.
       *
       * @since   11.1
       */
      protected function fetchArray($cursor = null)
      {
          return mysqli_fetch_row($cursor ? $cursor : $this-&gt;cursor);
      }
  
      /**
       * Method to fetch a row from the result set cursor as an associative array.
       *
       * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
       *
       * @return  mixed  Either the next row from the result set or false if there are no more rows.
       *
       * @since   11.1
       */
      protected function fetchAssoc($cursor = null)
      {
          return mysqli_fetch_assoc($cursor ? $cursor : $this-&gt;cursor);
      }
  
      /**
       * Method to fetch a row from the result set cursor as an object.
       *
       * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
       * @param   string  $class   The class name to use for the returned row object.
       *
       * @return  mixed   Either the next row from the result set or false if there are no more rows.
       *
       * @since   11.1
       */
      protected function fetchObject($cursor = null, $class = 'stdClass')
      {
          return mysqli_fetch_object($cursor ? $cursor : $this-&gt;cursor, $class);
      }
  
      /**
       * Method to free up the memory used for the result set.
       *
       * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
       *
       * @return  void
       *
       * @since   11.1
       */
      protected function freeResult($cursor = null)
      {
          mysqli_free_result($cursor ? $cursor : $this-&gt;cursor);
      }
  
      /**
       * Execute a query batch.
       *
       * @param   boolean  $abortOnError     Abort on error.
       * @param   boolean  $transactionSafe  Transaction safe queries.
       *
       * @return  mixed  A database resource if successful, false if not.
       *
       * @deprecated  12.1
       * @since   11.1
       */
      public function queryBatch($abortOnError = true, $transactionSafe = false)
      {
          // Deprecation warning.
          JLog::add('JDatabaseMySQLi::queryBatch() is deprecated.', JLog::WARNING, 'deprecated');
  
          $sql = $this-&gt;replacePrefix((string) $this-&gt;sql);
          $this-&gt;errorNum = 0;
          $this-&gt;errorMsg = '';
  
          // If the batch is meant to be transaction safe then we need to wrap it in a transaction.
          if ($transactionSafe)
          {
              $sql = 'START TRANSACTION;' . rtrim($sql, "; \t\r\n\0") . '; COMMIT;';
          }
          $queries = $this-&gt;splitSql($sql);
          $error = 0;
          foreach ($queries as $query)
          {
              $query = trim($query);
              if ($query != '')
              {
                  $this-&gt;cursor = mysqli_query($this-&gt;connection, $query);
                  if ($this-&gt;debug)
                  {
                      $this-&gt;count++;
                      $this-&gt;log[] = $query;
                  }
                  if (!$this-&gt;cursor)
                  {
                      $error = 1;
                      $this-&gt;errorNum .= mysqli_errno($this-&gt;connection) . ' ';
                      $this-&gt;errorMsg .= mysqli_error($this-&gt;connection) . " SQL=$query &lt;br /&gt;";
                      if ($abortOnError)
                      {
                          return $this-&gt;cursor;
                      }
                  }
              }
          }
          return $error ? false : true;
      }
  }
  </code></pre>