【问题标题】:Why does this SQL-Statement lead to an error?为什么这个 SQL 语句会导致错误?
【发布时间】:2015-05-15 09:48:09
【问题描述】:

我对此很生气,所以我向人群寻求帮助;)

我想做的:我们有一个 Unity 学习游戏,它应该实现一个登录窗口。然后对输入的凭据进行哈希处理(密码是)并发送到服务器,然后服务器应根据数据库进行检查。

我有下表:

xy.users_confirms 包含以下列:

id 用户名电子邮件密码哈希码创建

为什么我的代码

String sql = "SELECT " + "xy.users_confirms.password as pwhash, "
                        +"FROM xy.users_confirms "  +"WHERE xy.users_confirms.username = " +"\"userNameToGetHashFor\"";

引导我到 SQLException "Parameter index out of range (1 > number of parameters, which is 0)"

?

谢谢,非常感谢您的任何意见!

【问题讨论】:

  • 我想知道pwhash, 之后和from 之前的逗号是否会导致问题。话虽如此,您应该使用PreapredStatement。更多详情请见Using Prepared Statements
  • 嗨,对不起,字符串 sql 然后用 PreparedStatement statement = connection.prepareStatement(sql); 来准备;

标签: java sql phpmyadmin


【解决方案1】:

试试这个:

 String parameter = "'"+ strNameToGetHashFor + "'";
 String sql = "SELECT " + "xy.users_confirms.password as pwhash, "
             +"FROM xy.users_confirms "  
             +"WHERE xy.users_confirms.username ="+ parameter;

您使用varchar 值作为参数,因此需要像这样引用'username'。或者你可以使用Stored Procedure

【讨论】:

  • 是的,没错。它肯定是单引号。但是,即使该语句在 phpMyAdmin 中有效,它也是通过 Java 实现的.....
【解决方案2】:

就个人而言,我会尝试直接在 phpmyadmin 中使用自定义查询框获取有效查询。一旦你有了一个有效的查询,你就可以用 java 重写它。

我会尝试将这样的语法写入 phpmyadmin 查询框:

SELECT password as pwhash
FROM xy.users_confirms
WHERE username ='userNameToGetHashFor'

使用上面的语法,我看不出你的错误可能会持续存在。

显示自定义查询框的 Phpmyadmin 屏幕截图:http://screencast.com/t/9h8anH0Aj (屏幕上的 2 个空文本框只是我隐藏了我的数据库信息)

【讨论】:

  • 嗨,德鲁,你是对的,至少部分是对的。 phpMyAdmin 请求有效,但是当我复制它并使用 PreparedStatement statement = connection.prepareStatement(sql);在我从 phpMyAdmin 的 QueueBox 复制的字符串上,错误仍然存​​在 - 不幸的是。 :(
  • 嘿@N30,是的,这正是我所期望的,也是我建议首先在 phpmyadmin 中进行测试的原因。从好的方面来说 - 现在你知道你的基本查询结构不是问题。这意味着您要么遇到字符串连接问题,要么遇到 java 中的预处理语句问题。
  • 对于下一步,我推荐 2 件事:1) 检查您的 vars 和您的字符串是否以与您的工作 phpmyadmin 查询相同的格式输出。 (例如使用System.out.println(sql); 或其他)。 2) 验证您是否可以使用 mysql 准备好的语句语法进行任何查询。尝试输出另一个非常简单的查询(例如"SELECT * FROM table)并检查您是否可以使用您拥有的准备好的语句格式返回任何mysql结果。
【解决方案3】:

pwhash 后面的逗号是一个潜在的原因:

       + "xy.users_confirms.password as pwhash*!*,*!* "

根据 DBMS,您可能还需要使用单引号而不是像这样的双引号:

       + "'userNameToGetHashFor'";

此外,此代码可能容易受到 SQL 注入攻击,因此您可能希望将 userNameToGetHashFor 作为参数而不是将字符串连接到 SQL 语句中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2012-05-14
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多