2011-07-03 121 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 union的奇怪輸出

+0

'$ query120'?我真的很希望你沒有120個不同的變數。除此之外,爲什麼不使用數據庫的包裝器(PDO或自寫的東西),它會執行適當的錯誤處理。 '或死(mysql_error())'是沒有用的。 – ThiefMaster

+0

我確實有120個不同的變量。大聲笑。我不知道如何去做PDO,儘管我已經閱讀了很多關於Prepare語句以避免sql注入的問題。爲什麼或者死亡(mysql_error())不正確? – zac1987

+0

因爲它有很多重複的代碼,您甚至無法記錄錯誤或將其從用戶眼中隱藏起來。關於120個變量:爲什麼不使用同一個變量?你不需要保留舊的東西。 – ThiefMaster

回答

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非常重要的, 多得多。總之,當你想獲得兩個獨立的數據集(一組人以$username2作爲朋友,一組人以$username2作爲朋友)時,UNION不一定是要走的路。

作爲一種獎勵,除非您在其他php頁面(使用include()等)中包含php頁面,那麼您不必擔心僅僅因爲頁面被相同的訪問而使用相同的變量名稱AJAX腳本。

是的,如果直接從POST或GET HTTP請求使用數據,則應該擔心SQL注入。 (即,如果$username2是從$_POST$_GET中的值分配的,並且您未在您提供的問題代碼之前對其進行測試)

+0

我喜歡你對「當你想獲得兩個獨立的數據集時UNION不一定要走的路」的解釋。我猜UNION只是把兩個獨立的數據集合到第一選擇的領域。這就是爲什麼$ frenusername2擁有這兩組數據。謝謝。 – zac1987