Autor Zpráva
kimmy
Profil *
Ahoj,

prosím mohl by mi někdo poradit, jak jinak zapsat toto, aby to fungovalo?:

$query = mysql_query("SELECT ... atd ");
$query3 = mysql_query("SELECT ... atd ");

while ($row = mysql_fetch_array($query)) {

	echo '<table border="1" width="25%" align="left">';
	echo '<tr><th class="center" height="20px">'.$row['nazev'].'</th></tr>';
	$zobraz_img='<img src="'.__SITE_URL__.__URL__.'img_produkty/male/'.$row['image'].'" alt="'.$row['nazev'].'" />';
	echo '<tr><td height="150px" class="center">'.$zobraz_img.'</td></tr>';
	
	while ($row3 = mysql_fetch_array($query3)) {
		if ($row['id'] == $row3['id'])
			echo '<tr><td height="20px" class="center">'.$row3['nazev_hodnoty'].'</td></tr>';
	}	
	echo '</table>';
}


Vím, že tam vadí to, že volám mysql_fetch_array podruhé (protože je v cyklu prvního mysql_fetch_array) a on už se podruhé nevykoná, ale jak jinak to lze řešit? Ten řádek $row3['nazev_hodnoty'] mi to tím pádem vypíše pouze v první tabulce a v dalších už ne..

Nevíte někdo jak na to?

Děkuju
Alphard
Profil
nepomohlo by mysql_data_seek()?
bohyn
Profil
kimmy
Volat na zacatku nebo na konci prvniho while mysql_data_seek($query3, 0);

- Kdyz chces jen asociovane pole pouzivej mysql_fetch_assoc() - je to o fous rychlejsi a mene pametove narocne.
- Neni pekne deklarovat konstanty zacinajici "__" - mely by byt vyhrazeny pro PHP.
kimmy
Profil *
děkuji za rady.. mysql_data_seek($query3, 0); mi vyhodí hlášku Warning: mysql_data_seek(): Offset 0 is invalid for MySQL result index 13 (or the query data is unbuffered) in... Dívala jsem se do manuálu PHP a zkoušela tu chybu vyhledat v nějaké diskuzi, ale ani tady, ani jinde jsem nenašla nic, co by mi pomohlo.. Nevíte, prosím, co to znamená?
kimmy
Profil *
A nemůžu to udělat třeba takto? Takto mi to funguje:

$query = mysql_query("SELECT ... atd ");

while ($row = mysql_fetch_array($query)) {

	echo '<table border="1" width="25%" align="left">';
	echo '<tr><th class="center" height="20px">'.$row['nazev'].'</th></tr>';
	$zobraz_img='<img src="'.__SITE_URL__.__URL__.'img_produkty/male/'.$row['image'].'" alt="'.$row['nazev'].'" />';
	echo '<tr><td height="150px" class="center">'.$zobraz_img.'</td></tr>';
	
        $query3 = mysql_query("SELECT ... atd ");

	while ($row3 = mysql_fetch_array($query3)) {
		if ($row['id'] == $row3['id'])
			echo '<tr><td height="20px" class="center">'.$row3['nazev_hodnoty'].'</td></tr>';
	}	
	echo '</table>';
}


Jen nevím jestli to nebude paměťově moc náročné..
tiso
Profil
kimmy - môžeš, ale zbytočne to riešiš takto, naštuduj si spájanie (JOIN) tabuliek, a vyberieš to jedným dotazom.
bohyn
Profil
kimmy
Mohlo by to delat kdyz je vysledek dotazu prazdny, viz. PHP manual

row_number starts at 0. The row_number should be a value in the range from 0 to mysql_num_rows() - 1. However if the result set is empty (mysql_num_rows() == 0), a seek to 0 will fail with a E_WARNING and mysql_data_seek() will return FALSE.
kimmy
Profil *
tiso
Já to řeším pomocí JOIN, ty dotazy vypadají takto:

