Java中错误的SQL
我正试图在Java中错误的SQL,java,mysql,sql,syntax,Java,Mysql,Sql,Syntax,我正试图在Java中运行SQL语句,并获得语法 String number,key; //populate number and key. rs = stmt.executeQuery("select count(*) from users_transition where phoneNumber =" +number +"and randKey="+key); 在MySQL数据库中,ph
Java
中运行SQL
语句,并获得语法
String number,key; //populate number and key.
rs = stmt.executeQuery("select count(*)
from users_transition
where phoneNumber =" +number +"and randKey="+key);
在MySQL
数据库中,phoneNumber
是BigInt(20)
,key
是Int(11)
另外,据报道,。表5.1表明,MYSQl中的类型可以转换为Java中的类型。相反的方法也行吗
这是错误
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“randKey=9999”附近使用的正确语法
数字与
和运算符之间缺少空格:
rs = stmt.executeQuery("select count(*) from users_transition where phoneNumber =" +number +" and randKey="+key);
// ^
您应该用准备好的语句替换查询,并使用查询参数。这不仅可以帮助您避免像这样的简单错误,还可以使您的代码免受SQL注入攻击
String sql = "select count(*) from users_transition where phoneNumber =? and randKey=?";
PreparedStatement getCount = con.prepareStatement(sql);
getCount.setBigDecimal(1, new BigDecimal(number));
getCount.setBigDecimal(2, new BigDecimal(randKey));
数字与和运算符之间缺少空格:
rs = stmt.executeQuery("select count(*) from users_transition where phoneNumber =" +number +" and randKey="+key);
// ^
您应该用准备好的语句替换查询,并使用查询参数。这不仅可以帮助您避免像这样的简单错误,还可以使您的代码免受SQL注入攻击
String sql = "select count(*) from users_transition where phoneNumber =? and randKey=?";
PreparedStatement getCount = con.prepareStatement(sql);
getCount.setBigDecimal(1, new BigDecimal(number));
getCount.setBigDecimal(2, new BigDecimal(randKey));
我会告诉你哪里出了问题,然后我会告诉你哪里出了问题
怎么了
首先,您正在构建一个查询,其中缺少空格(可能还缺少引号):
字符串编号、键//填充数字和键。
rs=stmt.executeQuery(“选择计数(*)”
+“来自用户\u转换”
+“其中phoneNumber=“+number+”和randKey=“+key)”;
//^您错过了一个空格
什么地方出了问题
您的查询容易受到攻击(请阅读链接,它提供了一个幽默的示例和解决问题的技巧)。请使用准备好的语句来执行此类操作:
字符串编号、键;
PreparedStatement ps=conn.prepareStatement(“选择计数(*))
+“来自用户\u转换”
+“其中phoneNumber=?”
+“和randKey=?”;
//问号是值的占位符
//可以使用setXXX()方法指定此值
ps.setString(1,编号);
ps.setString(2,randKey);
结果集rs=ps.executeQuery();
//对结果集执行任何需要执行的操作
我会告诉你哪里出了问题,然后再告诉你哪里出了问题
怎么了
首先,您正在构建一个查询,其中缺少空格(可能还缺少引号):
字符串编号,键;//填充编号和键。
rs=stmt.executeQuery(“选择计数(*)”
+“来自用户\u转换”
+“其中phoneNumber=“+number+”和randKey=“+key)”;
//^您错过了一个空格
什么地方出了问题
您的查询易受攻击(请阅读链接,它提供了一个幽默的示例和解决问题的提示)。使用准备好的语句来完成这类工作:
字符串编号、键;
PreparedStatement ps=conn.prepareStatement(“选择计数(*))
+“来自用户\u转换”
+“其中phoneNumber=?”
+“和randKey=?”;
//问号是值的占位符
//可以使用setXXX()方法指定此值
ps.setString(1,编号);
ps.setString(2,randKey);
结果集rs=ps.executeQuery();
//对结果集执行任何需要执行的操作
您会遇到什么错误?实际上,和
@user432之前可能缺少空格。这就是错误所在。@user432我本来打算删除这个问题,但现在有了答案,我不能了。:/不管怎样,谢谢。你有什么错误?实际上,和
@user432之前可能缺少空格。这就是错误所在。@user432我本来打算删除这个问题,但现在有了答案,我不能了。:/无论如何,谢谢。这个链接解释了为什么PreparedStatement不容易受到SQL注入攻击吗?请阅读它(并笑一笑)。。。它说,如果你不使用事先准备好的声明(并且遇到一个聪明的混蛋),会发生什么。预先准备好的语句会清理您在其中输入的任何内容,从而确保不会利用查询中有缺陷的安全性执行任何恶意代码;当您将查询文本与其参数分离时,它还可以帮助您编写更清晰、更易于维护的代码;它还进行显式类型转换(setString()
,setInt()
,setDouble()
,等等)。。。在字符串的情况下,它消除了引用。。。有很多优点,你不觉得吗?是的。。请参阅此java参考。简言之,PreparedStatement只会在语句中插入内容时产生错误,而如果创建了语句字符串,则可能会错误地执行多个语句。该链接是否解释了PreparedStatement为什么不容易受到SQL注入攻击?请阅读它(并笑一笑)。。。它说,如果你不使用事先准备好的声明(并且遇到一个聪明的混蛋),会发生什么。预先准备好的语句会清理您在其中输入的任何内容,从而确保不会利用查询中有缺陷的安全性执行任何恶意代码;当您将查询文本与其参数分离时,它还可以帮助您编写更清晰、更易于维护的代码;它还进行显式类型转换(setString()
,setInt()
,setDouble()
,等等)。。。在字符串的情况下,它消除了引用。。。有很多优点,你不觉得吗?是的。。请参阅此java参考。简言之,准备好的语句只会在以下情况下产生错误: