Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

Afisare inregistrari din sub-categorii in cat. principala
Vezi mesajul original

 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> MySQL
Subiectul anterior :: Subiectul următor  
Autor Mesaj
mike07



Data înscrierii: 04/Noi/2006
Mesaje: 14

Trimis: Vin Noi 23, 2007 9:12 am    Titlul subiectului: Afisare inregistrari din sub-categorii in cat. principala  

Am 2 tabele: una care cuprinde categoriile, principale si secundare si o tabela care cuprinde inregistrari in categoriile secundare. Ceea ce doresc sa fac este sa afisez toate inregistrarile din cat secundare in cat principala daca un anumit camp din aceste inregistrari are o anumita valoare, de ex. "1".

Structura categoriilor (tabela "cat") este de forma:
cat_id sub_cat name
1 0 A
2 1 B
3 1 C

ceea ce inseamna ca A este cat principala si B, C sunt categorii secundare ale cat. A. Deci sa zicem ca in sub-cat B am 2 inregistrari si in C am 1 inregistrare, toate 3 cu campul x=1 (in tabela "ad"), as dori ca intr-o pagina care chiama cat A (?cat_id=1) sa se afiseze numai aceste 3 inregistrari.

Mentionez ca tabela "ad" are un camp care se chiama "catid" si identifica categoria din care face parte inregistrarea.

Ceea ce am gasit pina acum e sa identific daca categoria apelata e principala sau secundara si daca e secundara sa creez un array cu id-urile sub-categoriilor. Dar nu stiu cum sa le corelez cu tabela "ad".

$sub = mysql_query("SELECT sub_cat FROM cat WHERE cat_id=$cat_id");
$sub1 = mysql_result($sub,0);

if ($sub1 == 0){
$result = mysql_query("SELECT cat_id FROM cat WHERE sub_cat=$cat_id");
$arr = mysql_fetch_array($result);

}

Sper ca am fost destul de clar si ca cineva poate sa ma ajute.
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1600
Locație: Sibiu

Trimis: Vin Noi 23, 2007 10:48 am    Titlul subiectului:  

Simplu: parseaza categoriile recursiv, plecand de la id-ul dat ca parametru.
Sus  
mike07



Data înscrierii: 04/Noi/2006
Mesaje: 14

Trimis: Vin Noi 23, 2007 5:48 pm    Titlul subiectului:  

Poti te rog sa-mi dai un exemplu?

Am incercat ceva de genul...

$res1=array();
for ($i = 0; $i < count($arr); $i++) {

$res=mysql_query("SELECT * FROM ad WHERE catid=$arr[i] AND x='1'") or die(mysql_error());
$res1=array_merge($res, $res1);
}

dar imi da eroare.
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1600
Locație: Sibiu

Trimis: Sâm Noi 24, 2007 7:20 pm    Titlul subiectului:  

Incearca asa:
<?     $date = array(); //in aceasta variabila o sa bagam datele extrase     function parse_categorii(&$result_array, $parent_id) { // pasam argumentul prin referinta         global $conn;         // ne conectam la baza de date daca nu suntem deja conectati         if (!isset($conn)) $conn = mysql_connect('localhost', 'user', 'pass');                  $qry = 'SELECT * FROM `cat` WHERE `sub_cat` ';         if ($parent_id == null) $qry .= 'IS NULL'; //presupunem ca principalele categorii au campul `sub_cat` = null.         else $qry .= '= ' . $parent_id;         $cats = mysql_query($qry);                  while ($row = mysql_fetch_object($cats)) {             $result_array[] = array('cat_id' => $row->cat_id, 'nume' => $row->nume);                          parse_categorii($result_array, $row->cat_id); //apelam aceeasi functie pentru categoriile subordonate randului curent.         }     }          // apelam functia si introducem datele in array-ul $date     parse_categorii($date, null);          // afisam rezultatele     foreach($date as $data)         echo $data['cat_id'], '&nbsp;', $data['nume'], '<br />'; ?>
Sus  
mike07



Data înscrierii: 04/Noi/2006
Mesaje: 14

Trimis: Dum Noi 25, 2007 8:22 am    Titlul subiectului:  

Multumesc pentru raspuns..

Bazat pe ceea ce mi-ai trimis si corelat cu ceea ce am eu nevoie, am modificat codul in felul urmator:
<?
@$cat = $_GET['cat'];
//aici e conectarea la baza de date
$sub = mysql_query("SELECT sub_cat FROM cat WHERE cat_id=$cat") or die(mysql_error());
$sub1 = mysql_result($sub,0);

