如果用户在表1&2-这很好用。然而,如果所述用户在两个表中都没有信息,那么我的变量返回时未定义。
因此,我想调用我的INNER JOIN查询,如果Table1的行为空,它将调用第二个查询来显示Table2的结果。
(表2肯定存储了信息。表1是可选的,取决于用户)
我还想显示来自表1&2如果另一个用户在这两个方面都有信息,我似乎无法让它工作。以下是我迄今为止所拥有的;
$sql="SELECT * FROM Table1 INNER JOIN Table2 ON Table1.username = Table2.username WHERE Table1.username='" . $_SESSION['username']['1'] . "'";
$result=MySQL_Query($sql);
if (mysql_num_rows($result)==0)
{
$sql2"SELECT * FROM Table2 WHERE username='" . $_SESSION['username']['1'] . "'";
$result2=MySQL_Query($sql2);
}
while ($rows=mysql_fetch_array($result)($result2))
{
$Username = $rows['username'] ." ";
$Email = $rows['email'] . " ";
}
echo $Email; ?>
您可以用外部联接重写查询,如下所示:
select
t1.desired_info
t2.desired_info
from
table2 as t2
left outer join
table1 as t1
on (t2.username = t1.username)
where
t2.username = target_username;
where子句将把结果集缩小到感兴趣的用户,如果target_username不存在,则返回0行。如果该用户不在该表中,则t2.desired_info将始终返回,而t1.desired.info将为null。
您可以先在php代码中检查p1.desired_info,如果没有出现,则使用p2.desired.
回显使用OUTER JOIN的建议,该建议将左表中的所有选定行连接到右侧的匹配行,如果右侧没有匹配行,则连接到空行。
此外,我已经重写为使用PDO和一个准备好的语句,向您展示它是如何完成的。变量$dbhost
、$dbname
、$dbuser
和dbpassword
中的值由代码提供。
<?php
$dsn = "mysql:host=$dbhost;dbname=$dbname";
$dbh = new PDO($dsn, $dbuser, $dbpassword);
$sql = "SELECT *
FROM table2 t1
LEFT JOIN table1 t1 ON t1.username = t2.username
WHERE t2.username = :username";
// prepare() parses and compiles the query. Syntax error come out here.
$stmt = $dbh->prepare($sql);
// bindValue() handles quoting, escaping, type-matching and all that crap for you.
$stmt->bindValue(':username', $_SESSION['username']['1']);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_BOTH))
{
$Username = $rows['username'] ." ";
$Email = $rows['email'] . " ";
// and then do something useful with them
}
在这里使用预先准备好的语句提供了一种针对SQL注入攻击的重要保护措施。和往常一样,我把错误处理留给读者练习。