Autor Zpráva
Harry
Profil *
Zdravím, snažím sa vytvoriť svoju prvú PHP stránku za pomoci MySQL a narazil som na jeden problém ktorý neviem vyriešiť, ide o zápis WHERE id=$id a ORDER BY RAND(). Potreboval by som radu ako správne napísať to že keď je súbor.php a súbor.php?id=0 či iné číslo ktoré ešte nemám v DB tak sa mu vygeneruje nejaké čo už mám v DB, na to chcem použiť ORDER BY RAND() ale tak tiež chcem aby sa mu zobrazila aj hocijaká iná stránka pri listovaní s tým istým ID, napríklad prejde zo súbor.php?id=1 na súbor0.php?id=1, na to je zase WHERE id=$id. Vytvoriť si odkaz na taký súbor není problém, ale problém je aby generoval ID ak ID není definované alebo není v DB a také ID ktoré je v DB zobrazil.
BetaCam
Profil
Asi sem natvrdlej, ale nemohl by si to popsat nejak lépe?? Sem z toho tvého postu tak nejak zmaten.
Harry
Profil *
Skôr som to zle vysvetlil. Skúsim to napísať lepšie:
- v DB mám tabuľku skin, tá obsahuje id, logo, layot, buttons, backgroud, site, color, adds
v tejto tabuľke budú uložnené možné skiny (dizajny) stránky. A teraz k problému: chcem aby keď sa niekto napojí na stránku, dostal hocijaké id skinu, na to je ORDER BY RAND(). Ale taktiež chcem aby keď listuje na stránke, tak aby sa mu pri tom listovaní už ten skin nemenil.

Čiže niečo ako v matematickom prevedený:
Ak id není definované alebo sa nenachádza v DB tak vygeneruj nové, ale ak id je zadané a je pladné tak nech zobrazí ten skin ktorý má pod tým id.

Príklad:
-v tabuľke skin mám uložené dizajny 1-3 (toto bude ich id)
Uživateľ sa napojí na stránka.php -> vygeneruje sa mu skin
Uživateľ sa napojí na stránka.php?id=0 -> vygeneruje sa mu skin
Uživateľ sa napojí na stránka.php?id=1 -> zobarí sa mu skin ktorý je v DB pod id 1
Uživateľ sa napojí na stránka.php?id=2 -> zobarí sa mu skin ktorý je v DB pod id 2
Uživateľ sa napojí na stránka.php?id=3 -> zobarí sa mu skin ktorý je v DB pod id 3
Uživateľ sa napojí na stránka.php?id=4 -> vygeneruje sa mu skin

A práve toto neviem napísať, ale tuším sa to dá, lebo napríklad phpBB2 vypisuje pri zle zadanom id že zadané id neexistuje. A ja chcem aby sa mieto toho zadané id neexistuje vygenerovalo nové.

Ďakujem sa pomoc.
BetaCam
Profil
Aha tak ted už to konečně trochu chápu. Nic méně tohle pujde řešit asi více způsoby. Mě jako první napadlo něco jako tohle

SELECT id FROM skin
WHERE
id=IF((SELECT id FROM skin WHERE id=$id LIMIT 1),$id,(SELECT id FROM skin ORDER BY RAND() LIMIT 1))
LIMIT 1

nebo něco jako tohle

SELECT id FROM skin
WHERE
id=IFNULL((SELECT id FROM skin WHERE id=$id LIMIT 1), (SELECT id FROM skin ORDER BY RAND() LIMIT 1))
LIMIT 1

za funkčnost ani rychlost neručim a hlavne si myslim ze to je blbost generovat random skin.
Harry
Profil *
Fúha, to je dobré a funguje, diky moc!
Ale mám ešte jednu otázku, ako sá docieliť ORDER BY RAND() keď je súbor v zápise bez ?id=

Príklad:
Uživateľ sa napojí na stránka.php -> vygeneruje sa mu skin

