2011-07-03 4 views
0
<?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; 
} 
?> 

결과는 두 개의 select 쿼리의 결과를 보여줍니다. 왜 $frenusername2의 값은 $userinfo120['username'];이고 $userinfo120['frenusername'];입니까?mysql 유니온의 이상한 결과

+0

'$ query120'입니까? 나는 진심으로 당신이 120 개의 다른 병을 가지기를 희망합니다. 게다가, 왜 당신은 적절한 오류 처리를 수행하는 데이터베이스 (PDO 또는 자체 작성된)에 대한 래퍼를 사용하지 않는가? '또는 die (mysql_error())'는 적절하지 않습니다. – ThiefMaster

+0

나는 120 가지 다른 병을 가지고있다. LOL. 필자는 SQL 주입을 피하기 위해 Prepare 문에 대해 많이 읽었지만 PDO를 수행하는 방법을 모르겠습니다. 왜 또는 죽는가 (mysql_error())가 적절하지 않은가? – zac1987

+0

반복되는 코드가 많아서 오류를 기록하거나 사용자의 눈에 보이지 않게 할 수도 있습니다. 그리고 120 병에 대해서 : 왜 같은 것을 사용하지 않겠습니까?당신은 오래된 것들을 지킬 필요가 없습니다. – ThiefMaster

답변

0

좋아 ... 나는 물지 만,이 사이트가 제공 할 수있는 것보다 많은 도움이 필요하다. 아마도 책이나 SQL, MySQL 및 PHP에 대한 세 ...

질문에 : SQL UNION 당신이 생각하는대로하고 있지 않습니다. 데이터베이스에 SELECT sql 쿼리를 보내면 요청한 데이터가있는 행이 0 개 이상 반환됩니다. 각 행은 명세서의 SELECT 절 (SELECTFROM 사이)에 지정된 열 수를 갖습니다.

쿼리에는 한 열만 있습니다 (username).

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

$username2 = 'userb', 다음을 : 당신이 UNION를 사용하는 경우, friendship의 데이터는 다음과 같습니다 가정, 당신은 (아마도) 두 번째 쿼리에 행을 추가 할 수 있지만 열 이름은 변경되지 않기 때문에 '는 다음과 같이 두 개의 행을 얻을 것이다 :

username 
-------- 
usera 
userc 

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

의 결과와 인 두 번째 행되는 첫 번째 행 많은에 대한 Mysql documentation를 참조

username 
-------- 
userc 
userb 

을 제공

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

하지만 UNION 실제로 결과 집합에서 중복을 제거합니다

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

에서 결과는 $username2 = 'usera' 경우와 같은 결과를 예상 할 수있다 , 훨씬 더. 간단히 말해서 UNION은 두 개의 개별 데이터 세트 (친구로 $username2, 친구로는 $username2 명이있는 한 세트의 사람들이있는 한 세트)를 얻고 자 할 때 꼭 필요한 방법입니다.

보너스로 다른 PHP 페이지 (예 : include() 등 사용)에 PHP 페이지를 포함하지 않는 한 같은 페이지에서 동일한 변수 이름을 사용하기 때문에 걱정할 필요가 없습니다 AJAX 스크립트.

그리고 예, POST 또는 GET HTTP 요청에서 직접 데이터를 사용하는 경우 SQL 주입에 대해 걱정해야합니다. 즉, $_POST 또는 $_GET의 값에서 $username2이 할당되고 질문에서 제공하는 코드보다 먼저 테스트하지 않으면

+0

"UNION이 반드시 두 개의 별도 데이터 세트를 얻고 싶을 때가는 길은 아님"에 대한 귀하의 설명을 좋아합니다. UNION은 첫 번째 선택 영역에 두 개의 개별 데이터 세트를 결합하는 것 같습니다. 이것이 $ frenusername2가 두 데이터 세트를 모두 보유한 이유입니다. 고맙습니다. – zac1987