带有用户输入的 SQL 查询

Posted

技术标签:

【中文标题】带有用户输入的 SQL 查询【英文标题】:SQL query with user input 【发布时间】:2016-08-13 03:39:23 【问题描述】:

我有一个错误

java.sql.SQLException: ORA-00933: SQL 命令未正确结束

当我尝试执行以下 SQL 语句时。

在此语句中,它应该在搜索客户名称时显示特定客户的所有租赁详细信息和反馈。 “查询”是指用户在数据库中搜索姓名(CustomerName)时的用户输入。

 SELECT c.CustomerName, r.Rental_ID, r.Staff_ID, r.RentalDate, r.DueDate,
 r.Customer_ID, f.Description 
 FROM Rental r, Customer c, FeedBack f 
 WHERE f.Customer_ID = r.Customer_ID 
 AND c.Customer_ID = f.Customer_ID 
 ORDER BY DueDate 
 WHERE CustomerName like "+ query +";

出了什么问题?

【问题讨论】:

我希望您不要直接将用户提供的名称附加到您的查询中,而是使用PreparedStatements 以避免明显的 sql 注入漏洞。 @E.Wong 你的 ORDER BY 应该在 where 子句更改这些地方并检查之后。 嗯,是的,我已经准备好了声明,只是没有包含在我的问题中。哈哈。 xD 啊,我明白了,会这样做并尝试一下。谢谢。 :) 【参考方案1】:

因为你在错误的地方有 WHEREORDER BY 子句;不仅您的查询中实际上有两个 WHERE 子句。应该只有一个。 WHERE 应该先出现,然后是 order by。应该是

WHERE CustomerName like "+ query +"
ORDER BY DueDate;

也作为旁注,

    考虑使用参数化查询 修改您的查询以使用 ANSI 标准 JOIN 语法而不是旧式语法。

您的查询应如下所示

SELECT c.CustomerName, r.Rental_ID, 
r.Staff_ID, r.RentalDate, 
r.DueDate, r.Customer_ID, f.Description
FROM Rental r  
JOIN FeedBack f ON f.Customer_ID = r.Customer_ID
JOIN Customer c ON c.Customer_ID = f.Customer_ID
WHERE c.CustomerName like "+ query +"
ORDER BY r.DueDate;

【讨论】:

啊,我明白了。我的导师教我旧式语法,所以我使用它,但感谢您的解释。 :)

以上是关于带有用户输入的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

带有 IN 子句的 SQL 查询的 MYSQL 查询优化

如何在带有 php 用户输入的 SQL 中使用 like 运算符? [复制]

如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果

基于Java中用户输入的SQL查询[重复]

如何使用用户输入和通配符编写 sql 查询

根据用户输入查询 SQL 表以返回同一行的值