2015-07-11 71 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(提取)期間進行回顯,但問題是,在這段時間內,數組將被最新的提取結果覆蓋。

在此先感謝您的所有幫助。

**編輯 我已經編輯腳本和測試由地緣說:

<?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

所有這三個數組元素都是對同一變量的引用。使用fetch代替綁定結果爲'bind_result()'中的每個迭代 – Orangepill

回答

0

感謝Orangepill和evans_murithi!

我從來沒有想過它是由bind_result

如下修改造成的:

<?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; 
    } 
} 
?>