1

我有一个脚本最多可将 3 个命令行参数传递给 MySQL 查询。它正在查询的表是职业运动员和他们所从事的运动的列表。我在命令行中的参数设置为 -s(用于运动)-i(用于整数)和 -l(用于字母)。

-s 是一个直接的字符串搜索(所以 'Hockey' 返回在 sport 下列出了 'Hockey' 的球员), -i 是一个整数,并且搜索应该返回名字是小于或等于的字符数的球员我的整数,-l 是一个字母,这样搜索就会返回名字以 a 和 '-l' 之间的字母开头的玩家。

目前我的搜索如下:

"Select * from Players_Sport where Sport like '$lsport_search' AND length(Player)<='$linteger_search' AND Player between 'a%' and '$lletter_search%'"

现在这在整数和字母参数不为空时有效,尽管在运动字段为空白时它确实有效。我明白为什么它不起作用(它正在检查 length(Player) < null 和 Player 在 a% 和 null 之间)。我有什么办法可以让它在不为每个可能的迭代编写 if 条件的情况下工作?

4

1 回答 1

1

首先——表中的 Player 和 Sport 列不应该为 NULL。以你设置的方式让一个没有运动的球员是没有意义的。在您的 CREATE TABLE 中,请务必将这些字段设置为 NOT NULL。

其次,您的程序是否总是需要 -s、-i 和 -l ?如果是这样,请像这样编写您的查询

SELECT * FROM Players_Sport
WHERE
Sport = '$lsport_search'
AND LEN(Player) <= '$linteger_search'
AND Player BETWEEN 'A' AND '$lletter_search'

如果 -s、-i 和 -l 并不总是在那里,那么只使用您需要的选项来构建您的查询。您还可以使用各种 LEN、OR、CASE 等,但它会变得很难看。

SELECT * FROM Players_Sport
WHERE
(Sport = '$lsport_search' OR LEN('$lsport_search') = 0)
AND (LEN(Player) <= '$linteger_search' OR LEN('$linteger_search') = 0)
AND (Player BETWEEN 'A' AND '$lletter_search' OR LEN('$lletter_search') = 0)

最后但并非最不重要的一点,就像其他人所说的那样,最终您需要小心 $lsport_search 之类的内容不包含特殊字符。有时顽皮的人会去在字符串中间插入一个',打开恶作剧的大门。

于 2013-05-16T05:51:56.407 回答