PHP - iç içe mysql_fetch_array ile () sorun beni deli

4 Cevap php

MySQL sorgusu:

SELECT title,alias,parent FROM '._prefix.'categories 
WHERE (language = \''._language.'\' || language = \'all\') 
&& status = \'published\'
ORDER BY rank ASC

(PhpMyAdmin itibaren) Sonuç:

title    |  alias   |  parent
Home     | home     |    0
Todo     | todo     |    0
Multiuser| todo_mu  |    21
Modulsys | todo_mod |    21

PHP:

while($c = mysql_fetch_array($category_result)) {
    if($c['parent'] == 0) {
        $output .= '<li><a href="'._rewrite_string.$c['alias'].'" title="'.$c['title'].'">'.$c['title'].'</a>';

        $output .= '<ul>';

        mysql_data_seek($category_result,0);

        while($d = mysql_fetch_array($category_result)) {

            $output .= '<li class="space_left"><a href="'._rewrite_string.$c['alias'].'/'.$d['alias'].'" title="'.$d['title'].'">'.$d['title'].'</a>';

            $output .= '</li>';

        }

        $output .= '</ul>';

        $output .= '</li>';
    }
}

Bu, böyle bir kategori listesini oluşturmak gerekir

cat 1

  • Subcat 1
  • subkedi 2

kedi 2

cat 3

ama böyle bir şey üretir

cat 1

  • cat 1
  • kedi 2
  • Subcat 1
  • subkedi 2

using the mysql_fetch_array into another (nested) without using mysql_data_seek causes an abort once the nested mysql_fetch_array was called. it only outputs cat1 and nothing more.

Bana çözüm lütfen, teşekkür ederim

4 Cevap

$i = 0;
while($c = mysql_fetch_array($category_result)) {
    $parent = $c['parent'];
    $next_row = $i + 1;

    $not_last_row = (mysql_data_seek($category_result, $next_row)); //Move ahead to get next parent or returns false if on last row...
    $next_parent = (!$not_last_row) ? $c['parent'] : FALSE;
    mysql_data_seek($category_result, $i); //Move back to current row

    $open_list = ($parent != $prev_parent);
    $close_list = (($parent > $next_parent) || !$not_last_row); //close list if next parent is smaller number or if this is last row.

    $output .= ($open_list) ? "<ul>" : "";

    $output .= '<li>'.$c['title'].'</li>';

    $output .= ($close_list) ? '</ul>' : "";

    $prev_parent = $parent; //Set this so that on next loop, we can see if they match
    $i++;
}

Bu biraz acele, ama ben bu aklınızdaki ne olduğunu düşünüyorum. Önceki üst akım üst eşleşmiyor Temelde, bir listesini açın. Mevcut ana bir sonraki ana daha büyük ise, liste kapatın.

Muhtemelen bu son yineleme olduğu için hesaba şey eklemek gerekir.

Sen beklenen sonucu alıyorsanız. Eğer sonuç kümesi a,b,c,d varsa, a olan bir ana kategori ile başlayan, bu nedenle setin başlamasından sarar ve yineleme [(0)] {aracılığıyla } yine alt kategorileri gibi. Artık daha fazla veri orada hiçbir şekilde hem döngüler çıkacaktır setin sonunda vardır.

Ne muhtemelen yapmak istediğim ilk bir PHP diziye tüm verileri okumak için, o üzerinde yineleme ve bir ağaç yapısı çeşit oluşturmak. Ayrıca mysql_fetch döngü içinde doğrudan ağaç yapısını oluşturmak mümkün olabilir.

Size ulaşmak için çalışıyoruz ne bağlı olarak, veri depolamak için daha iyi yollar da vardır. Bu SQL ağaçları ve hiyerarşik veri depolamak için nasıl kadar okumaya değer. İç içe setleri ne istediğinizi muhtemelen.

Bir başka şey: mysql_fetch_array yerine mysql_fetch_assoc kullanmaz yok. Aksi takdirde, sayısal ve ilişkisel tuşları ve gerektiği verilerin iki miktarda içeren bir satır dizisi ile sonuna kadar.

Böyle hızlı ve kirli çözüm denemek isteyebilirsiniz:

  1. Eğer $ category_result ve $ category_result2 alırsınız böylece aynı SQL sorgusu ile 2 sonuç kümesi hazırlar.

  2. Sonra dış döngü ve iç döngü için $ category_result2 için $ category_result kullanın.

Umarım yardımcı olur.

Kod ne yaptığını düşünün:

  1. $c içine bir satır veri getirir ve cat1 başlığı tükürür
  2. Defalarca iç döngü vb subcat1, subcat2, tükürme, $d daha fazla veri getirir girer.
  3. Döngü sonuç kümesinin sonuna ulaştığında, ve üst $c döngünün içine dışarı çıkar
  4. Orada almak için daha fazla veri yok, bu yüzden ana döngü çıkar

Eğer tüm veritabanı işlemleri kaldırdığını olsaydı sözdizimsel, aslında bu yapıyoruz:

 for ($i = 0; $i < 10; $i++) {   // $c = mysql_fetch_array()
    for ($i = 1; $i < 10; $i++) {  // $d = mysql_fetch_array()
         echo $i;
    }
 }

Zamanla iç döngü iç döngü öldürür, $ i 10, bitmiş, ve sonra da, dış döngü öldürür oldu.