奇怪的输出mysql联合

时间:2011-07-03 10:59:47

标签: mysql

<?php
$query120 = "(SELECT username FROM friendship WHERE frenusername='{$username2}') UNION (SELECT frenusername FROM friendship WHERE username='{$username2}')";
$result120 = mysql_query($query120,$connection) or die (mysql_error());
confirm_query($result120); 
while($userinfo120 = mysql_fetch_array($result120)){
    $frenusername2= $userinfo120['username'];
    echo $frenusername2;
}
?>

输出显示两个选择查询的结果。为什么$frenusername2的值为$userinfo120['username'];$userinfo120['frenusername'];

1 个答案:

答案 0 :(得分:0)

好的......我会咬人,但你需要比这个网站给你更多的帮助。也许是关于sql,mysql和php的一本书还是三本......

对于你的问题:sql UNION没有做你认为它正在做的事情。当您向数据库发送SELECT sql查询时,它会返回包含您请求的数据的0行或更多行。每行将包含在语句的SELECT子句中指定的列数(SELECTFROM之间)。

在您的查询中,您只有一列username。当您使用UNION时,您(可能)使用第二个查询添加更多行,但列名称不会更改,因此,假设friendship中的数据如下所示:

username | frenusername
---------|-------------
usera    | userb
usera    | userc
userb    | userc
userc    | usera

$username2 = 'userb',然后你会得到两行,如下所示:

username
--------
usera
userc

第一行是

的结果
SELECT username FROM friendship WHERE frenusername='{$username2}'

,第二行是

的结果
SELECT frenusername FROM friendship WHERE username='{$username2}'

如果$username2 = 'usera',您可能会期望得到如下结果:

username
--------
userc
userb
userc

但是UNION实际上从结果集中删除了重复项,提供了

username
--------
userc
userb

查看Mysql documentation了解更多内容。但简而言之,UNION并不一定是您想要获得两个单独的数据集(一组有$username2作为朋友的人和一组人$username2的方式。 1}}作为朋友)。

作为奖励,除非你在其他php页面中包含php页面(使用include()等),否则你不必担心因为正在访问页面而使用相同的变量名称通过相同的AJAX脚本。

是的,如果您直接使用POST或GET HTTP请求中的数据,您应该担心SQL注入。 (即,如果从$username2$_POST中的值中分配了$_GET,并且您未在问题中提供的代码之前对其进行测试,那么