【问题标题】:php loop logic troublephp循环逻辑问题
【发布时间】:2012-02-24 17:42:35
【问题描述】:

我正在开发一个朋友列表类型的函数,该函数将显示用户的朋友,但我遇到了一些逻辑问题。好友存储表的设置方式,共有3列; userid1、userid2 和friendstatus。朋友状态为 1 表示用户是朋友,状态为 0 表示请求处于待处理状态。当用户添加另一个用户为好友时,发送请求的用户被放置在 userid1 中,接收请求的用户被放置在 userid2 中。

所以,我遇到的问题是让功能正确选择用户的朋友,而不是用户自己。基本上,我试图让这个函数来确定哪一列是用户(例如我),哪一列是朋友。

我最初有如下的第一个 SQL 语句,但这也不起作用。

 $friends = mysql_query("Select * from friends where (userid1 = $myUsername OR userid2=$myUsername) AND friendstatus = '1'");

这是我试图创建的逻辑。

  1. 获取用户ID(我的)
  2. 在第 1 列中搜索我的 ID:如果找到,则显示第 2 列(这将是我的朋友)
  3. 在第 2 列搜索我的 ID:如果找到,显示第 1 列(这将是我的朋友)

函数friendslookup 只是显示信息并拉取用户信息。它不会增加逻辑。

$myUsername = $_GET['myFriends'];
if(isset($myUsername)){
        $friends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
        $friends2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
        if(mysql_num_rows($friends) > 0 OR mysql_num_rows($friends2) >0 ) {

echo '<table><tr><td>Username </td><td> Location</td></tr>';
        $col1rows = mysql_num_rows($friends);
        $col2rows = mysql_num_rows($friends2);
            }
        for ($i=0; $i<$col1rows;$i++){
            $myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
                $friend = mysql_fetch_array($myFriends);
                $friend_1 = $friend['userid2'];
                friendsLookup($friend_1,$myUsername);
            }
        for ($i=0; $i<$col2rows;$i++){
            $myFriends_2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
                $friend = mysql_fetch_array($myFriends_2);
                $friend_2 = $friend['userid1'];
                friendsLookup($friend_2,$myUsername);
                }
            }

【问题讨论】:

    标签: php mysql for-loop


    【解决方案1】:

    我会使用单个 UNION 的 sql 查询:

    $myUsername = $_GET['myFriends'];
    if(isset($myUsername)){
            $friends = mysql_query("
            SELECT userid1 as friendId
            FROM friends
            WHERE userid2 = $myUsername AND friendstatus = 1
            UNION
            SELECT userid2 as friendId
            FROM friends
            WHERE userid1 = $myUsername AND friendstatus = 1
            ");
    
            if(mysql_num_rows($friends) > 0) {
                echo '<table><tr><td>Username </td><td> Location</td></tr>';
                while($friend = mysql_fetch_array($friends)) {
                    $friend_data = friendsLookup($friend['friendId'],$myUsername);
                    //display friend data here
                }
                echo '</table>';
            }
    }
    

    【讨论】:

    • 请不要忘记使用 mysql_real_escape_string 清理 $myUsername 变量!此代码易受 SQL 注入攻击。
    【解决方案2】:

    我建议您在一个 SQL 中完成所有操作(包括“friendsLookup”函数,因为我敢打赌还有另一个 mysql 查询),因为它会变得非常慢。假设您的用户的表是“用户”。使用这条 SQL:

    $sql = "SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid2
    UNION
    SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid1";
    

    这将获取您的所有朋友(包括他们的用户信息)。此外,如果你想对结果进行排序或限制(或任何你想对结果做进一步的事情),你可以这样做:

    例如,您想按他们的名字升序对您的朋友进行排序:

    $sql = "SELECT * FROM (
    SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid2
    UNION
    SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid1 ) tblResult r
    ORDER BY r.first_name ASC";
    

    然后您可以通过以下方式获取最终结果:

    $query = mysql_query( $sql );
    while ( $col = mysql_fetch_array( $query ) ){
      ?>
      <!-- DO YOUR THING HERE WITH PHP -->
      <?php
    }
    

    最后,我想对你的 Looping 发表评论。注意在你的循环中,你有这个代码:

    $myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
    $friend = mysql_fetch_array($myFriends);
    

    这实际上是不必要的。第一行只是在每个循环中重置您的查询。删除第一行,在第二行中,不要使用 $myFriends,而是使用 $friends(这是您在顶部的第一个查询)。因此,第一个循环中的前两行应该如下所示:

    $friend = mysql_fetch_array($friends);
    

    对第二个循环也这样做。

    【讨论】:

      【解决方案3】:

      这可能会有所帮助:

      SELECT (CASE $myUsername
          WHEN `userid1` THEN `userid2`
          WHEN `userid2` THEN `userid1`
      END) AS `friend_ids`
      FROM `friends`
      WHERE $myUsername IN (`userid1`, `userid2`)
      AND `friendstatus` = 1;
      

      你的逻辑有几个问题 -

      1. 您不需要多次运行同一个查询。

      2. 仅使用前 2 个查询,您可以通过从查询 1 获取列“userid2”和从查询 2 获取列“userid1”来读取所有朋友。

      3. 在你的 for 循环中,你总是在读取第一条记录。因此,在每次迭代中,您都会再次调用相同的查询,并且始终只读取第一条记录。相反,您应该运行一次查询并在循环中调用 mysql_fetch_array()。

      例如这里:

      $myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
      while ($friend = mysql_fetch_array($myFriends) {
          $friend_1 = $friend['userid2'];
          friendsLookup($friend_1,$myUsername);
      }
      

      希望以上内容有所帮助!

      【讨论】:

        猜你喜欢
        • 2014-08-15
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        相关资源
        最近更新 更多