Çok boyutlu dizide çoklu benzer alanları yerleştirin - php mysql

3 Cevap php

Ben gibi bir SQL sorgusu çalıştırmak istiyorum:

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

Şimdi sorun i gibi PHP bir diziye koymak istiyorum ki:

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

Nasıl yukarıda ulaşmak için herhangi bir fikir? Afaik Yukarıdaki yaptığı hiçbir işlevi yoktur. Ben bunu yapmak için en iyi basit bir şekilde merak ediyorum. Ben "seçeneğini seçin .. gibi .." gerekli olmadıkça böyle bir sorgu kullanmak istemiyorum.

Ben alanlar ne olacağını önceden bilmiyorum, bu yüzden benlumley tarafından cevap tarafından önermek gibi ben elle atanamıyor.

Thank you, Alec

3 Cevap

Sen zaten yapıyor gibi verileri seçmeniz gerekir, ve sonra gerekli biçime getting üzerinde döngü ve alanları takma adlar kullanmak aynı adları, onun kolay ya çünkü onlar sadece içinde birbirinin üzerine olacak olacak veri döndü (ancak sayısal indisli bir dizi döner yerine, hangi mysql_fetch_row kullanabilirsiniz).

Örneğin:

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

(Alıntı de sizin sql yanlış oldu)

Bu da birden fazla satır işlemek değil, ancak soru tür sadece hiç bir satır beklediklerini ima?

Adların OLMADAN:

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

Eğer, ikinci kullanmak için iyi bir nedeniniz olmadıkça ben ilk versiyonunu tercih Hiç sql değiştirmek veya alanları vb eklerseniz hatalara neden olan daha az muhtemel olarak

EDIT:

Aşağıdaki yanıtı meta veri fikrini alarak ....

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

Eğer hala sadece bir seferde bir satır alabilirsiniz rağmen - sonra tam olarak ne yapmak gibi görünüyor.

Kolayca dizideki başka bir boyut birden fazla satır saklamak için güncelleme:

Değiştir:

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

Için:

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

Eğer sütun diğer adları belirtebilirsiniz edemez, ve önceden sorgunun alanlarını bilmiyor söylüyorlar beri, ben kullanarak bir çözüm öneririm mysql_fetch_field() meta veri bilgi almak için:

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

Sen aynı adı birden çok sütun sorguda orada bile, bu metadata bilgileri tablo adı ve sütun adı ayıklamak yapabilirsiniz.

PHP'nin ext / mysqli benzer bir işlevi mysqli_stmt::result_metadata() , but you said you can't know the number of fields in the query beforehand, which makes it awkward to use mysqli_stmt::bind_result() destekler.

PDO_MYSQL bu zamanda sonuç kümesi meta verilerini desteklemek için görünmüyor.


Yukarıdaki komut çıktısı aşağıda.

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
)

Tablo adı kısa versiyonu ile alan adlarını önek select takma ad oluşturmak için gerek kalmadan bunu başarmak için iyi bir yoldur. Tabii ki açıklanan kesin yapısını alamadım ama her alan sonucu dizideki eşsiz adında dizin vardır. Örneğin, tablo kullanıcımız var varsayalım, ve kullanıcı bir adı vardır, bu alan usr_name diyoruz.