if ($sub1 == '0'){
$date = array();

function parse_categorii(&$result_array, $parent_id) {

$qry = 'SELECT * FROM cat WHERE sub_cat=$cat';
if ($parent_id == null) $qry .= '0';
else $qry .= '= ' . $parent_id;
$cats = mysql_query($qry);

while ($row = mysql_fetch_object($cats)) //executand comanda asa imi da eroarea "Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource"
{
$result_array[] = array('cat_id' => $row->cat_id);

parse_categorii($result_array, $row->cat_id);
}
}

parse_categorii($date, null); //in urma executarii acestei functii ar trebui sa am array-ul $date={2,3}, numai valorile lui cat_id ma intereseaza
}

$res1=array();

foreach($date as $data)
{$res=mysql_query("SELECT * FROM ad WHERE catid=$data[cat_id] AND x='1'") or die(mysql_error());
$res1=array_merge($res, $res1); // aici ar trebui sa am array-ul $res1 cu toate inregistrarile din tabela "ad" care se regasesc in categoriile B si C si au campul x=1
}

?>

Din pacate nu merge. Sigur gresesc pe undeva. Poti te rog sa-mi spui unde?
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1600
Locație: Sibiu

Trimis: Dum Noi 25, 2007 5:06 pm    Titlul subiectului:  

Ok, se pare ca sunt anumite parti din cod care nu ai inteles de ce le-am facut asa si le-ai modificat cam dupa ureche. Voi elabora:
1.
<? ...         $qry = 'SELECT * FROM `cat` WHERE `sub_cat` ';         if ($parent_id == null) $qry .= 'IS NULL'; //presupunem ca principalele categorii au campul `sub_cat` = null.         else $qry .= '= ' . $parent_id;  ... ?>
Am folosit acel if-else pentru ca in mysql un query de genul Cod:
SELECT * FROM `tabela` WHERE `camp` = NULL
e gresit si crapa. Varianta corecta este: Cod:
SELECT * FROM `tabela` WHERE `camp` IS NULL
Presupunand ca sub_cat e NULL pentru categoriile principale (nivel 0) - eu asa fac pentru ca poate am categoria cu id-ul 0 - am interpretat in functie de NULL/altceva. Tu fiindca ai lasat cele doua linii desi nu mai aveai nevoie de ele, iti vor concatena la $qry ori 'IS NULL' ori '= $parent_id' si iti va da peste cap query-ul. De aia crapa la mysql_fetch_object.

2. $qry = 'SELECT * FROM cat WHERE sub_cat=$cat';

Asta va incerca sa transmita la mysql query-ul exact asa cum il vezi, pentru ca stringul este intre apostroafe, deci nimic din el nu va fi interpretat decat ca atare. Daca vrei sa iti inlocuiasca $cat cu valoarea ei, ori faci concatenare ('... WHERE sub_cat = ' . $cat) ori folosesti ghilimele.

3. Aceeasi linie: tu faci query-ul cu sub_cat = $cat, deci de fiecare data cand apelezi functia se selecteaza subcategoriile lui $cat. Pai daca tot am dat parametrul functiei pe $parent_id, pai atunci faci cu '... WHERE sub_cat = ' . $parent_id, iar la final in loc de Cod: parse_categorii($date, null); pui Cod: parse_categorii($date, $cat);

Fa modificarile astea si ar trebui sa mearga. Dupa ce vezi ca merge, te lasi de php, te apuci de programare, si dupa ce stii programare si inveti cum se face o functie si cum se apeleaza ea, inveti si php daca mai vrei.
Sus  
dechim



Data înscrierii: 10/Mai/2005
Mesaje: 595
Locație: Drobeta Turnu Severin

Trimis: Dum Noi 25, 2007 5:33 pm    Titlul subiectului:  

Avand in vedere ca n-ai decat un nivel al subcategoriilor nu te complica cu recursivitatea, e mai greu pentru inceput.
Incearca asta:
Cod:
<?php
error_reporting(E_ALL); 

function parse_cat($id) {
   $return = array();
   $qry1 ="SELECT ad.* FROM ad LEFT JOIN cat ON ad.catid = cat.cat_id WHERE sub_cat = $id; ";
   if ($result1 = mysql_query($qry1)) {
      while ($row1 = mysql_fetch_assoc($result1)) {
         $return[] = $row1;
      }
   } else echo mysql_error();
   return $return;
}

// test 
$server = '';
$user = '';
$pass = '';
$database = '';
$id = 1;   // categoria principala pe care vrei sa o afisezi

if ($conn = mysql_connect($server,$user,$pass)) {
 if ($db = mysql_select_db($database,$conn)) {
   $arr = parse_cat($id);
   foreach ( $arr as $noRow => $arrRec) {
       echo "<hr /> #" , $noRow+1;
      foreach ($arrRec as $fld => $val) {
         echo "<br />" , $fld , " => ", $val;
      }
   }
 }
}

