Potřebuju pomoct,
vymejšlím na stránky jednoduchý weblog, díky kterému se dají zapisovat plánované akce. Dále při zobrazování to chci vymyslet, aby to zkontrolovalo datum akce a současné datum, a pokud bude akce starší, aby ji to nezobrazovalo a rovnou ji to smazalo z databáze. V tabulce mám tři sloupky:
CREATE TABLE planovane (
datum int NOT NULL PRIMARY KEY,
nazev varchar(60) NOT NULL,
popis text NOT NULL,)
Ten soubor, kterej má zobrazovat, mi ale nefunguje. Hází mi to chybu:
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in c:\apache\htdocs\a\zobrazit.php on line 6
Vypadá takto:
<?
mysql_Connect("localhost");
$zaznam = mysql("akce", "SELECT * FROM planovane ORDER BY datum");
while ($zaznam = MySQL_Fetch_Array($result)):
if($zaznam["datum"] < Time()): // datum akce je mensi nez aktualni
mysql("akce", "DELETE FROM planovane where datum=$zaznam["datum"]");
else:
$result = mysql("akce", "SELECT * FROM planovane ORDER BY popis");
while ($result = MySQL_Fetch_Array($result)):
echo $result["popis"];
endwhile;
endif;
endwhile;
?>
Nevíte, jak lépe ten soubor napsat? Nebylo by třeba lepší těm akcím dát ID, které by se samo generovalo a díky němu by se pak jednodušeji akce z databáze mazali?
Prosím poraďte.....
1) nepoužívej datum jako primární klíč, nemusí být vždy unikátní (2 akce v 1 den)
2) na řádku 6 máš jednoduchou syntaktickou chybu - uvozovky vnořené do druhých uvozovek (konkrétně místo $zaznam["datum"] dej $zaznam['datum'])
3) netuším, co znamená ten první parametr nesmyslné funkce mysql
Zkus to třeba takto :
CREATE TABLE planovane (
id int(11) NOT NULL auto_increment,
datum int(11) NOT NULL default '0',
nazev varchar(60) NOT NULL default '',
popis text NOT NULL,
PRIMARY KEY (id)
)
/* datum ukladej jako unixovy cas - fce Time() - pocet sekund od 1.1.1970 (?) */
<?
$spojeni = @MySQL_Connect($db_server, $db_user, $db_password) or Die("Nepodařilo se připojit k databázi!");
$db = @MySQL_Select_DB($db_name, $spojeni) or Die("Nepodařilo se připojit k databázi!");
$sql = "DELETE FROM planovane WHERE datum < " . Time();
$query = MySQL_Query($sql);
$query = MySQL_Query("SELECT * FROM planovane ORDER BY datum");
while ($result = MySQL_Fetch_Array($query))
{
echo $result['datum'] . " | " . $result['nazev'] . " | " . $result['popis'] . "<BR>\n";
}
MySQL_Free_Result($query);
MySQL_Close($spojeni);
?>
Snad jsem tam neprehledl nejakou chybu a fungovat to bude :>)
A treba ti poradi nekdo jeste lepe ;-)
No, myslím, že ta odpověď byla vyčerpávající.
Chtěl jsem původně napsat pár připomínek, ale po přečtení jsem zjistil, že jsou zavádějící, tak se omezím jen na tuhle:
Místo php fce Time() můžeš použít přímo fci MySQL UNIX_TIMESTAMP() takže ten jeden řádek by pak byl:
$sql = "DELETE FROM planovane WHERE datum < UNIX_TIMESTAMP()";
PS: Tohle jsem napsal, abych mohl také něčím přispět a dělat chytrýho, když už to Pavel tak skvěle popsal ;-)
> UNIX_TIMESTAMP()
Taky jsem uvažoval, jestli mu to tam nedám, ale snazší je imho nejprve pochopit všechny funkce php...
A taky se mi zdá, že může nastat problém v různě natsveném času na webovém a databázovém serveru (i když by se to stávat nemělo).
Stejně je to taková prkotina :-)
p.s.: Určitě by to šlo napsat lépe, já to jen narychlo vysvětloval.
S rozdílným časem u servru na kterém běží PHP a MySQL jsem se setkal. Člověk prostě musí používat to, nebo ono raději neriskovat míchání php fcí s MySQL funkcema, neboť pak můžou vycházet zajímavé výsledky.
Jinak nevím, jak lépe to napsat. Určitě je to dobré a jen by se to dalo zestručnit na míru té oné konkrétní aplikaci.