【问题标题】:adding values into an array using a while loop使用 while 循环将值添加到数组中
【发布时间】:2012-04-15 11:09:53
【问题描述】:

所以我要做的是创建一个实时好友搜索。为此,我需要一组名称供 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>';   
    }
}

我将echo $FRIENDS 放在那里作为测试,现在它不显示任何内容。我在哪里犯错了?

【问题讨论】:

  • 这是您的实际代码吗?这里有一个拼写错误:$FREINDS = array();
  • 您的代码对 SQL 注入开放,而且,您为什么使用古老的 mysql_* 函数?
  • 我对注入感到困惑,因为它只是从数据库中请求信息。古代的 mysq 函数是什么意思?
  • 也是的,这是我的代码 Colin,我确实修复了拼写错误。那里没有骰子。

标签: php mysql arrays while-loop


【解决方案1】:

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

试试:

echo(json_encode($FRIENDS));

另外,您应该认真听取 cmets 中的反馈。您的代码很容易受到攻击,并且无法很好地针对如此庞大的应用进行扩展。

您有几个问题会导致您的代码不那么安全或不那么高效。最明显的低效率是您在 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.";
    }
}

【讨论】:

  • 谢谢你,我想弄清楚我在哪里容易受到攻击?如果我不明白,我很抱歉,我真的很感谢在这里给我建议的人。
  • 我使用了 json_encode 函数,因为您说您正在寻找 ajax 解决方案。显然,如果您只是想确认正在构建阵列,这并不好,在这种情况下使用print_r()。但是你的 javascript 会更好地理解 json。
  • 好的,我理解 json_encode 但每个人都说我的代码容易受到攻击?这是为什么呢?
  • @DJ_Plus - 我已经更新了我的答案,因为这些评论框太小了。
  • 哇,非常感谢!我显然需要重新审视我的 mysql 技能。
【解决方案2】:

试试这个:

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 以及表名。

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

【讨论】:

  • 是的,我对其他功能使用相同的查询。我将 sql 中的所有表和列都设置为大写以避免这种情况:)。
  • 是的,现在效果很好,谢谢!我对你的 SQL 查询感到困惑
  • 我使用了 LEFT JOIN 所以你不需要向数据库发出两个 sql 请求。
  • 哦,好的,我现在看到了!非常感谢,这非常有帮助。
【解决方案3】:

你有语法错误:

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

还有:

$FRIENDS = $REQUEST_ROW['USERNAME'] 应该是$FRIENDS[] = $REQUEST_ROW['USERNAME']

echo $FRIENDS; 应该是echo json_encode( $FRIENDS );

【讨论】:

  • 谢谢。但不幸的是,它并没有解决我的数组问题。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2020-08-24
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多