【问题标题】:Combining Output of Multiple foreach loops php [closed]组合多个foreach循环php的输出[关闭]
【发布时间】:2014-07-17 04:33:10
【问题描述】:

此代码是从 SQL 数据库中选择在线用户及其用户模式,在 php 输出中的用户名之前添加他们的状态前缀(~、&、@、%、+)。

<<  SQL Connection Data Goes here  >>

//Half Mod/Half Op

$hmodsinlistsql = mysql_query("SELECT user.nick FROM `ison` INNER JOIN `user` on
`ison`.`nickid` = `user`.`nickid` INNER JOIN `chan` ON `ison`.`chanid` =
`chan`.`chanid` WHERE chan.channel = '#Channel' AND user.nick NOT LIKE
'%bot%' AND user.nick NOT LIKE '%Serv%' and user.realname NOT LIKE
'%bot%' AND user.realname NOT LIKE '%Serv' AND user.nick NOT LIKE
'%STAT%' AND user.realname NOT LIKE '%EVA%APB%' AND ison.mode_lh = 'Y' AND ison.mode_lo = 'N'
AND user.away = 'N'");

//Voiced/Temp Mod

$tempmodsinlistsql = mysql_query("SELECT user.nick FROM `ison` INNER JOIN `user` on
`ison`.`nickid` = `user`.`nickid` INNER JOIN `chan` ON `ison`.`chanid` =
`chan`.`chanid` WHERE chan.channel = '#Channel' AND user.nick NOT LIKE
'%bot%' AND user.nick NOT LIKE '%Serv%' and user.realname NOT LIKE
'%bot%' AND user.realname NOT LIKE '%Serv' AND user.nick NOT LIKE
'%STAT%' AND user.realname NOT LIKE '%EVA%APB%' AND ison.mode_lv = 'Y'
AND user.away = 'N'");

while ($row = mysql_fetch_assoc($hmodsinlistsql)) {
 $rows[] = $row;
}

foreach($rows as $row) {

 echo '<tr><td>%' . $row[nick] .', </td></tr>';
}  

上面的代码给了我这个:

%hmod2, %hmod3, %hmod4, %hmod1, %hmod5,

期望的输出:

%hmod2, %hmod3, %hmod4, %hmod1, %hmod5, +tmod1, +tmod2, +tmod3

我的问题是我可以很好地获得 hmod 结果,但是我不确定如何在单独的查询中使用多个 foreach 循环,然后按照上面的要求将结果合并到单个输出字符串中。

如果有人能帮忙解决这个问题,那就太好了。

【问题讨论】:

  • 您永远不会合并两个搜索结果,并且您只有一个与名称相呼应的循环。

标签: php sql loops foreach irc


【解决方案1】:

把这个:

while ($row = mysql_fetch_assoc($hmodsinlistsql)) {
 $rows[] = $row;
}

在您的查询之间并在循环之前声明数组。像这样:

$rows = []; // Declaring an array correctly before trying to fill it

$hmodsinlistsql = mysql_query("SELECT user.nick FROM `ison` INNER JOIN `user` on
`ison`.`nickid` = `user`.`nickid` INNER JOIN `chan` ON `ison`.`chanid` =
`chan`.`chanid` WHERE chan.channel = '#Channel' AND user.nick NOT LIKE
'%bot%' AND user.nick NOT LIKE '%Serv%' and user.realname NOT LIKE
'%bot%' AND user.realname NOT LIKE '%Serv' AND user.nick NOT LIKE
'%STAT%' AND user.realname NOT LIKE '%EVA%APB%' AND ison.mode_lh = 'Y' AND ison.mode_lo = 'N'
AND user.away = 'N'");

while ($row = mysql_fetch_assoc($hmodsinlistsql)) {
 array_push($rows, $row); // Push the value to the array
}

//Voiced/Temp Mod

$tempmodsinlistsql = mysql_query("SELECT user.nick FROM `ison` INNER JOIN `user` on
`ison`.`nickid` = `user`.`nickid` INNER JOIN `chan` ON `ison`.`chanid` =
`chan`.`chanid` WHERE chan.channel = '#Channel' AND user.nick NOT LIKE
'%bot%' AND user.nick NOT LIKE '%Serv%' and user.realname NOT LIKE
'%bot%' AND user.realname NOT LIKE '%Serv' AND user.nick NOT LIKE
'%STAT%' AND user.realname NOT LIKE '%EVA%APB%' AND ison.mode_lv = 'Y'
AND user.away = 'N'");

while ($row = mysql_fetch_assoc($hmodsinlistsql)) {
 array_push($rows, $row); // Push the value to the array
}

foreach($rows as $row) {

 echo '<tr><td>%' . $row['nick'] .', </td></tr>'; 
} 

【讨论】:

  • 所以我这样做了,我返回一个空白页。这是我的完整代码,不包括 sql 连接:pastebin.com/ZnYXZR9G
  • 我在上一个答案中错误地没有正确声明数组,抱歉。我解决了这个问题,我还将$row[nick] 更改为$row['nick']。查看我的编辑,如果已解决 - 请将我的答案标记为已解决。如果没有 - 大声喊叫,我会给你更多帮助来解决这个问题 :-) 你也应该看看这个stackoverflow.com/questions/60174/…
  • 正确声明数组后,这按预期工作!非常感谢!!
【解决方案2】:

我还没有测试过,但试试这个。您确实需要停止使用已弃用的 mysql 扩展。您不仅将拥有更多功能,而且您将拥有更高的安全性。正如您所看到的,如果您使用程序样式,语法几乎是相同的。

$connect = mysqli_connect("localhost", "user", "pw", "db");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//Half Mod/Half Op

$query = "SELECT user.nick FROM `ison` INNER JOIN `user` on
`ison`.`nickid` = `user`.`nickid` INNER JOIN `chan` ON `ison`.`chanid` =
`chan`.`chanid` WHERE chan.channel = '#Channel' AND user.nick NOT LIKE
'%bot%' AND user.nick NOT LIKE '%Serv%' and user.realname NOT LIKE
'%bot%' AND user.realname NOT LIKE '%Serv' AND user.nick NOT LIKE
'%STAT%' AND user.realname NOT LIKE '%EVA%APB%' AND ison.mode_lh = 'Y' AND ison.mode_lo = 'N'
AND user.away = 'N'";

//Voiced/Temp Mod

$query .= "SELECT user.nick FROM `ison` INNER JOIN `user` on
`ison`.`nickid` = `user`.`nickid` INNER JOIN `chan` ON `ison`.`chanid` =
`chan`.`chanid` WHERE chan.channel = '#Channel' AND user.nick NOT LIKE
'%bot%' AND user.nick NOT LIKE '%Serv%' and user.realname NOT LIKE
'%bot%' AND user.realname NOT LIKE '%Serv' AND user.nick NOT LIKE
'%STAT%' AND user.realname NOT LIKE '%EVA%APB%' AND ison.mode_lv = 'Y'
AND user.away = 'N'";

/* execute multi query */
if (mysqli_multi_query($connect, $query)) {
    do {
        /* store first result set */
        if ($result = mysqli_store_result($connect)) {
            while ($row = mysqli_fetch_row($result)) {
                $rows[] = $row;
            }
        foreach($rows as $row) {
            echo '<tr><td>%' . $row[nick] .', </td></tr>';
            }
            mysqli_free_result($result);
        }
    }
}

/* close connection */
mysqli_close($connect);

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多