Nasıl PHP / MySQL veritabanı sorguları tam olarak nasıl çalışır?

4 Cevap php

MySQL bir çok kullanılan, ama ben her zaman tam olarak nasıl çalışır merak - Ben veriler tam olarak saklandığı olumlu bir sonuç almak ne zaman? Örneğin, ben bu gibi yazmak:

$sql = "SELECT * FROM TABLE"; 
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result)) {
    echo $row->column_name;
}

Bir sonuç döndüğünde, ben $ row-> column_name gibi, tüm veri sonuçlarını tutan ya da çıkmıyor bir parçası ve sadece istedi nerede döndürür varsayarak yaşıyorum?

Yoksa gerçekten sadece $ sonucunda bir sütun istedim bile verilerin her tek satır çıkmıyor?

Ben LIMIT kullanarak sayfalandırmak Ayrıca, eğer bu veritabanı güncellenir bile OLDUĞUNU orijinal (eski) sonucu tutun nedir?

4 Cevap

Ayrıntılar uygulama bağımlıdır ama generally konuşma, sonuç tamponlu edilmektedir. Bir veritabanında bir sorgu yürütülürken bazı sonuç kümesi dönecektir. Yeterince küçük ise tüm sonuçları ilk çağrı ile iade edilebilir veya bazı olabilir ve sonuç nesne üzerinde yineleme gibi daha fazla sonuç döndürülür.

Dizisinin bu şekilde düşünüyorum:

  1. Sen veritabanına bir bağlantı açmak;
  2. Orada bir veritabanı seçmek için ikinci bir çağrı olasılıkla ya da (1) bir parçası olarak yapılabilir olabilir;
  3. Bu kimlik doğrulama ve bağlantı adımdır (en az) (kalıcı bağlantılarını görmezden) sunucuya bir tur;
  4. Sen istemci üzerinde bir sorgu yürütmek;
  5. Bu sorgu sunucuya gönderilir;
  6. Sunucu sorguyu yürütmek için nasıl belirlemek için vardır;
  7. Sunucu önceden sorgu idam ise yürütme planı hala sorgu önbellek olabilir. Yeni bir plan oluşturulması gerekir değilse;
  8. Sunucu verilen sorgu yürütür ve müşteriye bir sonuç verir;
  9. Bu sonuç, uygulama bağlıdır satırların bir tampon içerecektir. Bu, 100 satır ya da daha fazla ya da daha az olabilir. Tüm sütun her satır için iade edilir;
  10. Eğer daha fazla satırlarını gibi istemci daha fazla satır için sunucu soracaktır. Istemci biterse veya preemptively yapılabilir bu olabilir. Yine bu uygulama bağlıdır.

Tüm bu fikri bir milyon satır sorarsan geri hepsini birden almazsınız neden olan, too much gereksiz verileri geri göndermeden sunucuya gidiş gelişlerini en aza indirmektir.

LİMİT hükümler - ya da aslında herhangi bir fıkra - sonuç kümesini değiştirmek olacaktır.

SELECT * FROM table WHERE a = 'foo' ve SELECT * FROM table WHERE a = 'bar' kadar veri tabanı ile ilgili olarak en iyi duruma kadar bir yürütme sistemi ayrıca her biri için tespit edilmelidir iki farklı sorguları için Son olarak, (7) çok önemlidir. Ancak farklı parametrelerle bir parametreli sorgu (SELECT * FROM table WHERE a = :param) bir sorgu ve sadece (o sorgu önbellek düşüyor en azından kadar) bir kez planlanmış olması gerekir.

Ben size uğraşıyoruz değişkenlerin iki tür kafa karıştırıcı olduğunu düşünüyorum, ve ne cevap gerçekten o kadar açıklar.

$result, bir MySQL sonuç nesnedir. Bu "herhangi bir satır içerir." Değil Eğer $result = mysql_query($sql), MySQL sorgu yürütür ve maç ne satırlar bilir, ancak veri PHP tarafında devredilmiştir değil derken. $result yürütmek için MySQL sorulan bir sorgu için bir işaretçi olarak düşünülebilir.

Eğer $row = mysql_fetch_object($result) derken PHP'nin MySQL arayüzü sizin için bir satır alır zaman, o. Sadece bu satır içine $row (bir düz eski PHP nesne olarak değil, her satırda bir ilişkisel dizi, ya da belirli bir sütun (lar) için sormak için farklı getirme işlevini kullanabilirsiniz.) Konur

Satırlar [(0)] (genellikle durumda olan) sıkı bir döngü içinde tüm satırları almak olacak beklentisi ile tamponlu olabilir, ancak {biriyle onlara sorduğunuzda genel olarak, satırlar alınana } fonksiyonları.

Eğer sadece tek bir veritabanı sütunu, o zaman gerekir SELECT that_column FROM ... istiyorum. Bu sadece satır belirli bir grup istiyorum biliyor eğer MySQL genellikle önemli optimizasyonlar gerçekleştirebilirsiniz çünkü LIMIT tümcesini kullanarak, ayrıca mümkün olduğunda iyi bir fikirdir.

İlk soru resources üzerinde okuyarak cevap olabilir

Eğer "*" seçerek bu yana, her sütun, her mysql_fetch_object çağrısı için döndürülür. Sadece görmek için print_r ($ row) bakmak.

Basit bir deyişle kaynak bir kimliği diğer verilerle birlikte MySQL kütüphane ortak gibi döndü. Ben sizin cüzdan kimlik kartı gibi, vb sadece bir sayı ve bazı bilgiler ancak hükümeti vermek, daha fazla bilgi bir sürü kullanan hastalarda, ya da cep telefonu şirketi, bu olduğunu düşünüyorum