Php 使用while循环向数组中添加值

Php 使用while循环向数组中添加值,php,mysql,arrays,while-loop,Php,Mysql,Arrays,While Loop,所以我想做的是创建一个实时好友搜索。为此,我需要一组名称供AJAX搜索 这是我的while循环 if($_REQUEST['D'] == 'viewfriends') { $FREINDS = array(); $FRIENDS_QUERY = "SELECT * FROM `FRIENDS` WHERE `USER` = '{$Modules['User']->Username}' AND `STATUS` = 'accepted' ORDER BY `ID` Limit

所以我想做的是创建一个实时好友搜索。为此,我需要一组名称供AJAX搜索

这是我的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>';   
    }
}
if($\u请求['D']=='viewfriends'){
$FREINDS=array();
$FRIENDS_QUERY=“从`FRIENDS`中选择*,其中`USER`='{$Modules['USER']->Username}'和`STATUS`='accepted'订单由`ID`限制10;”;
$FRIENDS\u RESULT=mysql\u query($FRIENDS\u query);
如果(mysql\u num\u行($FRIENDS\u RESULT)>0){
while($FRIENDS\u ROW=mysql\u fetch\u assoc($FRIENDS\u RESULT)){
$sql=“从`USERS`中选择*,其中`USERNAME`='{$FRIENDS\u行['FRIENDS']}';”;
$REQUEST\u ROW=mysql\u fetch\u assoc(mysql\u query($sql));
$FRIENDS=$REQUEST_行['USERNAME'];
}
echo json_编码($FRIENDS);
}否则{
echo‘对不起,你现在没有朋友,sadface’;
}
}
我将echo$FRIENDS放在那里作为测试,现在它没有显示任何内容。我在哪里读到的?

您有语法错误:

$FREINDS=array()
应该是
$FRIENDS=array()

而且:

$FRIENDS=$REQUEST\u行['USERNAME']
应该是
$FRIENDS[]=$REQUEST\u行['USERNAME']

echo$FRIENDS
应该是
echo json\u encode($FRIENDS)

您有语法错误:

$FREINDS=array()
应该是
$FRIENDS=array()

而且:

$FRIENDS=$REQUEST\u行['USERNAME']
应该是
$FRIENDS[]=$REQUEST\u行['USERNAME']

echo$FRIENDS
应该是
echo json\u encode($FRIENDS)

尝试以下操作:

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>';   
    }
}
然后
print\r($FRIENDS)
echo
将输出
array
您需要循环数组或
echo json\u encode($FRIENDS)查看某些内容

另外,您是否确定
USERNAME
是大写的,而不仅仅是
USERNAME
的小写以及表名

另外,我认为您可以使用
JOIN
子句,而不是对SQL请求执行操作

尝试以下操作:

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>';   
    }
}
然后
print\r($FRIENDS)
echo
将输出
array
您需要循环数组或
echo json\u encode($FRIENDS)查看某些内容

另外,您是否确定
USERNAME
是大写的,而不仅仅是
USERNAME
的小写以及表名


另外,我认为您可以使用
JOIN
子句,而不是对SQL请求执行操作

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

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

PHP实际上不会回显数组。如果对数组进行回音,它将输出“array”。另外,如果您的javascript真的通过了PHP数组,它将不知道如何处理它

尝试:

此外,你应该认真倾听评论中的反馈。您的代码非常容易受到攻击,并且没有为这样一个潜在巨大的应用程序进行良好的扩展

您有两个问题会使代码不那么安全或效率低下。最明显的低效是,您正在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\u行['FRIEND']
,以与
用户名
匹配。这样第一个查询就可以变成:

SELECT FRIEND FROM `FRIENDS` 
WHERE `USER` = '{$Modules['User']->Username}' 
AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10
SELECT USERNAME FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}'
在第二个查询中,您还有
选择*
,我们可以看出(目前)您唯一使用的是
用户名,因此它可以变成:

SELECT FRIEND FROM `FRIENDS` 
WHERE `USER` = '{$Modules['User']->Username}' 
AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10
SELECT USERNAME FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}'
最后,我们可以从第二个查询中看到
朋友
姓名和
用户名
是相同的;否则,为什么要查询用户名等于朋友名的用户名。如果是这样,我们可以完全删除第二个查询,因为我们已经知道第一个查询中的用户名

它效率低下且不安全的原因是因为您使用的是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.";
    }
}

PHP实际上不会回显数组。如果对数组进行回音,它将输出“array”。另外,如果您的javascript真的通过了PHP数组,它将不知道如何处理它

尝试:

此外,你应该认真倾听评论中的反馈。您的代码非常容易受到攻击,并且没有为这样一个潜在巨大的应用程序进行良好的扩展

您有两个问题会使代码不那么安全或效率低下。最明显的低效是,您在while循环中进行数据库调用,因此如果某人有10个朋友,这意味着您的while循环是无效的