PHP &

8 Cevap php

Benim veritabanında iki tablo var:

HABERLER ('id' - haber id, 'kullanıcı' - yazarın kullanıcı kimliği)

KULLANICILAR ('id' - kullanıcı kimliği)

Ben gibi bir PHP sonuç almak zaman SELECT * FROM news JOIN users ON news.user = user.id, şimdi olan bir şey yapmak istiyorum:

$row = mysql_fetch_array($result), ve $row['column-name'] ile sütun adlarını almak ... nasıl aynı sütun adı taşıyan, haber kimliği ve kullanıcı kimliği alabilirim?

GÜNCELLEME: teşekkürler hızlı cevaplar için herkes. Takma adlar iyi çözüm gibi görünüyor.

8 Cevap

Sen seçerek sütunları için ayarlayabilirsiniz:

$query = 'SELECT news.id AS newsId, user.id AS userId, [OTHER FIELDS HERE] FROM news JOIN users ON news.user = user.id'

Sen sayısal endeksleri ($row[0]) veya daha iyi, kullanım AS MySQL kullanabilirsiniz:

SELECT *, user.id AS user_id FROM ...

Sen gibi bir şey yapabilirsiniz

SELECT news.id as news_id, user.id as user_id ....

Ve sonra $row['news_id'] haber kimliği olacak ve $row['user_id'] kullanıcı kimliği olacak

Ben sadece bu anladım. Muhtemelen kötü bir uygulama ama bu durumda benim için çalıştı.

Ben takma ad veya istediğiniz bir tablo öneki her sütun adını yazmak değil tembel insanlardan biriyim.

Sen select deyiminde table_name.* kullanarak belirli bir tablodan tüm sütunları seçebilirsiniz.

Eğer sütun adlarını çoğaltılamaz zaman, mysql son birinci üzerine yazılır. Yine o sütun adı karşılaştığında ilk çoğaltılamaz sütun adından verilerin üzerine yazılır. Yani son galibiyet geliyor yinelenen sütun adı.

3 tablolar, çoğaltılmış bir sütun adı, select deyiminde tablo sırasını içeren her katılmadan ediyorsam ben yinelenen sütun için alıyorum hangi verileri belirleyecek.

Örnek:

SELECT table1.* , table2.* , table3.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;

Yukarıdaki örnekte, dup I elde değerinin table3 arasında olacaktır.

Ne dup adlı değeri olmak istiyorsanız table1?

Sonra bunu yapmak gerekiyor:

SELECT table3.* , table2.* , table1.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;

Şimdi, table1 son geliyor, bu yüzden değeri dup tablo1 değer olacaktır.

Ben her hilkat garibesi sütun yazmak ve hala tüm sütunları ile çalışmak için almak zorunda kalmadan dup aranan değer var. Yay!

Ben değeri dup 3 tablolarda aynı olması gerektiğini biliyorum, ama ne olur table3 için eşleşen bir değer yok dup? Sonra dup ilk örnekte boş olacak ve bu bir serseri olacaktır.

Bir başka ipucu: Eğer temiz PHP kodu sahip olmak istiyorsanız, size veritabanında bir görünüm oluşturabilirsiniz, örneğin

Örneğin:

CREATE VIEW view_news AS
SELECT
  news.id news_id,
  user.id user_id,
  user.name user_name,
  [ OTHER FIELDS ]
FROM news, users
WHERE news.user_id = user.id;

PHP:

$sql = "SELECT * FROM view_news";

Eğer aliassing gibi hissediyorum yoksa ayrıca sadece tablenames önek.

This way you can better automate generation of your queries. Also, it's a best-practice to not use select * (it is obviously slower than just selecting the fields you need Furthermore, only explicitly name the fields you want to have.

SELECT
    news.id, news.title, news.author, news.posted, 
    users.id, users.name, users.registered 
FROM 
    news 
LEFT JOIN 
    users 
ON 
    news.user = user.id

@ Jason. Bunu php dışında doğru suçlu değil, mysql. Eğer JOIN Mysql Workbench Eğer aynı isimde (her tablo için bir) üç sütun alırsınız ama aynı veri ile (bazı olmayacak null koyarsanız eğer tablo için hiçbir maç var JOIN).

Eğer MYSQL_NUM mysql_fetch_array() kullanmak eğer php sonra tüm sütunları alırsınız. Sorun MYSQL_ASSOC ile mysql_fetch_array() kullandığınızda olduğunu. Sonra, o fonksiyonu içerisine, php şöyle dönüş değerini inşa ediyor:

$row['dup'] = [value from table1]

ve daha sonra ...

$row['dup'] = [value from table2]

...

$row['dup'] = [value from table3]

Yani Çizelge 3'te sadece değerini alacak. Sorun mysql ayarlanmış bir sonuç aynı adı taşıyan sütun içerebilir ancak php ilişkisel diziler diziler yinelenen anahtarlar izin kalmamasıdır. Veri ilişkisel dizilerinde kaydedildiğinde, php, bazı bilgiler sessizce kaybolur ...

Ben dinamik tablolar ile aynı sorun vardı. (Katılmak için muktedir bir kimliğe sahip olduğu varsayılır ama alanların geri kalanı için herhangi bir varsayım olmaksızın Tabloları.) Bu durumda elden önce adlar bilmiyorum.

Bu gibi durumlarda ilk önce tüm dinamik tablolar için tablo sütun adları alabilirsiniz:

$tblFields = array_keys($zendDbInstance->describeTable($tableName));

$ ZendDbInstance Zend_Db'nin bir örneği ya da Zend dayanmaz burada işlevlerinden birini kullanabilirsiniz Nerede php pdo: get the columns name of a table

Sonra tüm dinamik tablolar için size adlar almak ve $ tableName kullanabilirsiniz * Eğer adlar gerekmez olanlar için.:

$aliases = "";
foreach($tblKeys as $field)
    $aliases .= $tableName . '.' . $field . ' AS ' . $tableName . '_' . $field . ',' ;
$aliases = trim(',', $aliases);

Sen bir genel fonksiyon içine bütün süreci tamamlamayı ve sadece temiz kod var ya da isterseniz daha tembel olsun :)