2015-03-13 9 views
0

Я очень злюсь на это, поэтому я обращаюсь за помощью к толпе;)Почему этот SQL-Statement приводит к ошибке?

Что я хочу сделать: У нас есть обучающая игра Unity, в которой будет реализовано окно входа в систему. Введенные учетные данные затем хэшируются (pw) и отправляются на сервер, которые затем должны проверять это на базе данных.

У меня есть следующая таблица:

xy.users_confirms со следующей colums:

имя пользователь электронного идентификатора пароль хэш созданного

Почему мой код

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

привести меня SQLException "Индекс параметров вне диапазона (1> число параметров, которое равно 0)"

?

Спасибо, любой ввод очень ценится!

+0

Интересно, может ли запятая после 'pwhash'' и до' from' вызвать проблему. Сказав это, вы должны использовать «PreapredStatement». См. [Использование подготовленных выражений] (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html) для получения более подробной информации. – MadProgrammer

+0

Привет, извините, строка sql затем подготовлена ​​с помощью инструкции PreparedStatement = connection.prepareStatement (SQL); – N30

ответ

1

Попробуйте это:

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

Вы используете varchar значение в качестве параметра, так что это нужно Quot, как это. 'username'. или вы можете использовать Stored Procedure.

+0

Да, правда. Это явно одинарная кавычка. Но все же, хотя это утверждение работает внутри phpMyAdmin, оно выполняется через Java ..... – N30

1

Лично я попробовал бы получить рабочий запрос с помощью пользовательского поля запроса непосредственно в phpmyadmin. После того, как у вас есть рабочий запрос, вы можете переписать его в java.

И я хотел бы попробовать писать синтаксис, как это в поле PHPMyAdmin запроса:

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

Используя приведенный выше синтаксис, я не вижу в любом случае ваша ошибка может сохраняться.

PHPMYADMIN экран крышка коробки показывает пользовательский запрос: http://screencast.com/t/9h8anH0Aj (в 2 пустые текстовые поля в крышке экрана только я прятал свою информацию базы данных)

+0

Привет, Дрю, ты прав, по крайней мере частично. Запрос phpMyAdmin работает, но когда я его копирую и использую инструкцию PreparedStatement = connection.prepareStatement (sql); в строке, которую я скопировал из QueueBox phpMyAdmin, ошибка сохраняется, к сожалению. :( – N30

+0

Эй, @ N30, да, это то, чего я ожидал на самом деле, и почему я предложил сначала тестирование в phpmyadmin. С яркой стороны - теперь вы знаете, что основная структура запросов - это не проблема. Это означает, что у вас есть проблема с string concatenation или с подготовленным оператором в java. – DrewT

+0

Для следующего шага я рекомендую 2 вещи: 1) проверьте, что ваши vars и ваша строка выводятся в том же формате, что и ваш рабочий запрос phpmyadmin. (например, используя 'System.out.println (sql);' или что-то еще). 2) убедитесь, что вы можете выполнять ЛЮБЫЕ запросы с помощью синтаксиса подготовленного оператора mysql. Попробуйте выполнить другой очень простой запрос (например, '' SELECT * FROM table') и убедитесь, что вы можете вернуть ЛЮБЫЕ результаты mysql, используя формат подготовленного оператора, который у вас есть. – DrewT

1

Запятая после pwhash является одним из потенциальных причин:

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

в зависимости от СУБД, вам может понадобиться использовать одинарные кавычки вместо двойных кавычек, как это:

 + "'userNameToGetHashFor'"; 

Также этот код потенциально уязвим для атаки SQL Injection, поэтому вы можете захотеть сделать userNameToGetHashFor параметром, а не конкатенировать строку в инструкции SQL.

Смежные вопросы