2015-07-20 7 views
0

У меня есть статический HTML-документ, который отправляет форму в сервлет Java. Затем сервлет принимает значения формы и пересылает их в базу данных SQL. Однако проблема в том, что база данных утверждает, что значение имеет значение null, когда я уверен, что значение не равно нулю.Почему метод request.getParameter() возвращает значение null?

Вот форма:

<form method="post" action="Handler" target="_blank" enctype="multipart/form-data"> 
    <div class="row uniform 50%"> 
    <div class="6u 12u(mobilep)"> 
     <input type="text" name="name" id="name" placeholder="Username" /> 
    </div> 
    <div class="6u 12u(mobilep)"> 
     <input type="email" name="email" id="email" placeholder="Email" /> 
    </div> 
    </div> 
    <div class="row uniform 50%"> 
    <div class="6u 12u(mobilep)"> 
     <input type="password" name="password" id="password" placeholder="Password" /> 
    </div> 
    </div> 
    <div class="row uniform 50%"> 
    <div class="12u"> 
     <textarea name="bio" id="bio" placeholder="Describe yourself" maxlength="200" rows="3"></textarea> 
    </div> 
    </div> 
    <div class="row uniform"> 
    <div class="12u"> 
     <ul class="actions align-center"> 
     <li><input type="submit" value="Send Message" /></li> 
     </ul> 
    </div> 
    </div> 
</form> 

Вот код сервлета:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    Connection c = null; 
    PrintWriter op = response.getWriter(); 
    response.setContentType("text/html"); 

    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     c = DriverManager.getConnection(DB_URL, "root", "root"); 
    }catch(Exception s){ 
     op.println("<html>"); 
     op.println("<body><h1><strong>"+ "Error: "+ s +"</strong></h1></body>"); 
     op.println("</html>"); 
    } 

    String username = request.getParameter("name"); 
    String email = request.getParameter("email"); 
    String pass = request.getParameter("password"); 
    String bio = request.getParameter("bio"); 
    String proPicName = "false"; 
    Long time = System.currentTimeMillis(); 
    String sysTime = time.toString(); 

    Statement stmt = null; 

    try{ 
     stmt = c.createStatement(); 
     stmt.execute("USE dvlpr;"); 
     stmt.execute("INSERT INTO user_tbl (username, email, password, bio, pro_pic, last_on, date_created)" + " VALUES ("+username+", "+email+", "+pass+", "+bio+", "+proPicName+", "+sysTime+", "+sysTime+");"); 


     op.println("<html>"); 
     op.println("<body><h1><strong>Connection made! Username: " + username+ " Email: " + email+ " Your account has been created. We'll keep your password private, too. Thanks!</strong></h1>"); 
     op.println("</body>"); 
     op.println("</html>"); 
    }catch(Exception s){ 
     op.println("<html>"); 
     op.println("<body><h1><strong>"+ "Error: "+ s +"</strong></h1></body>"); 
     op.println("</html>"); 
    } 

} 

Код ошибки ниже:

Error:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'username' cannot be null

Почему это возвращение нулевой?

+2

Переключите с помощью [ 'PreparedStatement's ] (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html), и ваша проблема, скорее всего, исчезнет. (В противном случае каждое значение должно быть окружено одной цитатой ('' ')) –

+0

Вы проверили« имя пользователя »в отладчике? Является ли оно установленным или нулевым? Кстати, @MickMnemonic прав о PreparedStatements. – Keammoort

+0

Вы действительно знаете, что 'request.getParameter' возвращает null? Или вы предполагаете, что это потому, что база данных выдает ошибку? – Brandon

ответ

1

Параметры в порядке. Запрос не выполняется должным образом из-за синтаксиса. Значения сами должны быть окружены кавычками, поэтому он должен выглядеть следующим образом:

VALUES('"+username+"',.... 

Как вы можете видеть, что я добавил один ' до отметки двойной котировки и один после того, как так ' будет частью полученной строки. Как и в любой другой SQL-вставке, вы бы сделали VALUES('MyUsername', 'MyPassword',...);.

Кроме того, вы можете использовать один выполнить метод вместо 2, и было бы:

stmt.execute("USE dvlpr; INSERT INTO...."); 

А также нет необходимости в + до " VALUES

+1

Несмотря на то, что этот ответ на практике «исправляет» проблему, (только) правильный способ сделать это через параметризованный SQL (т. Е. С помощью «PreparedStatement»). Помните [Bobby Tables] (https://xkcd.com/327/)? –

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