2011-03-19 83 views
6

我是PHP新手,所以我不確定它是如何工作的。PHP - 將mysql_fetch_assoc存儲在多維數組中

無論如何,我會排隊返回一個多維數組到另一個方法,本質上是存儲少量的記錄和列,表像結構的東西。

我已經寫了下面,沒有警告,但沒有數據或者

public function GetData($sqlquery) 
{ 
    include 'config.php'; 

    $result = mysql_query($sqlquery,$con); 
    $data = array(); 

    while($row = mysql_fetch_assoc($result)) 
    { 
     $data[] = $row; 
    } 

    return $data; 
} 

最有可能做一些愚蠢的

幫助表示讚賞。

編輯:

感謝所有快速回復

我想通了,爲什麼這是行不通的,我正在處理數組作爲這樣

print $data[0][0]; 

而不是

print $data[0]['title']; 

例如, KS所有:)

PS我真的很難相信,你不能說$數據[0] [5],這是更符合邏輯的IMO不是指定的位置的字符串值

+0

你創建的config.php文件$ CON? – aorcsik 2011-03-19 23:01:12

+0

你能說這個代碼有什麼錯嗎? – 2011-03-19 23:08:45

+0

您是否閱讀過答案並糾正了其他錯誤? – markus 2011-03-19 23:34:14

回答

3

你的代碼看起來還好。至少,你正朝着正確的方向前進。

只是一些小的修改:

  • NEVER包括函數內配置。它應該在類構造函數
  • 中完成,如果您確實想使用連接標識符 - 使其成爲類變量。但對於使用單個連接大多數應用DB其不需要使用$騙子,所以你可以忽略它
  • 錯誤處理是絕對必要的

所以,

public function GetData($sqlquery) 
{ 
    $data = array(); 
    $result = mysql_query($sqlquery) or trigger_error(mysql_error().$sqlquery); 
    if ($result) 
    { 
     while($row = mysql_fetch_assoc($result)) 
     { 
      $data[] = $row; 
     } 
    } 
    return $data; 
} 

運行這段代碼,看看有什麼它說。

+0

非常感謝你的提示,儘管我已經解決了這個問題,但我錯誤地解決了數組 – Ash 2011-03-19 23:30:37

0

也許我錯了如果這一切都發生在config.php,但我認爲,餘小姐幾步:

創建連接:

$con = mysql_connect("localhost", "mysql_user", "mysql_password"); 

選擇數據庫:

mysql_select_db("mydbname"); 

在此之後,來到mysql_query。但是你說沒有任何警告,所以我假設你是這樣做的。

我會做這樣的事情(有更好的,更復雜的解決方案):

include 'config.php'; // contains definition of $conf array 

$con = mysql_connect($conf['host'], $conf['user'], $conf['pass']); 
mysql_select_db($conf['db']); 

function GetData($sqlquery) 
{ 
    global $con; 

    $result = mysql_query($sqlquery,$con); 
    $data = array(); 

    while($row = mysql_fetch_assoc($result)) 
    { 
     $data[] = $row; 
    } 

    return $data; 
} 
1

如果你使用mysqli擴展而不是mysql,你可以使用fetch_all(),這比在一個循環中填充數組要快。所以,你的函數只需要返回fetch_all的結果()

return $result->fetch_all(MYSQLI_ASSOC); 

腳本

<?php 

ob_start(); 

try 
{ 
    $db = new mysqli("localhost", "foo_dbo", "pass", "foo_db", 3306); 

    if ($db->connect_errno) 
     throw new exception(sprintf("Could not connect: %s", $db->connect_error)); 

    $sqlCmd = "select * from users order by username"; 

    $startTime = microtime(true); 

    $result = $db->query($sqlCmd); 

    if(!$result) throw new exception(sprintf("Invalid query : %s", $sqlCmd)); 

    if($result->num_rows <= 0){ 
     echo "no users found !"; 
    } 
    else{ 

     $users = $result->fetch_all(MYSQLI_ASSOC); //faster 

     //while($row = $result->fetch_assoc()) $users[] = $row; //slower 

     echo sprintf("%d users fetched in %s secs<br/>", 
      count($users), number_format(microtime(true) - $startTime, 6, ".", "")); 

     foreach($users as $u) echo $u["username"], "<br/>"; 
    } 
    // $result->close(); 
} 
catch(exception $ex) 
{ 
    ob_clean(); 
    echo sprintf("zomg borked - %s", $ex->getMessage()); 
} 
//finally 
if(!$db->connect_errno) $db->close(); 
ob_end_flush(); 
?> 

測試

//fetch_all() 

1000 users fetched in 0.001462 secs 
5000 users fetched in 0.005493 secs 
15000 users fetched in 0.015517 secs 
50000 users fetched in 0.051950 secs 
100000 users fetched in 0.103647 secs 

//fetch_assoc plus loop 

1000 users fetched in 0.001945 secs 
5000 users fetched in 0.008101 secs 
15000 users fetched in 0.023481 secs 
50000 users fetched in 0.081441 secs 
100000 users fetched in 0.163282 secs 
+1

這是無用的測試。 0.0002永遠不會成爲瓶頸。 – 2011-03-19 23:30:21

+0

我是否會說 - 或者它只是更高效和優雅? – 2011-03-19 23:43:02

+0

沒有太多的優雅,因爲代碼將隱藏在幫助函數代碼中。至於效率,並沒有多少需要注意。你不應該使用這個函數來處理超過一百個行 – 2011-03-19 23:47:22