使用while循环将值添加到数组中

时间:2012-04-01 15:07:55

标签: php mysql arrays while-loop

所以我要做的就是创建一个实时的朋友搜索。要做到这一点,我需要一个AJAX名称数组来搜索。

继承我的循环。

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?

4 个答案:

答案 0 :(得分:2)

您无法回显数组。您可以使用print_r($friends)显示查询中请求的整行字段(您请求*) 或者您可以回显$friends['name'](取决于您在数据库中声明名称的方式)

答案 1 :(得分:1)

您有语法错误:

$FREINDS = array();应为$FRIENDS = array();

还有:

$FRIENDS = $REQUEST_ROW['USERNAME']应为$FRIENDS[] = $REQUEST_ROW['USERNAME']

echo $FRIENDS;应为echo json_encode( $FRIENDS );

答案 2 :(得分: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将输出您需要循环数组的arrayecho json_encode($FRIENDS);来查看某些内容

您确定USERNAME是大写的,而不仅仅是小写小写的username以及表名。

我认为您可以使用JOIN子句而不是使用SQL请求

答案 3 :(得分:1)

PHP实际上不会回显数组。如果对数组进行回声,则输出“Array”。另外,如果PHP数组以这种方式传递,你的javascript就不知道如何处理它。

尝试:

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.";
    }
}