【问题标题】:php function to return sql results that contain arrays, as an arrayphp函数以数组形式返回包含数组的sql结果
【发布时间】:2010-12-05 21:55:31
【问题描述】:

所以我有一个问题(显然)。我有以下 MySQL 表数据

7   USER1       1,1,1,10,1      The Guys Team   8,7,13,14,16
8    USER1      1,1,1,10,1  The Girls Team  7,12,15
10  USER1       1,1,1,10,1  Dog Team    8,7,14,15

我写了一个函数来检索数据并返回它。

function ShowSetTeams($coach){
    $result = mysql_query("SELECT * FROM `teams` WHERE coach = '$coach'") or trigger_error(mysql_error()); 
    while($row = mysql_fetch_array($result)){ 
        foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } 
            $id = $row['id'];
            $teamname = $row['teamname'];
            $team = $row['team'];
            $event = $row['event'];
            $push .= array($id, $teamname, $team, $event);
    }
    return $push;
}

当我调用函数时,如下

$info = ShowSetTeams("USER1");

我明白了

ArrayArrayArray 

我尝试回显 $info[0]、$info[1] 和 $info[2],但得到了这个

Arr

所以 info 数组中的每一行都是结果数组。我应该能够 $info[0][0] 并从第一个结果中获取第一个 ID 值,对吧?

Fatal error: Cannot use string offset as an array

我不知所措。 如何获取返回数组的每个值?更重要的是,我如何对它们运行 foreach 操作,例如

foreach( $info as $key => $value){
$key[0] //ID
$key[1] //TEAMNAME
$key[2] //TEAM
$key[3] //EVENT
}

【问题讨论】:

    标签: php mysql arrays foreach


    【解决方案1】:

    您使用的是字符串连接而不是数组表示法:

    $push[] = array($id, $teamname, $team, $event);
    

    您还应该在开始使用之前初始化$push = array();

    你还做了很多额外的工作......你可以这样做:

    function ShowSetTeams($coach)
    {   
        $push = array();
        $result = mysql_query("SELECT id, teamname, team, event FROM `teams` WHERE coach = '$coach'") or trigger_error(mysql_error());
        while($row = mysql_fetch_array($result, MYSQL_NUM))
        {
            // I doubt you actually need to run stripslashes on your data...
            $row = array_map('stripslashes', $row);
            $push[] = $row;
        }
    
        return $push;
    }
    

    除非您必须这样做,否则我也不会使用将其重新键入数字索引数组 - 您只是在以后的代码中使其更难理解。使用mysql_fetch_assoc() 来执行此操作

    【讨论】:

    • 我稍后会进一步探讨这个问题,但感谢您的建议。不过现在切换它为时已晚。
    • 嗨,格雷格,你为什么使用 array_values?那不会解除数组的关联吗?似乎他希望将信息作为关联数组。那么为什么不只是$push[] = $row
    • @tharkun 我使用了array_values,因为@Patrick 的代码就是这样做的
    • @Greg:但是使用mysql_fetch_array,您将拥有所有值两次。
    • 我以为他在使用 assoc... 猜我已经习惯了,我只是到处阅读它,呵呵。固定
    【解决方案2】:
    1. 您应该使用mysql_fetch_assoc() 而不是mysql_fetch_array()
    2. 您应该在“while”之前通过$push = array(); 将$push 定义为数组
    3. 你应该use $push[] = ... 而不是$push .= ...

    【讨论】:

      【解决方案3】:

      不要连接 $push 而是使用

      $push[] = array();
      
      return $push;
      

      其他几点说明:

      • 您的数据库架构未正确规范化!您的表中不应存储用户 ID 字符串,但在 teams 表和 player 表之间有一个引用多对多表。

      • 您不应该(几乎不)在查询中使用* 选择器。你用它给自己制造陷阱。而是指明您要检索的确切列。

      • 您可以获得相同的信息,而无需自己组装 $push 数组。如果数据库列的名称正确,您可以使用 fetch_assoc 并执行 $push[] = $row

      【讨论】:

        【解决方案4】:

        您正在使用 string concatenation and assignment operator .= 将您的数组转换为字符串。尝试使用数组推送运算符$array[]

        function ShowSetTeams($coach) {
            $result = mysql_query("SELECT * FROM `teams` WHERE coach = '$coach'") or trigger_error(mysql_error()); 
            $array = array();
            while ($row = mysql_fetch_assoc($result)) {
                $array[] = array(stripslashes($row['id'], stripslashes($row['teamname'], stripslashes($row['team']), stripslashes($row['event']));
            }
            return $array;
        }
        

        【讨论】:

          【解决方案5】:

          我认为他们的问题在于这条线:

           $push .= array($id, $teamname, $team, $event);
          

          这将 $push 视为一个字符串并连接一个数组,该数组变成一个字符串。试试:

           $push[] = array($id, $teamname, $team, $event);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-06
            • 2021-03-06
            • 2012-02-05
            相关资源
            最近更新 更多