Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中错误的SQL_Java_Mysql_Sql_Syntax - Fatal编程技术网

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参考。简言之,准备好的语句只会在以下情况下产生错误: