Java 在搜索栏中使用单引号

Java 在搜索栏中使用单引号,java,mysql,sql,search,quotes,Java,Mysql,Sql,Search,Quotes,我试图在我的SQL数据库中搜索条目,但每当我在搜索栏中输入一个引号并运行它时,我就会得到一个错误。当我键入一个特定的名称时,它会从数据库返回正确的条目。我读过关于使用“”、转义和使用预先准备好的语句的内容,但要么没有一个答案适合我的情况,要么我在概念上不理解某些东西。(我是初学者)提前谢谢!:) 下面是我的jsp文件的代码,当我运行时它是什么样子,当我插入一个引号时会发生什么 <%@page import="java.sql.*"%> <%@ page language="ja

我试图在我的SQL数据库中搜索条目,但每当我在搜索栏中输入一个引号并运行它时,我就会得到一个错误。当我键入一个特定的名称时,它会从数据库返回正确的条目。我读过关于使用“”、转义和使用预先准备好的语句的内容,但要么没有一个答案适合我的情况,要么我在概念上不理解某些东西。(我是初学者)提前谢谢!:)

下面是我的jsp文件的代码,当我运行时它是什么样子,当我插入一个引号时会发生什么

<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>List of Entries</title>
</head>
<body>
    <h1>Retrieve Data</h1>
    <form method="post" action="index.jsp">
        Search <input type="text" name="search"
            placeholder="Enter your search here..." /> 
            <input type="submit"
            value="Search" name="submit"/>
    </form><br><br>
    <%
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        ResultSet rs2 = null;


        try {
            String searchReq = request.getParameter("search");
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //make connection to db
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/profile", "root", "");

            //create a statement
            stmt = con.createStatement();

            //executes SQL query
            rs = stmt.executeQuery("SELECT * FROM person WHERE Name LIKE '%"+ searchReq +"%'");
    %>

    <table border="1">
        <tr>
            <td><b>Name</b></td>
            <td><b>Birthday</b></td>
            <td><b>Address</b></td>
            <td><b>Gender</b></td>
            <td><b>School</b></td>
        </tr>

        <%
            try {
                    while (rs.next()) {
        %>

        <tr>
            <td><%=rs.getString("Name")%></td>
            <td><%=rs.getString("Birthday")%></td>
            <td><%=rs.getString("Address")%></td>
            <td><%=rs.getString("Gender")%></td>
            <td><%=rs.getString("School")%></td>
        </tr>

        <%
            }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        %>

    </table>
    <%
        }

        catch (Exception e) {
            e.printStackTrace();
        }

        finally {

            rs.close();
            stmt.close();
            con.close();

        }
    %>
</body>
</html>

条目列表
检索数据
搜寻


名称 生日 地址 性别 学校


您的主要问题是:

"SELECT * FROM person WHERE Name LIKE '%"+ searchReq +"%'"
当变量
searchReq
包含单引号时,您正在创建sql查询:

SELECT * FROM person WHERE Name LIKE '%'%'
                                       ^ sql engine consider this as end of string literal
当数据库尝试分析此查询时,它会从人名为“%”的人名中找到正确的部分
SELECT*,然后找到无效的部分
%

这与纯java中的相同,如果您想声明内部带有
的字符串,请尝试:

String s = "my string with " quote";
                           ^ java considers this as end of string literal
您将得到语法错误消息,您需要转义这样的符号,对于java,它是
\“

因此,要解决此问题,您需要使用参数化查询或检查:

:=|

:=

因此,单引号应作为双单引号出现/转义
'

因此,如果您只是将所有的
'
替换为
'
,您将摆脱sql注入并修复失败的查询

最简单的方法是
searchReq=searchReq.replaceAll(“”,“”)

但是,sql运算符
一样,有两个额外的特殊符号
%
\uuu

如果未指定,则p中的每个字符表示任意字符说明符,p中的每个字符表示任意字符串说明符,p中既不是字符也不是字符的每个字符表示自身

考虑一下,如果用户输入这些符号,您的查询将发现什么

提示:请看一下标准:

::=[不]像[逃跑]


阅读本文,不要在查询中使用字符串,使用参数。还有,您使用的是什么SQL?(SQL Server、MYSQL、Oracle)@Chuck MYSQL。对不起,字符串更紧是什么意思?请改用
PreparedStatement
。并从JSP页面中删除所有Java代码和SQL语句。该逻辑应该在servlet或自定义标记中。哇,感谢您提供了完整的答案!:)然而,我仍然不能完全确定如何处理这个问题information@episkeyyy暂时试着忘记java,只需创建不同的sql查询,创建测试行,其中%在其中签名,然后尝试构造类似的查询,该查询将只返回此行,而不是所有行