From: hengky <[EMAIL PROTECTED]>
> i'm working on database with a lot of category...
> 
> here i example for category that i like to create
> 
> Computer
> Computer/Motherboard
> Computer/Motherboard/AMD
> Computer/Motherboard/Intel
> Computer/Drive & Storage
> Computer/Driver & Storage/SATA
> Computer/Driver & Storage/ATA
> Computer/Driver & Storage/ATA/7200 RPM/
> Computer/Driver & Storage/ATA/10000 RPM/
> Elektronik
> Elektronik/Television
> Elektronik/Television/CRT
> Elektronik/Television/CRT/14 "
> and go on
> 
> so i use on mysql table
> 
> table Category
> 
>  ---------------------------------------
> | id_cat  | nama_category   | id_parent |
>  --------- ----------------- -----------
> | 001     | Computer        | TLCAT     |
> | 002     | Motherboard     | 001       |
> | 003     | AMD             | 002       |
> | 004     | Intel           | 002       |
> | 005     | Drive & Storage | 001       |
> | 006     | SATA            | 005       |
> | 007     | ATA             | 005       |
> | 008     | 7200 RPM        | 007       |
> | 009     | Elektronik      | TLCAT     |
> | 010     | 10000 RPM       | 007       |
> | 011     | Television      | 009       |
> | 012     | CRT             | 011       |
> | 013     | 14"             | 012       |
>  --------- ----------------- -----------

If the structure is only at most 4 (well, a fixed not too big number) 
levels deep you can do this directly in the SQL. Something like:

SELECT
        CASE 
                WHEN C2.nama_category is NULL
                        THEN C1.nama_category
                WHEN C3.nama_category is NULL
                        THEN C2.nama_category + '/' + C1.nama_category
                WHEN C4.nama_category is NULL
                        THEN C3.nama_category + '/' + C2.nama_category + '/' + 
C1.nama_category
                ELSE
                        C4.nama_category + '/' + C3.nama_category + '/' + 
C2.nama_category 
+ '/' + C1.nama_category
        END as nama_category
 FROM Category as C1
 LEFT JOIN Category as C2 ON C2.id_cat = C1.id_parent
 LEFT JOIN Category as C3 ON C3.id_cat = C2.id_parent
 LEFT JOIN Category as C4 ON C4.id_cat = C3.id_parent

Except that you seem to be using 'TLCAT' in the id_parent column for 
the categories that have no parent. This looks strange to me. The 
id_parent should be an Int column, just like the id_cat, not a 
varchar! I don't know mysql so it may handle the id_cat=id_parent 
comparison just fine even if the id_parent equals to 'TLCAT', but I 
would definitely not do this.
 
> this is the script
> 
> #!/usr/bin/perl
> 
> use DBI;
> 
> 
> $dbh = DBI->connect("DBI:$dbtype:$dbname",$dbuser,$dbpass);
> $sth = $dbh->prepare("select * from Category where id_parent =
> 'TLCAT';"); 
> $sth->execute; 
> while(@DataCat = $sth->fetchrow_array() ) {
>     $tl_name = @DataCat[1];

Please go look up the difference between @DataCat[1] and $DataCat[1] 
!

>     ONE:
>     while() {
>         $sth2 = $dbh->prepare("select * from Category where
>         id_parent='@DataCat[2]';"); 
> $sth2->execute;

! Use placeholders !

  $sth2 = $dbh->prepare("select * from Category where id_parent=?;"); 
  $sth2->execute($DataCat[2]);

As you can see the $sth2 doesn't contain anything iteration specific 
so you may move the statement out of the loop so speed things up.

>  while(@DataCat2 = $sth2->fetchrow_array() ) {
>      $tl_name .= "/@DataCat2[1]";
>      print "$tl_name/@DataCat[1]";

1. The $tl_name already contains $DataCat[1], you assigned it to 
there yourself a few lines above.

2. You keep appending to $tl_name in this loop, but you never reset 
it! 
Replace those two lines by just

        print "$tl_name/$DataCat2[1]\n";

>   }
>  $sth2->finish;
>   last ONE:
>      }
>  }
> $sth->finish;
> $dbh->disconnect;

Anyway this would print only up to the second level of the category 
structure, you will need to use a recursive function if you want to 
support arbitrarily deep structures.

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to