参数化查询中的 JavaScript 错误

Posted

技术标签:

【中文标题】参数化查询中的 JavaScript 错误【英文标题】:JavaScript error in Parameterized query 【发布时间】:2015-08-29 20:22:16 【问题描述】:

这是我正在尝试做的事情(现在已经有一天多了:(用户单击书名的链接,我阅读了该书的名称。然后我使用该书名并发出 Ajax 请求泽西资源。在该泽西资源中,我调用 POJO 类中的一个方法,其中一个方法与数据库交互并将数据发送回泽西资源。我有很多错误,但我已经能够修复它们一次。我目前遇到的错误是:

您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以了解在“?”附近使用的正确语法在第 1 行

这是我的 JavaScript 代码:

function dealWithData(nameOfBook)

    var bookName = encodeURI(nameOfBook);

    console.log("http://localhost:8080/library/rest/books/allBooks/"+bookName);

    var requestData = 

            "contentType":  "application/json",
            "dataType":     "text",
            "type":         "GET",
            "url":          "http://localhost:8080/library/rest/books/allBooks/"+bookName

**//beforeSend has been added as an edit to original code**

beforeSend: function (jqXHR, settings) 
              var theUrlBeingSent = settings.url;
              alert(theUrlBeingSent);

    ;

    var request = $.ajax(requestData);

    request.success(function(data) 

        alert("Success!!");
    );

    request.fail(function(jqXHR, status, errorMessage) 
        if((errorMessage = $.trim(errorMessage)) === "") 
            alert("An unspecified error occurred.  Check the server error log for details.");
        
        else 
            alert("An error occurred:  " + errorMessage);
        
    );

出于某种原因,在上面的代码中,console.log 行显示带有空格的 url 被编码为 %20,而在变量 'requestData' 中,url 没有该编码。我无法理解为什么。

这是我的资源的代码:

@GET
    @Path("/allBooks/bookName")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getBook(@PathParam("bookName") String bookName)

        System.out.println("Book name is: "+ bookName);
        BookInformation bookInfo = new BookInformation();
        String bookInformation =bookInfo.bookInformation(bookName);

        ResponseBuilder responseBuilder = Response.status(Status.OK);
        responseBuilder.entity(bookInformation);

        Response response = responseBuilder.build();
        return response;
    

这里是 bookInformation 方法:

public String bookInformation(String bookName)

        String infoQuery = "Select * from bookinfo where name = ?";
        ResultSet result = null;
        conn = newConnection.dbConnection();    
        try
           
            preparedStatement = conn.prepareStatement(infoQuery);
            preparedStatement.setString(1, bookName);
            result = preparedStatement.executeQuery(infoQuery);
        
        catch (SQLException e)
        
            e.printStackTrace();
        
        try
        
            if(result != null)

                while(result.next())

                    availability = result.getString("availability");
                    isbn = result.getInt("isbn");
                    hardback = result.getString("hardback");
                    paperback = result.getString("paperback");
                    name = result.getString("name");

                
            
            else
                System.out.println("No result set obtained");
            
        
        catch (SQLException e)
        
            e.printStackTrace();
        
        //I will build this String using a String builder which I will return
String finalBookInformation = information.toString();
                    return finalBookInformation;
    

早些时候,在 dataType 中,我有 json,它抛出了一个不同的错误,但我意识到我没有构建 json,所以我将 dataType 更改为 text 并且该错误消失了。我的参数化查询没有执行。如果我尝试对数据库中的值进行硬编码,它可以正常工作,但当我使用准备好的语句时就不行了。我最终想返回 JSON,但现在我只想让它工作。任何帮助将不胜感激。我已经尝试过研究并尽我所能,但它不起作用。是导致问题的编码吗?是我的 Ajax 调用吗?任何帮助表示赞赏。谢谢。

【问题讨论】:

【参考方案1】:

似乎问题出在您的数据库查询执行中,请替换代码

preparedStatement = conn.prepareStatement(infoQuery);
preparedStatement.setString(1, bookName);
result = preparedStatement.executeQuery(infoQuery);

preparedStatement = conn.prepareStatement(infoQuery);
preparedStatement.setString(1, bookName);
result = preparedStatement.executeQuery();

【讨论】:

【参考方案2】:

如果在 url 中找到空格,您正在使用 HTTP GET 方法和 GET 方法自动 %20。

如果您将方法类型更改为 POST,它应该可以为您找到。

【讨论】:

如果我在我的 Ajax 请求中将 GET 更改为 POST 并且在 Resource 类中类似地,它仍然会给出相同的错误。 请在将书名添加到 url 之前提醒它,并让我知道它提示什么 被警告的名称与被点击的链接文本相同。如果我的书名是哈利波特,那么它会以与链接中完全相同的格式提醒它,哈利波特 你不认为“哈利波特”之间的空格会产生 %20 吗? 我不确定。根据您的指示,我在发布的代码中提醒了作为 nameOfBook 传递给 javascript 函数的书名。发出警报后,我对 uri 进行编码,我认为这就是添加 %20 而不是那个空间的原因。【参考方案3】:

您可以使用 HTTP GET,但正如您所发现的那样,它会 encode the URL。您将需要在服务器端解码 URL。有关如何执行此操作,请查看:How to do URL decoding in Java?。

【讨论】:

当我签入 bookInformation 方法时,传递的 bookName 没有任何 %20。代码能够访问正确的资源,因为 bookInformation 方法位于该资源中。我认为这意味着它确实到达了正确的网址。我是否正确地思考和理解了这一点,还是我完全错了? 在上面的 JavaScript 中添加 beforeSend 后,我现在可以看到发送到服务器的 URL 已编码。你是对的。但是在您给出的示例链接中,它已经有 String url。我将如何在 bookInformation 方法中访问我的 Java 类中的 URL?此外,这种解码将如何帮助我解决我收到的错误。我很困惑!

以上是关于参数化查询中的 JavaScript 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 在 Excel 中的 SQL 表上使用参数化查询

解析参数化查询C#时出错[重复]

Oracle 的 C# 参数化查询 - 严重且危险的错误!

参数个数错误(参数化查询)

Javascript ADO 记录集打开方法不起作用。参数化查询

来自 .Net 的 Oracle 参数化查询