java - 选择参数=?但如果?是一个空格,返回该列的任何值

标签 java mysql servlets request prepared-statement

从我的请求中接收一些字符串、整数和日期,例如:

String city = request.getParameter("city");

这些值是用户在我的网站中写入的值。问题是,如果我的用户不想填写输入,例如城市,查询应该考虑城市可以是任何值。因为我要在我的 request.getParameter 中得到一个空格(如果用户没有填写输入文本),我试图告诉查询如果一个参数是一个空格,它必须返回任何值(value)。我试过:

String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR ? = '')AND init_date <= ? AND end_date >= ? AND (price = ? OR ? = '') AND (guests = ? OR ? = '')"; 

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city);
stmt.setString(2, city);
stmt.setDate(3, new java.sql.Date(initDate.getTime()));
* and so on... *

查询运行,但未返回任何外壳。如果 ? 绑定(bind)到一个空格参数,我如何指定它可以是任何值?

PD:我不想构建动态 WHERE 子句,从查询中添加或删除内容。

最佳答案

在您的代码中,您试图将列名作为参数传递,但这不起作用。
您只能为列传递值。

我为您的问题提出了另一种解决方案。

考虑这个更简单的语句:

String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR 1 = ?)

(1) 如果用户输入了一个有效值,那么您的代码将是:

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city_text);
stmt.setString(2, 0);

所以 WHERE 子句看起来像:

WHERE (city = city_text OR 1 = 0)

由于 1 = 0 始终为 false,因此剩余部分 city = city_text 将获取所需的行。

(2) 如果用户没有输入值,那么您的代码将是:

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, "");
stmt.setString(2, 1);

所以 WHERE 子句看起来像:

WHERE (city = '' OR 1 = 1)

因为 1 = 1 始终是 true,所以整个 boolean 语句 (city = '' OR 1 = 1) 将是 true 所以它甚至不存在。

因此您必须检查输入或未输入的值并调整参数以在任何情况下通过。

这只是一个想法,您可以将其扩展为更多列。

关于java - 选择参数=?但如果?是一个空格,返回该列的任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53327101/

相关文章:

mysql - 解释查询 - MySQL 不使用表中的索引

java - "PUT"请求与 oauth2

java - 使用 XPath 查询搜索字符串的一部分

java - 在接收泛型作为参数的方法中使用泛型类

javax.命名.NameNotFoundException : Name ejb/com not found in context "java:comp/env"

mysql - 在 MySQL 中生成随机 BLOB

mysql - 如何将MySql查询结果存储在MyBatis中的变量中

java - doGet 在 servlet 中不起作用

tomcat - 在@WebServlet ("Hello"处出现错误)有人对此有任何想法吗?

java - Android 如何在一行中显示 TextView 和 EditText?