 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| 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: 1421
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: 1421
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'], ' ', $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: 1421
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: 549
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: 549
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: 1421
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: 1421
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 |
|
| |
|