$query = mysql_query("  SELECT 
DISTINCT p.id AS id,
m.$nazev AS nazev,
f.file AS image,
sp.$nazev AS nazev_polozky
FROM produkty p
JOIN produkty_matky m ON p.id_matka=m.id_matka
LEFT JOIN produkty_foto f ON f.id_produkt=p.id AND f.razeni=0
LEFT JOIN sablony_obsah so ON so.id_produkt = p.id 
LEFT JOIN sablony_polozky sp ON sp.id_polozka = so.id_polozka
LEFT JOIN sablony_seznam ss ON ss.id_sablona = sp.id_sablona
LEFT JOIN sablony_hodnoty sh ON sh.id_hodnota = so.id_hodnota
WHERE m.web='".__WEB__."' 
AND p.id IN (".implode(", ", $_SESSION['porovnani']).")
GROUP BY p.id
ORDER BY p.id
") or die(err(1)); 

$query3 = mysql_query("  SELECT 
p.id AS id,
sp.id_polozka AS id_polozky,
sh.$nazev AS nazev_hodnoty
FROM produkty p
JOIN produkty_matky m ON p.id_matka=m.id_matka
LEFT JOIN sablony_obsah so ON so.id_produkt = p.id 
LEFT JOIN sablony_polozky sp ON sp.id_polozka = so.id_polozka
LEFT JOIN sablony_seznam ss ON ss.id_sablona = sp.id_sablona
LEFT JOIN sablony_hodnoty sh ON sh.id_hodnota = so.id_hodnota
WHERE m.web='".__WEB__."' 
AND p.id = '".$row['id']."' 
ORDER BY sp.id_polozka
") or die(err(1));


Akorát že jednou potřebuju mít v dotazu GROUP BY p.id, a podruhé ne.
Smokie
Profil
Možná že vím co potřebuješ : zkus to zapsat takhle :
while ($row = mysql_fetch_array($query) and $row3 = mysql_fetch_array($query3))
//Vypsání do prohlížeče ...
tiso
Profil
kimmy - pekná divočina...
$query:
Potrebuješ niekde sp.$nazev AS nazev_polozky? Ak nie, tak ti stačí spojiť prvé 3 tabuľky, inak prvých 5. Posledné 2 tam sú úplne zbytočné, nevraciaš z nich žiadne dáta.

$query3:
stačilo by ti spájať až šablónové tabuľky a miesto where p.id=... tam daj where so.id_produkt=...

Ale toto fakt ide spraviť jedným dotazom, s tým že si hlavičku tabuľky vypíšeš len raz pri prvom pirechode cyklom, a ostatné riadky toľkokrát, koľko máš riadkov:

while(...){
  if(!isset($first){
    //vypis zahlavie
    $first='no';
  }
  //vypis riadok tabulky
}
kimmy
Profil *
tiso
Myslíš, že by celé porovnávání produktů šlo vyřešit jedním dotazem? Já mám 3 ($query, $query2, $query3). Pomocí prvního vytáhnu pouze názvy výrobků a obrázky, pomocí druhého názvy položek pro porovnávání (velikost, barv, ...a) a pomocí třetího jednotlivé hodnoty porovnávaných položek (malá, modrá, ...).

Ještě se mi nepodařilo zkombinovat to tak, aby mi stačil jen jeden dotaz, ale aby mi vytáhl vše potřebné a aby to pak šlo pěkně nacpat do nějaké tabulky.

V tom případě, který mám teď, mi to vypisuje zvlášť tabulku pro položky pro porovnávání a za to několik tabulek, pro každý produkt jednu.. Vypadá to třeba takto: ukázka

Ale problém je v tom, že to pod obrázky produktů vypíše všechny hodnoty nezávisle na první tabulce s položkama. A pak mám například v řádku VELIKOST hodnotu SLADKÉ.

Nemohl bys mi s tím, moc prosím, trochu pomoct? Já už se nad tím trápím asi 4. den :-(
tiso
Profil
kimmy - ťažko radiť, keď neviem aké presne máš tabuľky, čo obsahujú, a čo to vlastne celé s nimi robíš a chceš robiť... Ak máš ICQ, tak ho sem napíš, alebo ma kontaktuj cez stránku v mojom profile.
kimmy
Profil *
tiso
moje icq je 199-256-580, ale nechci Tě nějak moc zdržovat..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0