Функция PHP для возврата результатов SQL, которые содержат массивы, в виде массива - PullRequest
2 голосов
/ 12 октября 2009

Так что у меня проблема (очевидно). У меня есть следующие данные таблицы 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 [0] [0] и получить первое значение идентификатора, из первого результата, верно?

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
}

Ответы [ 5 ]

6 голосов
/ 12 октября 2009

Вы используете конкатенацию строк вместо записи массива:

$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(), чтобы сделать это

1 голос
/ 12 октября 2009
  1. Вы должны использовать mysql_fetch_assoc() вместо mysql_fetch_array()
  2. Вы должны определить $ push как массив с помощью $push = array(); перед "while"
  3. Вы должны use $push[] = ... вместо $push .= ...
1 голос
/ 12 октября 2009

Вы используете оператор конкатенации и назначения строк .=, который преобразует ваши массивы в строки. Попробуйте вместо этого использовать оператор push массива $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;
}
1 голос
/ 12 октября 2009

Я думаю, что они проблема с линией:

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

Это обрабатывает $ push как строку и объединяет массив, который превращается в строку. Попробуйте:

 $push[] = array($id, $teamname, $team, $event);
1 голос
/ 12 октября 2009

Не объединяйте $ push, а используйте

$push[] = array();

return $push;

Несколько других замечаний:

  • ваша схема базы данных не нормализована должным образом! у вас не должно быть строк идентификаторов пользователей, хранящихся в вашей таблице, но должна быть справочная таблица «многие ко многим» между таблицей команд и таблицей игроков.

  • вы никогда не должны (почти никогда) использовать селектор * в запросах. Вы строите себе ловушки с этим. Вместо этого укажите точные столбцы, которые вы хотите получить.

  • вы можете получить ту же информацию без необходимости самостоятельно собирать массив $ push. Если столбцы базы данных имеют правильные имена, вы можете использовать fetch_assoc и просто набрать $push[] = $row

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...