Dá sa to vôbec? Ak nie nevadí, s týmto si už možno nejako poradím aj bez toho.
BetaCam
Profil
treba na zacatek stranky mužeš dát podmínku neco jako :

if(!isset($_GET['id']) OR empty($_GET['id']))
{
$id = 0;
}
else
{
$id = $_GET['id'];
}

Samozdřejmě to bude generovat random skin pouze pokud v DB nebudes mit žadnej skin kterej by mel ID 0
Harry
Profil *
ID 0 nepoužívam, ale občas sa mi stane pri načítaní stránky že sa mi zobrazí iba tá časť ktorá je za posledným } ?>
Ale stane sa to iba ak mám viac ako jedno id. A to neviem prečo, veď zápis je správny.
BetaCam
Profil
ale občas sa mi stane pri načítaní stránky že sa mi zobrazí iba tá časť ktorá je za posledným } ?>
Ale stane sa to iba ak mám viac ako jedno id. A to neviem prečo, veď zápis je správny.


Zas se v tom trochu stracim. Nejak nevim co tim chtel basník říct. Upřesni lépe problém.
Harry
Profil *
Na stránke sa nezobrazí nič z PHP, číže od:
<?
if(!isset($_GET['id']) OR empty($_GET['id']))
{
$id = 0;
}
else
{
$id = $_GET['id'];
}

require_once("../mysql.php");
-------------------------------------------
Až po:
<? } ?>

Zobrazí sa iba to čo je pred tým a po tomto zápise.

A tento zápis <? } ?> tam mám úplne na konci aby som nemusel dávať pozor či som to neukončil dakde inde.
BetaCam
Profil
Zaprvé používej zápis <?php ?> a né <? ?>
A zadruhé furt to nechápu vzhledem k tomu, že já nevidim ten tvuj script a nevim co ti to ma všechno vypisovat a co ne. Musel bych to videt celé nebo aspon podstatnou čast scriptu abych mohl posoudit proč to nedělá to co má. Ale na 99.99% to bude způsobeno nejakou sekerou v kódu.
Harry
Profil *
Takže sem napíšem celý kód stránky demo.php
---------------------------------------------------------------------- --------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?
if(!isset($_GET['id']) OR empty($_GET['id']))
{
$id = 0;
}
else
{
$id = $_GET['id'];
}

// pripojime sa k databaze
require_once("../mysql.php");

