2015-07-11 2 views
2

Я пытаюсь использовать bind_result и while-fetch для извлечения набора данных в массив 2d, я искал через интернет для решения, но он не работает должным образом. Я не уверен, что не так в коде после нескольких часов отладки. Цените, если кто-то может помочь обнаружить слепое пятно.PHP извлечения в многомерный массив

Сценарий:

У меня есть таблица, как показано ниже:

tbl_team 
teamname id  name gender 
team1  1  John Male 
team1  2  Kelly Female 
team1  3  Chan Male 
team2  1  Jordan Male 
... etc 

Я создал функцию, чтобы запросить эти базы на teamname.

<?php 
function queryteam ($team) 
{ 
    $stmt = $mysqli->prepare("select id, name, gender from tbl_team where teamname = ?"); 
    if($stmt) 
    { 
    $stmt->bind_param('s',$team); 
    $stmt->execute(); 
    $stmt->store_result(); 
    $stmt->bind_result($team_member['id'],$team_member['name'],$team_member['gender']); 
    $team = array(); 
    while($stmt->fetch()) 
    { 
     //echo implode(" - ", $team_member)."<br>"; //debug purpose 
     $team[] = $team_member; 
    } 
    $stmt->close(); 
    return $team; 
    } 
} 
?> 

Тогда у меня есть часть кода будет вызывать эту функцию и распечатать результат на экране:

<?php 
    $team_array = queryteam("team1"); 
    FOR($i = 0, $count=count($team_array);$i<$count;$i++) 
    { 
    echo "Team1 Members as below:<br>"; 
    echo implode(" - ",$team_array[$i])."<br>"; 
    } 
?> 

Ожидаемый результат будет, как:

Team1 Members as below: 
1 - John - Male 
2 - Kelly - Female 
3 - Chan - Male 

Но на самом деле я я получаю следующий результат:

Team1 Members as below: 
3 - Chan - Male 
3 - Chan - Male 
3 - Chan - Male 

Запрос возвращает результат правильно, поскольку я пытался эхо во время while (fetch), но проблема заключается в том, что в то время массив переопределяется последним результатом выборки.

Заранее благодарим за помощь.

** редактировать Я редактировал сценарий и испытания, как прокомментировал Geo:

<?php 
    function queryteam ($team) 
    { 
    .... 
     $team = array(); 
     while($stmt->fetch()) 
     { 
     //echo implode(" - ", $team_member)."<br>"; //debug purpose 
     $team[] = $team_member; 
     echo "within FETCH: <br>"; 
     print_r($team); echo "<br>"; 
     } 
     $stmt->close(); 
     return $team; 
    } 
    } 
    $team_array = queryteam("team1"); 
    echo "Function returned:<br>"; 
    print_r($team_array); echo "<br>"; 
    ?> 

я получил результат, как показано ниже:

within FETCH: 
Array([0]=>Array([id]=>1 [name]=>John [gender]=>Male)) 
Array([0]=>Array([id]=>2 [name]=>Kelly [gender]=>Female) [1]=>Array([id]=>2 [name]=>Kelly [gender]=>Female)) 
Array([0]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [1]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [2]=>Array([id]=>3 [name]=>Chan [gender]=>Male)) 
Function returned: 
Array([0]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [1]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [2]=>Array([id]=>3 [name]=>Chan [gender]=>Male)) 
Array([0]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [1]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [2]=>Array([id]=>3 [name]=>Chan [gender]=>Male)) 
Array([0]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [1]=>Array([id]=>3 [name]=>Chan [gender]=>Male) [2]=>Array([id]=>3 [name]=>Chan [gender]=>Male)) 
+0

Вы уверены, что это то, что он делает? Вы сделали «print_r» из массива, чтобы убедиться, что данные в нем ожидаются? –

+0

Привет, Geo, возвращенный массив имеет 3 строки внутри, а 3 строки из них переопределены последней выборкой из запроса. Можете ли вы поделиться более подробной информацией о print_r? на самом деле я довольно новичок в PHP. Спасибо за вашу помощь! – Noobilicious

+0

все три элемента массива являются ссылками на одну и ту же переменную. Используйте выборку вместо результатов привязки для создания новых массивов для каждой итерации – Orangepill

ответ

0

Благодаря Orangepill и evans_murithi!

Я никогда не думал, что это было вызвано bind_result

Modified, как показано ниже:

<?php 
function queryteam ($team) 
{ 
    $stmt = $mysqli->prepare("select id, name, gender from tbl_team where teamname = ?"); 
    if($stmt) 
    { 
    $stmt->bind_param('s',$team); 
    $stmt->execute(); 
    $stmt->store_result(); 

    //change this part 
    //$stmt->bind_result($team_member['id'],$team_member['name'],$team_member['gender']); 
    $stmt->bind_result($id, $name, $gender); 
    /*******/ 

    $team = array(); 
    while($stmt->fetch()) 
    { 
     $team_member = array(); 
     $team_member['id'] = $id; 
     $team_member['name'] = $name; 
     $team_member['gender'] = $gender; 
     //echo implode(" - ", $team_member)."<br>"; //debug purpose 
     $team[] = $team_member; 
    } 
    $stmt->close(); 
    return $team; 
    } 
} 
?> 
Смежные вопросы