PHP - foreach problem

Imam en majhen problem pri programiranju, ki pa bo verjetno težje za razumeti.

Namreč imam eno skupno tabelo v kateri se nahajajo kateri se nahajajo kategorije in podkategorije (te se povezane z row-om parent_kat).

V kolikor bi uporabnik izbral eno glavno glavno pokategorije, bi želel, da se mu prikažejo vsi izdelki, ki so povezani s pokategorijami. Namreč izdelki niso nikoli "pisani" pod glavnimi kategorijami ampak samo s podkategorijami.

Nekaj sem že poizkušal a vedno brez uspeha, ker mi je ta foreach vedno delal težave.

Tole spodaj je nastala čista zmeda, tako da prosim brez posmeha :)

$sql = 'SELECT kat_id, kat_ime, kat_parent_id, kat_url FROM oglasi_kategorije WHERE kat_parent_id=\'' . $catid . '\'';
        $result = $db->sql_query($sql);

        $search_id = array();
        while ($search_id = $db->sql_fetchrow($result)) {
            $search_id[] = intval($search_id['kat_id']);
        }

        foreach ($search_id as $key) {
            // ????????
        }

        if (!empty($search_id['kat_id'])) {
            $sql_where_query .= "AND kat_id IN (".$search_id['kat_id'].") ";
        }

8 odgovorov

Zakaj pa ne narediš nekaj v tem stilu:

$result = mysql_query(sql_stavek) or die(mysql_error());

while ($row = mysql_fetch_assoc($result))
{
    //$row['ime_kolone_v_tabeli''] ...
}

To je zelo preprost primer povpraševanja po podatkih v mysql bazi.

Boš moral pa join podkategorij, kategorij in izdelkov narest, ali pa v foreachu izvajat SQL stavke, ki bodo dobili podatke od posameznega izdelka, recimo: SELECT * FROM izdelek WHERE katid = '$key'; ... tist if na koncu pa ne rabiš. Kot prvo, ni katid v $search_id arrayu. Predlagam ti joinanje tabel, pa potem samo izpišeš želene kolone...

edit: pa intval ni potreben oz. v določenih primerih imaš lahko čudne rezultate... v bazi raje nastavi da je kat_id kolumna lahko samo int, pa ti ni potrebno skrbeti za te stvari v kodi...

kot je ze bl4ckb1rd omenil... naredi join
recimo takole na hitro
SELECT p.* FROM categories AS c1
LEFT JOIN categories AS c2 ON c1.id=c2.parentid
LEFT JOIN products AS p ON (c1.id=p.cat
id OR c2.id=p.cat_id)
WHERE c1.id=".$catId." ORDER BY....

Thx za pomoč!

Malo me samo skrbi, da bo ta query potekal predolgo z LEFT JOINi, ko bo recimo tabela
izdelkov vsebovala nekaj 1000 vnosov. Se motim?

Zaradi tega sem mislil, da bi bilo lažje dobiti vse podkategorije in vstavil v glavni sql stavek za prikaz izdelkov:

$sql_where_query .= "AND kat_id IN (".$search_id['kat_id'].") ";

Recimo:

$sql_where_query .= "AND kat_id IN (12, 14, 15) ";

SQL je narejen za to... zato pa imamo cache itd... Raje poizkusi, preden te skrbi kaj bo če bo... Tabele z nekaj sto tisoč vrsticami se sortirajo in joinajo brez posebnih problemov, če so SQL stavki pravilno napisani...

1

Kljub vsemu sem našel tisto kar sem iskal:

$sql = 'SELECT kat_id FROM oglasi_kategorije where kat_parent_id=$catid;

        if (!($result = $db->sql_query($sql)))
        {
            echo 'Ne najdem podkategorije';
        }

        $kat_ids = $db->sql_fetchrowset($result);
        $num_kat_ids = $db->sql_numrows($result);
        $db->sql_freeresult($result);

        $total_rows = $num_kat_ids;

        $kat_id = array();

        for ($j = 0; $j < $num_kat_ids; $j++)
        {
            $kat_id[] = intval($kat_ids[$j]['kat_id']);
        }

        $kat_parent_id = " AND kat_id IN (" . implode(', ', $kat_id) . ") ";

Hvala še 1x vsem za pomoč!

Zdej pa tole predelej z foreach za vajo.

Ja sem se zmotil pri foreach-u, ker ga očitno res ne rabim :/ My bad...