// vyber z databazy
$result = mysql_query ("SELECT * FROM skin WHERE
id=IFNULL((SELECT id FROM skin WHERE id=$id LIMIT 1), (SELECT id FROM skin ORDER BY RAND() LIMIT 1))
LIMIT 1");

while ($row = mysql_fetch_array($result))

{

echo "" . $row["adds"] . "" ;
?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>DEMO</title>
<link rel="stylesheet" href="<?

echo "skin/" . $row["id"] . "/style.css" ;

?>" type="text/css" />
</head>

<body><table width="1000" border="0" cellspacing="0" cellpadding="0" height="86">
<tr>
<td width=130 align="center" valign="middle" bgcolor=<?

echo "" . $row["color"] . "" ;

?>><?

echo "" . $row["logo"] . "" ;

?> </td>
<td width=870 align="center"><?

echo "" . $row["layout"] . "" ;

?> </td>
</tr>
</table>

<table width="1000" border="0" cellspacing="0" cellpadding="0" bgcolor="#ffffff">
<tr>
<td width=129 height="792" valign=top bgcolor="<?

echo "" . $row["color"] . "" ;

?>">
<table width="129" height=795 border="0" cellspacing="0" cellpadding="0">
<tr>
<td width=129 height=795 align="center" valign="top" bgcolor=<?

echo "" . $row["color"] . "" ;

?>><?

echo "" . $row["buttons"] . "" ;

?>
<table width="100%" border="0">
<tr>
<td><div align="center"><em><strong>Náhodný obrázok:</strong></em></div></td>
</tr>
<tr>
<td><div align="center">
<iframe src="banners.php" name="I2" width="120" marginwidth="no" height="120" marginheight="no" align="middle" scrolling="No" frameborder="0" id="I2" border="0"> Prohlížeč nepodporuje vložené rámce nebo je nyní nakonfigurován tak, aby je nezobrazoval. </iframe>
</div></td>
</tr>
<tr>
<td><div align="center"><em><strong>Toplist:</strong></em></div></td>
</tr>
<tr>
<td><div align="center"><img src="http://toplist.cz/count.asp?id=232047&amp;logo=mc" border="0"
alt="TOPlist" width="88" height="60" /></div></td>
</tr>
<tr>
<td><div align="center"><em><strong>Reklama:</strong></em></div></td>
</tr>
<tr>
<td><div align="center">
<iframe src="reklama.htm" name="I1" width="120" marginwidth="no" height="40" marginheight="no" align="middle" scrolling="No" frameborder="0" id="I1" border="0"> Prohlížeč nepodporuje vložené rámce nebo je nyní nakonfigurován tak, aby je nezobrazoval. </iframe>
</div></td>
</tr>
</table></td>
</tr>
</table>
</td>
<td width=4>&nbsp; </td>
<td width=877 valign=top>
<table width="871" height=795 border="0" cellspacing="0" cellpadding="0" bgcolor="#ffffff">
<tr>
<td width="871" height="795" align="center" valign="top" bordercolor="#FFFFFF" background=<?

echo "skin/" . $row["id"] . "/pozadie.jpg" ;
?> bgcolor="#FFFFFF"><p><br />
</p> </td>
</tr>
</table>
</td>
</tr>
</table>
</body>
<? } ?>
</html>

Stránka funguje na premenných logo, layout, buttons tieto prvky chcem dostať z DB. Inač ešte som tam nepridal <php, takže vidíš k čomu som sa dopracoval do teraz. Všetko funguje tak ako má, ale stále mi to robí problém že niekdy mi vôbec nič z týchto premenných nezobrazí. Zobrazí len tento kód:
---------------------------------------------------------------------- --------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</html>

Chýb tam je určite veľa, nikto ma neučil robiť stránky, takže som sa učil len skúšaním.
BetaCam
Profil
1. tohle mi prijde jako trochu přehnaná konstrukce :

echo "" . $row["color"] . "" ;

nebylo by jednoduší udělat

echo $row['color'];

2. To ze ti to občas vypiše jen tohle

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</html>


je způsobeno s největší pravděpodobností tímto příkazem

while ($row = mysql_fetch_array($result))

lépe řečeno výběrem z DB tedy tímto

$result = mysql_query ("SELECT * FROM skin WHERE
id=IFNULL((SELECT id FROM skin WHERE id=$id LIMIT 1), (SELECT id FROM skin ORDER BY RAND() LIMIT 1))
LIMIT 1");

pokud tento SELECT nic nevrátí neprovede se ani

while ($row = mysql_fetch_array($result))

takze se nic nevypíse to znamená, že ten SELECT za určitych podmínek nic nevrátí, ale jak tak na ten SELECT koukám nenapadá mě kdy by k této situaci mohlo dojít.
BetaCam
Profil
Ted sem ten SELECT projel v mé DB a opravdu se nechová zcela validne.

SELECT id FROM skin WHERE id=$id LIMIT 1

funguje samostatne i v IFNULL správně vybere ID pokud id = $id

SELECT id FROM skin ORDER BY RAND() LIMIT 1

Samostatně funguje správně vybere RAND() ID
V IFNULL už ovšem správně nefunguje sice vybere RAND() ID, ale občas nevrátí žádné ID i když k tomu nemá důvod.

Až přijedu z práce tak se na ten select ješte jednou kouknu, ale popravde ted v něm žádnou chybu nevidim.
Harry
Profil *
Tak. zatiaľ som si opravil echo "" . $row["x"] . ""; na echo $row["x"];

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: