Syntax error on token "<=", invalid AssignmentOperator

I'm attempting to fix a plugin I wrote a long time ago for Craftbukkit, but I'm stumped on one section. I've searched Google with little luck, and I've asked other Java developers only to hear that I shouldn't be using a for loop because it's rather basic, or that I'm using a boolean expression in the wrong place. Nobody will tell me how I can fix this, so I'll know for future references - Below is the class that throws the error:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.logging.Logger;
import org.bukkit.configuration.file.FileConfiguration;

public class Database
{
  private static String host = null;
  private static String port = null;
  private static String database = null;
  private static String table = null;
  private static String username = null;
  private static String password = null;
  private static String colUsername = null;
  private static Logger logger = null;

  public static void init(FileConfiguration config, Logger log)
  {
    logger = log;

    host = config.getString("DBHost");
    port = config.getString("DBPort");
    database = config.getString("DBName");
    table = config.getString("DBTable");
    username = config.getString("DBUser");
    password = config.getString("DBPass");
    colUsername = config.getString("ColUsername");
  }

  public static Hashtable<String, Object> getUserInfo(String user)
  {
    String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
    String query = "SELECT * FROM " + table + " WHERE " + colUsername + " = ?";

    Connection connect = null;
    PreparedStatement stmt = null;
    ResultSet result = null;
    Hashtable<String, Object> userInfo = new Hashtable<String, Object>();
    try
    {
      Class.forName("com.mysql.jdbc.Driver");
      connect = DriverManager.getConnection(url, username, password);
      stmt = connect.prepareStatement(query);
      stmt.setString(1, user);
      result = stmt.executeQuery();
      ResultSetMetaData rsmd;
      int i;
      for (; result.next(); i <= rsmd.getColumnCount())
      {
        rsmd = result.getMetaData();
        i = 1; continue;
        userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
      }
      return userInfo;
    }
    catch (ClassNotFoundException e)
    {
      logger.warning("Unable to load driver. Using default behaviour.");
      e.printStackTrace();
    }
    catch (SQLException e)
    {
      logger.warning("Database error. Using default behaviour.");
      e.printStackTrace();
    }
    finally
    {
      if (result != null) {
        try
        {
          result.close();
        }
        catch (SQLException e)
        {
          e.printStackTrace();
        }
      }
      if (stmt != null) {
        try
        {
          stmt.close();
        }
        catch (SQLException e)
        {
          e.printStackTrace();
        }
      }
      if (connect != null) {
        try
        {
          connect.close();
        }
        catch (SQLException e)
        {
          e.printStackTrace();
        }
      }
    }
    return null;
  }
}

The error I encounter is in this part of the code:

  for (; result.next(); i <= rsmd.getColumnCount())
  {
    rsmd = result.getMetaData();
    i = 1; continue;
    userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
  }

Where I get the error "Syntax error on token "<=", invalid AssignmentOperator"

How should I go about fixing this, and how can I improve it?

EDIT #1:

This is my updated code, according to Jon's answer:

try
{
  Class.forName("com.mysql.jdbc.Driver");
  connect = DriverManager.getConnection(url, username, password);
  stmt = connect.prepareStatement(query);
  stmt.setString(1, user);
  result = stmt.executeQuery();
  ResultSetMetaData rsmd = result.getMetaData();
  while (result.next()) {
      for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          rsmd = result.getMetaData();
          userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
      }
  }
  return userInfo;
}
Jon Skeet
people
quotationmark

Basically this is the wrong way round:

for (; result.next(); i <= rsmd.getColumnCount())

It should possibly be:

for (; i <= rsmd.getColumnCount(); result.next())

Although more likely, you actually want:

while (result.next()) {
    // This outer loop is executed once per row        

    for (int i = 1; i <= rsmd.getColumnCount(); i++) {
        // This inner loop is executed once per column (per row, as it's
        // within the outer loop)
    }
}

Having said that, you're not even initializing rsmd, which doesn't help. I suspect you may want to call ResultSet.getMetadata(), e.g.

rsmd = result.getMetadata();

For reference, the three parts of the for statement declaration are as follows:

  • The first part (empty in your case) is performed once, as initialization
  • The second part is a condition to check on each iteration; the loop ends when the condition evaluates to false
  • The third part is a statement is a step to take at the end of each iteration

See section 14.14.1 of the JLS or the for statement part of the Java tutorial for more details.

people

See more on this question at Stackoverflow