0

我正在使用这个 SQL 语句来获取行:

SELECT firstname, lastname 
FROM myTable 
WHERE ((lastname LIKE '" + parameter + "%')

parameter从文本框获取值。文本框的默认值为" "

我的问题是当文本框中没有输入任何内容时,我得到了所有行。我试着用

WHERE lastname = 

这只是给了我所有的记录" "

获取在数据库中排除空白的数据的正确方法是什么,并且当空白或“”作为参数传递时也不给您任何记录

4

4 回答 4

2

您正在使用通配符,因此对于空白搜索字符串,您最终会得到

... WHERE lastname LIKE '%'

这将匹配一切。如果没有在搜索表单中输入任何内容,您应该简单地在脚本级别检测到,而不是运行查询,例如在 php-ish 术语中:

if (strlen($_GET['keywords']) == 0) {
   die("No search terms entered");
}
于 2012-12-12T17:13:02.863 回答
1
SELECT firstname, lastname
FROM myTable
WHERE lastname LIKE '" + parameter + "%'
AND NULLIF(lastname,'') IS NOT NULL
AND '" + parameter + "' <> ''

很简单,只返回姓氏以“参数”开头的记录,并且只返回“参数”不是空字符串的记录。

编辑:添加了要求它永远不会返回具有空白姓氏的记录的代码。

于 2012-12-12T17:13:49.250 回答
1

首先,我希望你做一些清理以避免 sql 注入。

然后您可以选择:

  • 如果包含 trim() 的清理参数为空,则不运行查询
  • SELECT firstname, lastname FORM myTable WHERE ((lastname LIKE '" + parameter + "%') AND ''<>'" + parameter + "'"

从性能角度来看,第二个是一种不好的做法,它会假设你已经放弃了消毒(非常糟糕)

您还应该注意,在您的清理过程中,您必须转义或删除特殊字符 _ 和 %,请参阅 http://msdn.microsoft.com/en-us/library/ms179859(v=sql.105)。 aspx

我不处理这个,等于 % 的非空参数将导致 a like '%%',相当于like '%'

于 2012-12-12T17:15:06.440 回答
0

好吧,您可以只在代码中的参数变量上测试 string.IsNullOrEmpty,这样您甚至不需要进行数据库调用。

在我看来,这是最有效的做法。

于 2012-12-12T17:11:37.093 回答