PHP - 在多维数组中存储mysql_fetch_assoc

时间:2011-03-19 22:57:59

标签: php mysql

我是PHP的新手,所以我不确定它是如何工作的。

无论如何,我会将多维数组返回给另一个方法,主要是存储少量记录和列,类似于结构的表。

我写了以下内容,没有警告但没有数据

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']; 

例如,谢谢大家:))

PS我真的很难相信你不能说$ data [0] [5],IMO比为位置指定字符串值更合乎逻辑

3 个答案:

答案 0 :(得分:3)

您的代码似乎没问题。至少,你正朝着正确的方向前进。

只是一些小修正:

  • 从不在函数内部包含配置。它应该在类构造函数
  • 中完成
  • 如果你真的想使用连接标识符 - 使它成为类变量。但对于大多数使用单连接到db的应用程序,不必使用$ con,因此可以省略它
  • 错误处理是绝对必要的

所以,

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

运行此代码并查看其内容。

答案 1 :(得分: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

答案 2 :(得分: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;
}