PHP: Bir-döngüde mysql_fetch_array () çok uzun sürüyor

4 Cevap php

PHP / MySQL kullanarak bir istemci için bir online takvim oluşturma.

Ben bir <table> ve <tr> başlatılan ve bundan sonra gün içinde maksimum sayıya kadar her gün için yeni bir <td> yaratan bir süre döngü var ay.

Sonra çizgi <td>, PHP içinde biçimlendirilmiş Unix zaman damgası değerine $i (sayaç) değerini karşılaştırarak, o gün meydana gelen olayların bir MySQL veritabanı arar veritabanının satır. Bir maç yapılır SADECE iç satır sayacı artırmak amacıyla, ben sonuç için yeni bir dizi getirir iken başka bir döngü yaptık. Bu anlamlı yükleme süresini yavaşlatıyor.

İşte kod böylece gereksiz şeyler okumak zorunda değilsiniz, kısalttığı bulunuyor:

$qry = "SELECT * FROM events WHERE author=\"$author\"";
$result = mysql_query($qry) or die(mysql_error());

$row = mysql_fetch_array($result);

for ($i = 1; $i <= $max_days; $i++) {

    echo "<td class=\"day\">";

    $rowunixdate_number = date("j", $row['unixdate']);

    if ($rowunixdate_number == $i) {
    	while ($rowunixdate_number == $i) {
    		$rowtitle = $row['title'];
    		echo $rowtitle;
    		$row = mysql_fetch_array($result);
    		$rowunixdate_number = date("j", $row['unixdate']);
    	}
    }

    echo "</td>";

    if (newWeek($day_count)) {
    	echo "</tr><tr>";
    }
    $day_count++;

}

4 Cevap

Sizin için tüm etkinlik düzenleyecek almak için çalışıyorsanız - yerine 1 sorgusunun Nael El Shawwa'nın belirttiği gibi before Sen, HTML tablosu oluşturmak 31 sorgular, yapıyoruz, çünkü yavaşlık büyük olasılıkla ay için belirli bir yazar, tek bir SQL sorgusu bu seçin, ve sonra aslında tablo oluşturmak için ayarlanmış sonucu üzerinde yineleme gerekir. Örneğin

$sql = "SELECT * FROM events WHERE author = '$author' ORDER BY xdate ASC";
$rsEvents = mysql_query($sql);
echo("<table><tr>");
while ($Event = mysql_fetch_array($rsEvents)) {
    echo("<td>[event info in $Event goes here]</td>");
}
echo("</tr></table>");

Ayrıca, SQL sorguları ve HTML nesil intermix genellikle kötü bir fikir. Sizin dış veri tek bir yerde, başka oluşturulan çıkış veri toplanmış olmalıdır. Benim örnek hemen HTML nesil önce SQL alarak, yakın keser, ama hala bir HTML blok onu sağ ortasında SQL sorguları içeren olması daha iyidir.

Bunu ne kadar sürdüğünü görmek için bir MySQL aracı bu sorguyu çalıştırmak?

Eğer yazar sütun üzerinde bir dizin var mı?

Lütfen PHP ile yanlış bir şey yok. Ben sorgu sorundur ve hiçbir indeks nedeni şüpheli.

Bu performans sorunları en yaygın kaynaklardan biri olduğu için bir kenara yukarıdaki yorumlarından, ayrıca sql sorgu optimize etmek deneyin.

let Başlık, Tarih, Blurb, İçerik alanları ile bir haber makalesi tablo var ve sadece başlık alıp html sayfasında bir liste olarak görüntülemek gerekir ki,

to do a "SELECT * FROM TABLE" means that you are requiring the db server to fetch all the field data when doing the loop (including the Blurb and Content which you are not going to use).

Eğer böyle bir şey optimize ederseniz:

"SELECT Title, Date FROM TABLE" sadece gerekli verileri almak istiyorsunuz ve sunucu kullanımı açısından daha verimli olacaktır.

ben bu size yardımcı olur umarım.

'Yazar' bir kimliği mi? veya bir dize? Her iki şekilde de bir dizin size yardımcı olacaktır.

Sorgu, soruna neden döngü thats için onun yavaş değil. Onun tam değildir; $ i döngü koşulu ve Artım eksik. Ya da bu bir yazım hatası mı?

Neden sadece tarihe göre sorgu sipariş yok?

SELECT * FROM events WHERE author=? ORDER BY unixdate ASC

ve size tablo eski tarihe göre grup etkinlikleri için gerekli herhangi bir mantığı olması üzerinde geçerli tarihini saklamak için bir değişken var. Aynı tarihte aynı renk ile tüm olay satırları veriyor.

Etkinliğin zaman hesaba gelmez bir unix zaman sonra bunu yapabilirsiniz tarih olduğunu varsayarak:

$currentDate = 0;
while(mysql_fetch_array($result)){
    if($currentDate == $row['unixdate']){
         //code to present an event that is on the same day as the previous event
    }else{
        //code to present an even on a date that is past the previous event
        //you are sorting events by date in the query
    } 

    //update currentDate for next iteration
    $currentDate = $row['unixdate'];
}

unixdate olay zamanı içeriyorsa, o zaman sadece saat ve dakika hariç unix tarih timestmap ayıklamak için bazı mantık eklemek gerekir.

Umut olur