跟踪sql查询的ajax错误

时间:2010-06-30 21:57:43

标签: sql mysql database ajax

我正在CMS软件的范围内工作,它会自动生成一个查询,以便在谷歌建议中使用输入字段。

提供的字段工作正常,他们使用的查询使用两个表的内连接。

我正在尝试进行一个只从一个表中获取信息的查询,并将返回firstname,lastname或者护照号码的结果。

目前,它在某些情况下有效,而在其他情况下无效,我无法找到原因。原因肯定与查询有关,因为包含的查询没有这个问题。

目前,如果我输入'r',它会显示罗伯特威尔逊和雷巴罗的客人的结果,护照号码,名字和姓氏都与正确的字段匹配。

如果我输入'wi',它会返回robert wilson的结果,但如果我输入'wil'则不返回任何内容。

此外,仅输入'wi'会导致显示护照号码而不是姓氏。

除了查询不能正常工作外,还有一些奇怪的错误。如果我输入'%'或'b',那么我会收到有关语法错误的javascript警报。

在包含的查询中使用'%'或'b'工作正常,错误肯定与我的查询有关,我只是在弄清楚导致它的原因时遇到了麻烦。

查询是从存储在表中的一组较小查询中自动生成的,我之前在SO上发布过这些查询。如果有人能指出我为什么生成的查询有这种零星结果的方向,我将非常感激。

SELECT COUNT(IF(guests.passport               != '', CONCAT(guests.passport , IF
       (guests.lastname                                            != ''
OR     guests.lastname              != '', CONCAT(' (',IF(guests.lastname != '',
       guests.lastname, '{blank}'),', ',IF(guests.firstname        != '',
       guests.firstname, '{blank}'),')'), '')), IF(guests.lastname != ''
OR     guests.lastname                                             != '',
       CONCAT(IF(guests.lastname                                   != '',
       guests.lastname, '{blank}'),', ',IF(guests.passport         != '',
       guests.passport, '{blank}')), ''))) AS thecount
FROM   guests
WHERE  (
              guests.id!=0
       )
AND
       (
              (
                     guests.firstname LIKE 's%'
              OR     guests.lastname  LIKE 's%'
              OR     guests.passport  LIKE 's%'
              )
       OR
              (
                     (
                            guests.firstname LIKE 's%'
                     OR     guests.firstname LIKE '% s%'
                     OR     guests.lastname  LIKE 's%'
                     OR     guests.lastname  LIKE '% s%'
                     OR     guests.passport  LIKE 's%'
                     OR     guests.passport  LIKE '% s%'
                     )
              )
       )
SELECT DISTINCT IF(guests.passport             != '', CONCAT(guests.passport ,IF
                (guests.lastname                                           != ''
OR              guests.lastname     != '', CONCAT(' (',IF(guests.lastname != '',
                guests.lastname, '{blank}'),', ',IF(guests.firstname      != '',
                guests.firstname, '{blank}'),')'), '')), IF(guests.lastname !=
                ''
OR              guests.lastname          != '', CONCAT(IF(guests.lastname != '',
                guests.lastname, '{blank}'),', ',IF(guests.passport!= '',
                guests.passport, '{blank}')), '')) AS display  ,
                `guests`.`uuid`                    AS value    ,
                1                                  AS secondary,
                guests.id                          AS classname
FROM            guests
WHERE           (
                                guests.id!=0
                )
AND
                (
                                (
                                                guests.firstname LIKE 's%'
                                OR              guests.lastname  LIKE 's%'
                                OR              guests.passport  LIKE 's%'
                                )
                OR
                                (
                                                (
                                                                guests.firstname
                                                                LIKE 's%'
                                                OR
                                                                guests.firstname
                                                                LIKE '% s%'
                                                OR              guests.lastname
                                                                LIKE 's%'
                                                OR              guests.lastname
                                                                LIKE '% s%'
                                                OR              guests.passport
                                                                LIKE 's%'
                                                OR              guests.passport
                                                                LIKE '% s%'
                                                )
                                )
                )
ORDER BY        IF(guests.passport             != '', CONCAT(guests.passport ,IF
                (guests.lastname                                           != ''
OR              guests.lastname     != '', CONCAT(' (',IF(guests.lastname != '',
                guests.lastname, '{blank}'),', ',IF(guests.firstname      != '',
                guests.firstname, '{blank}'),')'), '')), IF(guests.lastname !=
                ''
OR              guests.lastname          != '', CONCAT(IF(guests.lastname != '',
                guests.lastname, '{blank}'),', ',IF(guests.passport!= '',
                guests.passport, '{blank}')), ''))
LIMIT           0, 8

我希望格式化正常......我使用了格式化工具,但我并不确定格式化SQL的标准方法....

如果有任何帮助,所有这些都与phpBMS模块有关。

以上查询是输入's'的结果

1 个答案:

答案 0 :(得分:0)

我在我的网站上做了类似的事情,我发现使用REGEXP而不是LIKE更可取,因为你不必担心开头和结尾的%符号等。

一个简单的方法:

SELECT * FROM table WHERE value REGEXP 'searchval'

最后一个关于名字的问题 - 确保搜索名字,姓氏和第一个/最后一个连接。我在第一次和最后一次独立搜索,无法弄清楚为什么全名会导致找到0条记录。