【问题标题】:PHP: create an array with the whole database dataPHP:创建一个包含整个数据库数据的数组
【发布时间】:2012-06-14 23:48:32
【问题描述】:

我想“自动”将我的所有数据库数据加载到$db[] 和/或$_SESSION['db']。因此,我只需要加载此代码一次,而不是在整个网站上加载零碎的代码。

我能够查询元数据和原始数据,我的问题是创建数组。

假设我有一个表temp 与列nameage 我希望能够做这样的事情:echo $db['temp']['name'] . "'s age is: " . $db['temp']['age']; -显然我有很多表有很多列。这只是一个例子

<?php
$dbn = "db_name";
$dbu = "db_user";
$dbp = "db_password";
$hst = 'db_host';

$dbc = mysql_connect($hst,$dbu,$dbp);


$sql_metadata = 
"SELECT `COLUMNS`.`TABLE_NAME` as 'table' , `COLUMNS`.`COLUMN_NAME` as 'column'
FROM `information_schema`.COLUMNS
WHERE `COLUMNS`.`TABLE_SCHEMA` = '$dbn'
ORDER BY TABLE_NAME ASC , `COLUMNS`.`COLUMN_NAME` ASC";

$dbq = mysql_query($sql_metadata, $dbc);
while( $meta = mysql_fetch_array($dbq) )
{
    $sql_rawdata = "SELECT `$meta['column']` FROM `$dbn`.`$meta['table']`";
    $dbq2 = mysql_query($sql_rawdata);
    foreach( ($raw = mysql_fetch_array($dbq2)) as $value) )
    {
        $db = array
                ( 
                $meta['table'] => array( $meta['column'] => $value)
                );
    }
}
print_r($db);
?>

【问题讨论】:

  • 非常不推荐如果你在共享主机上,服务器上的任何人都可以从/tmp/读取你的数据库
  • 您是如何想到他的数据库存储在 tmp/-文件夹中的? AFAIK 所有表都存储在 MySQL 安装文件夹中名为“data”的子文件夹中......
  • 出于好奇;这样做的目的是什么?
  • @Corsair,OP提到他想存储在$_SESSION,会话数据存储在/tmp/
  • @repox 我不想在每个页面上添加 php 的 mysql 函数和代码,而是希望“一次”在所有 '*.php' 请求中都可用数据库的数据。

标签: php mysql database multidimensional-array


【解决方案1】:

在进入循环之前声明你的数组,然后填充它:

$db = array();

$sql_metadata = 
"SELECT DISTINCT `COLUMNS`.`TABLE_NAME` as 'table' 
FROM `information_schema`.COLUMNS 
WHERE `COLUMNS`.`TABLE_SCHEMA` = '$dbn'";

$dbq = mysql_query($sql_metadata, $dbc);
while( $meta = mysql_fetch_array($dbq) )
{
    $sql_rawdata = "SELECT `$meta['column']` FROM `$dbn`.`$meta['table']`";
    $dbq2 = mysql_query($sql_rawdata);
    $raw = mysql_fetch_array($dbq2);

    foreach($raw as $value )
    {
        $db[$meta['table']][$meta['column']][] = $value;
    }
}
print_r($db);

解释:您创建一个多维数组,表名指向列名。数组末尾的 [] 告诉 PHP 将 $value 的内容存储到 table=>column 的新数组元素中。

这将是获取整个数据的更简单方法:

    $sql_rawdata = "SELECT * FROM `".$dbn."`.`".$meta['table']."`";
    $dbq2 = mysql_query($sql_rawdata);

    while($raw = mysql_fetch_assoc($dbq2)){
        foreach($raw as $column => $value )
        {
            $db[$meta['table']][$column][] = $value;
        }
    }

【讨论】:

  • 我还是有同样的编码错误:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ...db.php on line 21
  • 您在第一篇文章中没有提到这一点;-) 而且我首先没有看到错误,这是由于您在 foreach 中的括号,循环甚至没有创建变量$值。看看我的编辑。
  • 我应该更具体,而不是仅仅说“...我的问题是创建数组”:P 错误来自这一行:$sql_rawdata = "SELECT $meta['column'] FROM $dbn.$meta['table']";
  • 尝试添加显式分隔符,我猜 PHP 无法正确连接带有 db-name 的变量:$sql_rawdata = "SELECT ".$meta['column']." FROM ".$dbn.".".$meta['table'];
  • 是的,你是对的,但我发现了另一个错误:如果你想在你的数组中拥有所有数据,你还必须获取所有列。我稍微修改了您的代码以选择表中的所有内容并将其存储在数组中。 mysql_fetch_assoc() 确保您将仅按名称获取列,而不是像 mysql_fetch_array() 那样按数字和名称获取列。因此,您可以逐行填充数组,这也应该会提高性能。
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 2021-08-04
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2010-09-06
相关资源
最近更新 更多