2012-04-01 172 views
0

所以我想要做的是創建一個實時的朋友搜索。要做到這一點,我需要一個AJAX名稱的數組進行搜索。使用while循環將值添加到數組中

繼承人我的while循環。

if($_REQUEST['D'] == 'viewfriends') { 
    $FREINDS = array(); 
    $FRIENDS_QUERY = "SELECT * FROM `FRIENDS` WHERE `USER` = '{$Modules['User']->Username}' AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10 ;"; 
    $FRIENDS_RESULT = mysql_query($FRIENDS_QUERY); 
    if(mysql_num_rows($FRIENDS_RESULT) > 0) { 
     while($FRIENDS_ROW = mysql_fetch_assoc($FRIENDS_RESULT)) { 
      $sql = "SELECT * FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}' ;"; 
      $REQUEST_ROW = mysql_fetch_assoc(mysql_query($sql)); 
      $FRIENDS = $REQUEST_ROW['USERNAME']; 
     } 
    echo json_encode($FRIENDS); 
    } else { 
     echo'<div class="update status">Sorry, You have no friends at this time. sadface.</div>'; 
    } 
} 

我把echo $FRIENDS在那裏作爲測試,現在它不顯示任何內容。我在哪裏derp?

+1

這是您的實際代碼?這裏有一個拼寫錯誤:'$ FREINDS = array();' – 2012-04-01 15:10:50

+2

你的代碼對SQL注入是開放的,並且你爲什麼使用古老的'mysql_ *'函數? – 2012-04-01 15:10:55

+0

由於它只是從數據庫請求信息,所以我很困惑於注入。以及古代mysq函數的含義是什麼? – 2012-04-01 15:12:24

回答

1

試試這個:

if($_REQUEST['D'] == 'viewfriends') { 
    $FRIENDS = array(); 
    $USERNAME = $Modules['User']->Username; 
    $SQL_QUERY = "SELECT F.*, U.* FROM FRIENDS AS F LEFT JOIN USER AS U ON F.USER = U.USERNAME WHERE F.USERNAME = '{$USERNAME}' AND STATUS = 'accepted' ORDER BY F.ID LIMIT 10"; 
    $RESULTS = mysql_query($SQL_QUERY); 
    if(mysql_num_rows($RESULTS) > 0) { 
     while($ROW = mysql_fetch_assoc($RESULTS)) {   
      $FRIENDS[] = $ROW['USERNAME']; 
     } 
     echo json_encode($FRIENDS); 
    } else { 
     echo'<div class="update status">Sorry, You have no friends at this time. sadface.</div>'; 
    } 
} 

$FRIENDS[] = $REQUEST_ROW['USERNAME']; 

然後print_r($FRIENDS);echo將輸出array你需要循環數組或echo json_encode($FRIENDS);看到的東西

還你確定USERNAME是大寫,而不僅僅是username小寫字母小寫以及表名。

此外我認爲你可以使用,而不是與SQL一個JOIN條款要求

+0

啊謝謝你!但現在它只輸出null。大聲笑。 – 2012-04-01 15:15:01

+0

是的,我對其他功能使用相同的QUERY。我做所有我的表和列在SQL作爲大寫,以避免這:)。 – 2012-04-01 15:16:52

+0

@DJ_Plus:看到更新,並讓我知道。 – 2012-04-01 15:30:09

1

你有語法錯誤:

$FREINDS = array();應該$FRIENDS = array();

而且也:

$FRIENDS = $REQUEST_ROW['USERNAME']應該$FRIENDS[] = $REQUEST_ROW['USERNAME']

而且

echo $FRIENDS;應該echo json_encode($FRIENDS);

+0

謝謝。但不幸的是它並沒有解決我的陣列問題。 – 2012-04-01 15:13:54

+0

@DJ_Plus查看我的更新。 – Engineer 2012-04-01 15:18:04

+0

