Поместите несколько похожих полей в многомерный массив - php mysql - PullRequest
1 голос
/ 01 февраля 2009

Я хочу выполнить запрос SQL, например:

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

Теперь проблема в том, что я хочу поместить его в массив в PHP, например:

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

Есть идеи, как этого достичь? Afaik нет функции, которая делает вышеперечисленное. Мне было интересно, лучший простой способ сделать это. Я не хочу использовать запрос типа "выбрать .. как .." без необходимости.

Я не знаю заранее, какие поля будут, поэтому я не могу назначить их вручную, как предполагает ответ Бенлумли.

Спасибо, Alec

Ответы [ 3 ]

3 голосов
/ 01 февраля 2009

Вам нужно будет выбрать данные, которые вы уже делаете, и затем зациклить их, получив их в требуемом формате, и поскольку поля имеют одинаковые имена, проще всего использовать псевдонимы, или они просто перезаписывают каждое другой в возвращаемых данных (но вместо этого вы можете использовать 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;
2 голосов
/ 06 февраля 2009

Поскольку вы говорите, что не можете указать псевдонимы столбцов и не можете заранее знать поля запроса, я бы предложил решение, использующее 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
)
0 голосов
/ 01 февраля 2009

Префикс имени поля с короткой версией имени таблицы - это хороший способ добиться этого без необходимости создавать псевдонимы в select. Конечно, вы не получите точную структуру, которую вы описали, но каждое поле имеет уникальный именованный индекс в массиве результатов. Например, предположим, что у вас есть пользователи таблицы, а у пользователя есть имя, затем вызовите это поле usr_name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...