2011-03-19 25 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