在多维数组中放置多个相似的字段 - php mysql

时间:2009-02-01 11:50:36

标签: php mysql

我想执行一个SQL查询,如:

select 'tb1'.'f1','tb1'.'f2','tb2'.'f1' from 'tb1','tb2';

现在问题是我想把它放在PHP中的数组中,如:

$result['tb1']['f1'], $result['tb1']['f2'], $result['tb2']['f1']... 

任何想法如何实现上述目标? Afaik没有上述功能。我想知道最好的简单方法。除非必要,否则我不想使用像“select .. as ..”这样的查询。

我事先并不知道这些字段会是什么,所以我不能手动分配它们作为benlumley答案的建议。

谢谢你, 艾力

3 个答案:

答案 0 :(得分:3)

您需要选择正在进行的数据,然后循环将其转换为所需的格式,并且因为字段具有相同的名称,所以最容易使用别名,或者它们只会覆盖每个返回数据中的其他数据(但您可以使用mysql_fetch_row,它返回一个数字索引数组)。

例如:

$sql = "select tb1.f1 as tb1f1,tb1.f2 as tb1f2,tb2.f1 as tb2f1 from tb1,tb2";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
    $result['t1']['f1']=$row['tb1f1'];
    $result['t1']['f2']=$row['tb1f2'];
    $result['t2']['f1']=$row['tb2f1'];
}

(你的sql引用也是错误的)

这也不会处理多行,但你的问题有点暗示你只是期待一行?

没有别名:

$sql = "select tb1.f1,tb1.f2,tb2.f1 from tb1,tb2";
$result = mysql_query($sql);
while ($row = mysql_fetch_row($result)) {
    $result['t1']['f1']=$row[0];
    $result['t1']['f2']=$row[1];
    $result['t2']['f1']=$row[2];
}

我更喜欢第一个版本,除非您有充分的理由使用第二个版本,因为如果您更改sql或添加字段等,它不太可能导致错误。

编辑:

从下面的回复中获取元数据的想法......

<?php
mysql_connect('localhost', 'username', 'password');
mysql_select_db('dbname');
$result = mysql_query('select tb1.f1, tb1.f2, tb2.f1 from tb1, tb2');
$meta = array();
for ($i = 0; $i < mysql_num_fields($result); ++$i) {
  $meta[$i] = mysql_fetch_field($result, $i);
}
while ($row = mysql_fetch_row($result)) {
   foreach($row as $key=>$value) {
     $out[$meta[$key]->table][$meta[$key]->name]=$value;
   }
}

似乎完全符合您的要求 - 尽管您仍然只能一次获得一行。

轻松更新以在阵列上存储具有其他维度的多个行:

变化:

$out[$meta[$key]->table][$meta[$key]->name]=$value;

要:

$out[][$meta[$key]->table][$meta[$key]->name]=$value;

答案 1 :(得分:2)

由于您说您无法指定列别名,并且您无法事先知道查询的字段,因此我建议使用mysql_fetch_field()获取元数据信息的解决方案:

<?php
mysql_connect('localhost', 'username', 'password');
mysql_select_db('dbname');
$result = mysql_query('select tb1.f1, tb1.f2, tb2.f1 from tb1, tb2');
for ($i = 0; $i < mysql_num_fields($result); ++$i) {
  $meta = mysql_fetch_field($result, $i);
  print_r($meta);
}

即使查询中有多个同名的列,您也可以从此元数据信息中提取表名和列名。

PHP的ext / mysqli支持类似的函数mysqli_stmt::result_metadata(),但您说您事先无法知道查询中的字段数,这使得使用mysqli_stmt::bind_result()变得尴尬。

PDO_mysql目前似乎不支持结果集元数据。


以上脚本的输出如下。

stdClass Object
(
    [name] => f1
    [table] => tb1
    [def] => 
    [max_length] => 1
    [not_null] => 0
    [primary_key] => 0
    [multiple_key] => 0
    [unique_key] => 0
    [numeric] => 1
    [blob] => 0
    [type] => int
    [unsigned] => 0
    [zerofill] => 0
)
stdClass Object
(
    [name] => f2
    [table] => tb1
    [def] => 
    [max_length] => 1
    [not_null] => 0
    [primary_key] => 0
    [multiple_key] => 0
    [unique_key] => 0
    [numeric] => 1
    [blob] => 0
    [type] => int
    [unsigned] => 0
    [zerofill] => 0
)
stdClass Object
(
    [name] => f1
    [table] => tb2
    [def] => 
    [max_length] => 1
    [not_null] => 0
    [primary_key] => 0
    [multiple_key] => 0
    [unique_key] => 0
    [numeric] => 1
    [blob] => 0
    [type] => int
    [unsigned] => 0
    [zerofill] => 0
)

答案 2 :(得分:0)

使用短版本的表名前缀字段名称是实现它的好方法,而无需在select中创建别名。当然,您没有得到所描述的确切结构,但每个字段在结果数组中都有唯一的命名索引。例如,假设您有表用户,并且用户有一个名称,然后将此字段称为usr_name。