2015-01-17 27 views
1

我已经作出,它发送2个值的搜索字段:具有多个使用连接LIKES

  1. 电话号码
  2. 汽车登记号码

两个字段是必需的和独特的。电话号码在表A中,汽车注册号码在表2中。表格以PersonID加入。这是主要的,独特的和表1,而不是表2中的主要和独特的,但价值相同。

我正在使用SELECT,以确保这是一个匹配项,如果电话号码和车号不属于同一个人,我会回声插入的数据不正确。

SELECT * 
FROM Person 
LEFT OUTER JOIN Car on Car.PersonID 
WHERE Phonenumber LIKE ".$_POST['phonenumber']." AND 
WHERE Carregnumber LIKE ".$_POST['carregnumber']."; 

这不会给我任何结果。

我也曾尝试:

SELECT * 
FROM Person 
WHERE Phonenumber LIKE ".$_POST['phonenumber']." 
LEFT OUTER JOIN Car on Car.PersonID 
WHERE Carregnumber LIKE ".$_POST['carregnumber']."; 

两个领域与$ _ POST定义。当我只使用:SELECT * FROM Person WHERE Phonenumber LIKE ".$_POST['phonenumber']."它会给我结果。

我有点儿JOIN新,我已经通过一些教程告诉我内部,外部和左连接之间的区别。所以我不完全确定,如果我做得很好(嗯,我猜不是,否则我会得到数据)

我在正确的方向,或者我必须使用查询类似的查询我发现堆栈溢出:

SELECT airline, flt_no, fairport, tairport, depart, arrive, fare 
FROM (SELECT * FROM flights 
    INNER JOIN airports 
    ON flights.fairport = airports.code 
    WHERE (airports.code = '?' OR airports.city='?')) AS matches 
INNER JOIN airports 
ON matches.tairport = airports.code 
WHERE (airports.code = '?' OR airports.city = '?') 

我试图编辑上述查询我自己的情况,但也给了我空白的结果。

编辑:谢谢你的意见,我已经调整了我的查询:

SELECT * 
FROM Person 
INNER JOIN Car on Car.PersonID = Person.PersonID 
WHERE BSNNummer = ".$_POST['phonenumber']." 
AND Kenteken = ".$_POST['carregnumber']." 

这个查询仍然给我空白的结果,我按照从注释中的指示,我看到我做错了什么,但不幸的是它看起来我仍然有一个不完整的查询。

+0

在你的第一个查询中,你应该说WHERE x和y(不是WHERE x和WHERE y)。您还会在这里获得很多有关SQL注入攻击的评论 - 将任意表单值直接插入到sql中会带来很大的安全风险。 –

+0

谢谢,我刚刚尝试过,但仍然给我空白的结果。我意识到安全风险,这对我来说理解使用JOIN更重要,之后我将着手解决安全风险。 – John

+0

好的 - 很多其他潜在的问题。您的JOIN需要包含两个表。所以,像ON Person.PersonID = Car.PersonID。此外,现在你有一个外部联接(它表示你想要所有匹配的Person记录,但只有Car记录匹配联接。但是,然后在你的WHERE子句中有Car表,这使得隐式INNER JOIN不在其中。因此,我认为你需要两个表之间的INNER JOIN。最后,LIKE子句用于匹配一个模式(它将包含一些通配符)。所以,为什么不仅仅与= –

回答

1

我要拉一些上面我的意见到这里的答案,所以我可以提供更多的格式,等等

为你正在尝试做的,可能是这样形成的阱查询:

SELECT 
    Person.PersonID 
    , Person.Phonenumber 
    , Car.Carregnumber 
FROM 
    Person INNER JOIN 
    Car ON Person.PersonID = Car.PersonID 
WHERE 
    Person.PhoneNumber = '123-456-7890' 
AND Car.Carregnumber = '123456' 

几个要点:

  1. 在选择,它并不总是必要的,但与他们的表前缀指定列一个好主意。如果数据库在表格之间没有冲突,那么数据库可以处理名称,但是使用前缀可以使您的查询与将来可能会破坏的某些更改保持一致。

  2. 在JOIN,我们必须指定如何加入两个表

  3. 同样的加入,因为我们需要从两个表中的值匹配,我们将做这一个INNER JOIN。即使我们将它作为一个外连接,包括WHERE中的两个表都会产生一个隐式内连接。

  4. 在WHERE中,我们使用等号运算符(不是LIKE)。我们关心一个具体的价值 - 如果某件事符合某种模式,那么不是。

  5. 同样在WHERE中,如果我们比较的字段是字符数据,则这些值需要用单引号引起来。我不知道你的数据的类型,所以这可能不适用。

我认为你应该做的 - 尝试建立一个硬编码值(如上所示)的查询并获得工作。然后,引入你的变量值并从那里开始。最后,使用参数(如你的第二个例子)来避免sql注入。

+0

非常感谢你,你的答案是非常清楚..它帮助我有一个在这种情况下的其他看法..尤其是你最后的评论关于第一个建设硬编码的价值观让我意识到我必须从那开始在开始。另外,您的其他意见,非常有帮助,我的数据正在收集中! – John

相关问题