为了账号安全,请及时绑定邮箱和手机立即绑定

超出范围的java.sql.SQLException参数索引(1>参数,即0)

超出范围的java.sql.SQLException参数索引(1>参数,即0)

守候你守候我 2019-06-23 14:52:36
超出范围的java.sql.SQLException参数索引(1>参数,即0)在对我选择的组合框进行验证后,我无法将它插入到我的数据库中。Tomcat给出了以下错误:异常:参数索引超出范围(1>参数,即0)。这是如何造成的,我如何解决呢?
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

调用任何一个setXxx()方法PreparedStatement,而sql查询字符串没有任何占位符。?为了这个。

例如,这是不对:

String sql = "INSERT INTO tablename (col1, col2, col3) VALUES (val1, val2, val3)";
// ...preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, val1);
 // Fail.preparedStatement.setString(2, val2);preparedStatement.setString(3, val3);

您需要相应地修复SQL查询字符串以指定占位符。

String sql = "INSERT INTO tablename (col1, col2, col3) VALUES (?, ?, ?)";
// ...preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, val1);preparedStatement.setString(2, val2);
preparedStatement.setString(3, val3);

注意,参数索引以1你知道需要引用这样的占位符:

String sql = "INSERT INTO tablename (col1, col2, col3) VALUES ('?', '?', '?')";

否则,仍然会得到相同的异常,因为SQL解析器会将它们解释为实际的字符串值,因此无法找到占位符。

另见:


查看完整回答
反对 回复 2019-06-23
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

就像错误信息说的,$qSelect似乎不是一个物体。尝试通过使用var_dump($qSelect);在你打电话之后。也检查一下getDBH()还你需要的。

听起来好像准备调用失败了(不知道为什么),所以它会返回false - false不是一个对象,所以您不能调用bind_param()在那上面。

编辑:您没有提供信息,但看起来您使用的是PHP的PDO。在这种情况下,请看一看文献.

如果数据库服务器成功地准备了该语句,PDO:prep()将返回一个PDOStatement对象。如果数据库服务器无法成功地准备语句,则PDO:PRIMPLE()返回false或发出PDOException(取决于错误处理)。

您应该将服务器配置为返回那些PDO异常,这将告诉您准备调用失败的原因。


查看完整回答
反对 回复 2019-06-23
?
森林海

TA贡献2011条经验 获得超2个赞

嗯,原因之一prepare()如果发送给它的SQL语句在当前DB中无效,则可以失败。

prepare()然后返回FALSE。

如果表名不正确或者查询中的一个或多个字段不存在。.


查看完整回答
反对 回复 2019-06-23
  • 3 回答
  • 0 关注
  • 2281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信