是的!你太棒了!這工作完美:) – 2012-04-01 15:19:19

2

你不能迴應一個數組。您可以使用print_r($friends)以顯示查詢(您請求*)必填字段的整排 或者你可以重複$friends['name'](取決於你如何宣告你的數據庫名稱)

1

的PHP不會實際回聲出數組。如果你做一個數組的回聲,它會輸出「數組」。加上你的JavaScript不知道如何處理PHP數組,如果它確實通過了這種方式。

嘗試:

echo(json_encode($FRIENDS)); 

此外,你應該認真傾聽的意見反饋。你的代碼很容易受到攻擊,並且不能很好地擴展這樣一個潛在巨大的應用程序。

您有幾個問題會讓您的代碼更安全或效率更低。最明顯的低效率是你在while循環中進行數據庫調用,所以如果某人有10個朋友,這意味着當你只需要一個或兩個朋友時,你已經完成了11個數據庫查詢。下面是這兩個疑問:

SELECT * FROM `FRIENDS` 
WHERE `USER` = '{$Modules['User']->Username}' 
AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10 

SELECT * FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}' 

所以我們決定之前,如果這兩個可以結合起來,第一大紅旗是SELECT *。我一直都在使用它,但它會讓你踢出更好的數據庫吧。在你的情況下,這是真的沒有必要。我們從第二個查詢中知道,您從第一個查詢中唯一使用的是$FRIENDS_ROW['FRIEND'],與USERNAME匹配。所以,首先查詢可以成爲:

SELECT FRIEND FROM `FRIENDS` 
WHERE `USER` = '{$Modules['User']->Username}' 
AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10 

您還可以在第二個查詢的SELECT *,我們可以告訴大家,(現在):您使用的唯一的事情就是USERNAME,因此它可以變成:

SELECT USERNAME FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}' 

最後,我們可以從第二個查詢中看到FRIEND的名稱和USERNAME是相同的;否則爲什麼要查詢用戶名等於朋友名稱的用戶名。如果是這樣,我們可以完全放棄第二個查詢,因爲我們已經知道第一個查詢的用戶名。

它既低效又不安全的原因是因爲您正在使用OG mysql函數,這些函數笨重且不提供預準備語句的選項。準備好的語句讓你(除其他事項外)以這樣的方式在查詢中放入變量,即當你實際調用查詢時,變量的部分是已知的,因此可以進行消毒,避免每個人都提到的mysql注入的恐怖。

我不會與播放的播放來煩你,但這裏是你的代碼是什麼樣子,如果你使用了新的mysqli庫用事先準備好的聲明:

if($_REQUEST['D'] == 'viewfriends') { 

    $friends = array(); 

    $friend_lookup = $mysqli->prepare("SELECT FRIEND FROM FRIENDS WHERE 
               USER = ? AND STATUS = 'accepted' 
               ORDER BY FRIEND"); 

    $friend_lookup -> bind_param('s', $userName); 
    $userName = $Modules['User']->Username; 

    $friend_lookup -> execute(); 
    $friend_lookup -> bind_result($friend); 

    while($friend_lookup -> fetch()) { 
     $friends[] = $friend; 
    } 

    if($friends) { 
     echo json_encode($friends); 
    } else { 
     echo "Sorry, no friends. Boo."; 
    } 
} 
+0

謝謝,並試圖找出我的脆弱?如果我不明白,我真的很抱歉,我真的很欣賞這裏的任何人給我建議。 – 2012-04-01 15:27:24

+0

我使用了json_encode函數,因爲你說你正在尋找一個ajax解決方案。顯然,如果你只是想確認數組正在被構建,那麼這並不好,在這種情況下,使用'print_r()'。但你的JavaScript會更好地理解JSON。 – Anthony 2012-04-01 15:44:12

+0

好吧,我明白json_encode但每個人都一直說我的代碼容易受到攻擊?這是爲什麼? – 2012-04-01 15:52:30