?>

Am inteles bine ?
Tabela "cat"
=========
cat_id INT
sub_cat INT
name VARCHAR

Tabela "ad"
=========
catid INT
camp1 ...
.....
campn

- ad.catid este campul de legatura cu cat.cat_id
- cat.sub_cat contine cat.cat_id al categoriei principale
Sus  
mike07



Data înscrierii: 04/Noi/2006
Mesaje: 14

Trimis: Lun Noi 26, 2007 2:35 am    Titlul subiectului:  

@mihaitha

OK. Daca am inteles bine ceea ce mi-ai zis, am modificat codul asa:

Cod: <?
@$cat = $_GET['cat'];
//aici e conectarea la baza de date
$date = array();

    function parse_categorii(&$result_array, $parent_id) {
       
        $qry = 'SELECT * FROM `cat` WHERE sub_cat=`.$parent_id ';
        if ($parent_id == null) $qry .= 'IS NULL';
        else $qry .= '= ' . $parent_id;
        $cats = mysql_query($qry);
       
        while ($row = mysql_fetch_object($cats)) {
            $result_array[] = array('cat_id' => $row->cat_id);
           
            parse_categorii($result_array, $row->cat_id);
        }
    }
   
   parse_categorii($date, $cat);

$res1=array();

foreach($date as $data)
{
$res=mysql_query("SELECT * FROM ad WHERE catid='$data[cat_id]' AND x='1'") or die(mysql_error());
$res1=array_merge($res, $res1);
}
//si mai departe prelucrez ceea ce imi da in $res1
?>

Eroarea ramane aceeasi: "mysql_fetch_object(): supplied argument is not a valid MySQL result resource"

===============
@dechim

Functia a fost buna, exact ce-mi trebuia. Mai era un camp "x" pentru "ad", dar e OK. M-am descurcat.
Multumesc
Sus  
dechim



Data înscrierii: 10/Mai/2005
Mesaje: 595
Locație: Drobeta Turnu Severin

Trimis: Lun Noi 26, 2007 3:04 am    Titlul subiectului:  

Don't mention it!
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1600
Locație: Sibiu

Trimis: Lun Noi 26, 2007 10:28 am    Titlul subiectului:  

Se pare ca am vorbit singur:
1. valoarea care ia $qry e in continuare gresita. Termeni pe care nu ii cunosti:
apostrof = '
ghilimele = "
backquotes = `

Vezi diferenta? Eu am zis sa faci concatenare ori sa folosesti ghilimele. Deci $qry trebuie sa arate ori asa: Cod: $qry = 'SELECT * FROM `cat` WHERE sub_cat=' . $parent_id; ori asa Cod: $qry = "SELECT * FROM `cat` WHERE sub_cat=$parent_id";
2. repet: in conditiile in care folosesti tu functia, cele doua linii: Cod:         if ($parent_id == null) $qry .= 'IS NULL';
        else $qry .= '= ' . $parent_id; nu sunt necesare si doar iti dau query-ul peste cap! Sterge/comenteaza-le si iti va merge.
Sus  
gabyrusu



Data înscrierii: 11/Iun/2006
Mesaje: 33
Locație: Brasov

Trimis: Mar Apr 22, 2008 1:20 pm    Titlul subiectului:  

am reusit sa fac chestia asta .... acum am o intrebare....

cum pot sa fac sa-mi organizez rezultatul in liste?
de ex:

<ul>Categorie 1 (nivel 0)
<li>Subcategorie 1 (nivel 1)
<ul>Subcategorie 1 1 (nivel 2)
<li>Subcategorie 1 1 1</li> (nivel 3)
<li>Subcategorie 1 1 2</li> (nivel 3)
</ul>
</li>
</ul>

imi trebuie o conditie in while-ul ala, ceva care sa-l faca sa se duca pana la ultimul nivel pentru fiecare categorie?

chestia asta ma cam depaseste sincer.... :(
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1600
Locație: Sibiu

Trimis: Mar Apr 22, 2008 3:31 pm    Titlul subiectului:  

Momentan n-am timp sa te ajut, sunt la lucru. Ai oleaca de rabdare pana diseara si povestim atunci.
Sus  
gabyrusu



Data înscrierii: 11/Iun/2006
Mesaje: 33
Locație: Brasov

Trimis: Mie Apr 23, 2008 12:14 pm    Titlul subiectului:  

k astept :) ms mult
pana atunci mai incerc si eu poate ii dau de cap

off..... tot nu reusesc :?

stie cineva daca exista vreo clasa php sau javascript care sa-mi transforme un array intr-o structura arborescenta???
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> MySQL
Pagina 1 din 1


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community