我正在使用php和mySQL。我有一个不起作用的选择查询。我的代码是:
$bookquery = "SELECT * FROM my_books WHERE book_title = '$book' OR book_title_short = '$book' OR book_title_long = '$book' OR book_id = '$book'";
代码搜索多种标题类型并在大多数时间返回所需的引用,除非书的名称以数字开头。虽然很少见,但我的一些书名都采用了#34; 2 Book"的形式。在这种情况下,查询只会查看" 2",假设它是" book_id"并返回数据库中的第二个条目,而不是" 2 Book"的条目。类似于" 3 Book"返回第三个条目,依此类推。我很困惑为什么选择这样做,但更重要的是,我不知道如何解决它。
答案 0 :(得分:3)
如果您的表格中有一列数字数据类型(可能是INT
),那么您的搜索策略对于以数字开头的$book
值会奇怪地发挥作用。你发现了这个。
以下表达式始终在SQL中返回true。这不直观,但确实如此。
99 = '99 Luftballon'
那是因为,当你将一个整数与一个字符串进行比较时,MySQL会隐式地这样做:
CAST(stringvalue AS INT)
并且,以整数文本开头的字符串的强制转换始终返回整数的值。例如,
的值CAST('99 Luftballon' AS INT)
是99.因此,如果您查找该搜索字词,您将获得图书ID 99.
尝试将INT
列与不以整数开头的文本字符串进行比较是没有意义的,因为CAST('blah blah blah' AS INT)
始终返回零。为了使您的搜索策略更好地运行,您应该考虑从搜索查询中省略OR book_id = '$book'
,除非您知道$book
的整数是一个数字。
答案 1 :(得分:1)
正如其他人所说,我的PHP允许来自浏览器的数字入口和文本条目。然后我的查询很困难,通过截断结尾将我的一些文本条目解释为数字。因此,我的“2 Book”被解释为数字“2”,然后被查询以在数据库中找到第二本书。为了解决这个问题,我在PHP中创建了一个简单的if语句,以便我的查询只查找文本或数字。因此,就我而言,我的解决方案是:
if(is_numeric($book)){
$bookquery = "SELECT * FROM books WHERE book_id = '$book'";
}else{
$bookquery = "SELECT * FROM books WHERE book_title = '$book' OR book_title_short = '$book' OR book_title_long = '$book'";
}
这很有效,我正在快乐地编码。感谢@OllieJones和其他人提出的问题和想法,这些帮助我看到我需要以不同的方式解决问题。
答案 2 :(得分:-2)
不确定这是否是您的正确答案,但您似乎只在搜索中搜索确切的值。您是否考虑过针对标准进行更通用的搜索?比如...
$bookquery = "SELECT * FROM my_books WHERE book_title LIKE '".$book."' OR book_title_short LIKE '".$book."' OR book_title_long LIKE '".$book."' OR book_id LIKE '".$book."'"
如果您正在进行某种搜索,您甚至可能希望确保找到搜索键之前的字符,就像这样....
$bookquery = "SELECT * FROM my_books WHERE book_title LIKE '%".$book."' OR book_title_short LIKE '%".$book."' OR book_title_long LIKE '%".$book."' OR book_id LIKE '%".$book."'"
%
是一个特殊的字符,它可以让您搜索要搜索的字符,然后在搜索标准中找不到任何字符......例如{{ 1}}在查询之前有$book = "any"
,%
公司'%".$book."'"`` would return both
任意`。
如果您需要,可以添加and also the word
到最后也是这样,`'%"。$ book。"%'" ``它会对搜索键的开头和结尾做同样的事情