所以我正在创建一个注册页面,当我输入所有字段并单击注册提交时,将调用enterNewUser(,,,)并将字段userId,username,password和role插入到表User中。我通过将 select * from user; 运行到MYSQL工作台来确认这一点。
然后调用enterUsername(,,,)并收到此错误:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在第1行'(3,'Barry','Allen')附近 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个 SQL语法错误;查看与您的手册相对应的手册 MySQL服务器版本为正确的语法使用附近 '(3,'Barry','Allen')'在第1行
public static int enterNewUser(String username,String password, String role){
//int userId = -1;
int ID = 0;
//int ID=-1;
try{
if(checkUserNameAvailable(username)==true){
Class.forName("com.mysql.jdbc.Driver");
cn = DriverManager.getConnection("jdbc:mysql://localhost/log", "root", "root");
String q0 = "Select userId from user ORDER BY userId DESC LIMIT 1"; //get ID of last
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(q0);
if(rs.next()){
ID = rs.getInt("userId");
ID++;
}
else
ID=1; // Empty Table, so start with ID 1
rs.close();
st.close();
String q1="insert into user values(?,?,?)";
PreparedStatement ps = cn.prepareStatement(q1);
//ps.setInt(1,ID);
ps.setString(1,username);
ps.setString(2,password);
ps.setString(3,role);
ps.executeUpdate();
ps.close();
}
}catch(Exception e){
System.err.println(e.getMessage());
e.printStackTrace();
}
DB_close();
//if(userId!=-1)
// return userId;
return -1;
}
public static boolean enterUsername(int userId, String firstname, String lastname){
try{
Class.forName("com.mysql.jdbc.Driver");
cn = DriverManager.getConnection("jdbc:mysql://localhost/log", "root", "root");
//String q1="INSERT INTO user_profile values(?,?,?)";
String q1 = "INSERT into user_profile (userId, firstname, lastname) VALUES (?,?,?)";
PreparedStatement ps = cn.prepareStatement(q1);
ps.setInt(1, userId);
ps.setString (1, firstname);
ps.setString (2, lastname);
ps.executeUpdate();
ps.close();
return true;
}catch(Exception e){
System.err.println(e.getMessage());
e.printStackTrace();
}
DB_close();
return false;
}
这是我的数据库结构。
编辑:发现问题,数据库结构不正确。
CREATE TABLE
user
(userId
int(3)NOT NULL AUTO_INCREMENT,
username
varchar(20)DEFAULT NULL,password
varchar(20)DEFAULT NULL,role
varchar(20)DEFAULT NULL,PRIMARY KEY(userId
),
UNIQUE KEYusername
(username
));CREATE TABLE
user_profile
(userId
int(3)NOT NULL DEFAULT'0',firstName
varchar(20)DEFAULT NULL,lastName
varchar(20)DEFAULT NULL,PRIMARY KEY(userId
),CONSTRAINTFK
FOREIGN KEY (userId
)参考user
(userId
));
答案 0 :(得分:0)
使用
String q1 = "INSERT into user_profile (firstname, lastname) VALUES (?,?)";
因为你的第一个字段是auto increment
..因此它会在插入值时自动递增值。
我推荐这种方式,
删除当前表并创建一个像这样的新表
id-->int(30) (AUTO INCREMENT) NOTNULL //Dont need to take care of this field
USER_ID-->int(30) NOT NULL //you should create your own ID and increment it before adding a new person
username-->varchar(100)
password-->varchar(100)
role-->varchar(100)
通常,调用userId与您的代码完全相同,
String q0 = "Select userId from user ORDER BY USER_ID DESC LIMIT 1"; //get ID of last
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(q0);
if(rs.next()){
ID = rs.getInt("USER_ID ");
ID++;
}
答案 1 :(得分:0)
不应该按照方法enterUsername
中的部分进行操作ps.setInt(1, userId);
ps.setString (1, firstname);
ps.setString (2, lastname);
是这样的
ps.setInt(1, userId);
ps.setString (2, firstname);
ps.setString (3, lastname);
答案 2 :(得分:0)
我没有看到您发布的错误消息的原因。
但我看到其他一些看似问题的事情:
ps.setInt(1, userId); ps.setString (1, firstname); ps.setString (2, lastname);
索引是错误的:而不是1,1,2,它应该是1,2,3。 (坦率地说,我不知道代码可能如何发布。)
顺便说一句,这在其他方法中看起来也是错误的:
insert into user values(?,?,?)
由于该表有3列以上,您需要指定其名称,
就像你在enterUsername
中所做的那样。