Dobrý den, mám dotaz ohledně funkce date().
Přesněji mám na svých stránkách chat (http://grelek.wz.cz/chat/) a z formuláře získávám hodnoty proměnných: $jmeno , $zprava a $datum.
Proměnné $jmeno a $zprava mám v pořádku a správně je získávám pomocí $_POST['jmeno'] a $_POST['zprava'].
Zde je PHP soubor "odeslat.php":
<?php
$hostName="mysql.webzdarma.cz" ;
$databaseName = "-";
$userName="-" ;
$password="-" ;
// sestavení SQL dotazu pro přidání zprávy
$dotaz_kodovani = 'SET NAMES utf8';
$dotaz_pridat_zpravu = 'INSERT INTO chatOdeslane(Jmeno, Datum, Zprava)
VALUES("%s", "%s", "%s")';
// pripojeni k databazi
if (!($link=mysql_pconnect($hostName, $userName, $password))) {
echo 'error connecting to host' . $hostName . ' by user ' . $userName;
exit();
};
// vyber databaze
if (!mysql_select_db($databaseName, $link)) {
echo 'Error in selecting ' . $databaseName . ' database';
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
// vykonani SQL dotazu dotaz_kodovani
if (!mysql_query($dotaz_kodovani, $link)) {
echo 'Error in executing ' . $dotaz_kodovani;
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
// vykonani SQL vyrazu pridani zpravy
if (!mysql_query(sprintf($dotaz_pridat_zpravu, $_POST['jmeno'], $_POST['datum'] , $_POST['zprava'], 'A'))) {
echo 'Error in executing ' . $dotaz_pridat_zpravu;
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
?>
A zde se snažím uložit datum pomocí funkce date() do proměnné $datum:
<?php
$datum = date(d.//.m.//.Y H:M:S);
?>
A já se ptám jak správně uložit aktuální datum do databáze..
Mě to totiž kvůli
<?php
$datum = date(d.//.m.//.Y H:M:S);
?>
háže chybovou hlášku:
Parse error: syntax error, unexpected ';' in /7p/wz.cz/g/grelek/chat/index.php on line 69
Když už zkoumáš date, tak by bylo dobré si ho prozkoumat pořádně.
Když se podíváš do manuálu nebo kdekoli jinde, tak zjistíš, že prvním parametrem je řetězec. To znamená, že musí obsahovat uvozovky. V manuálu je rovněž uvedeno co která sekvence znamená.
Ve tvém případě by byl výsledek: 22.//.07.//.2011 14:Jul:nd. Což asi není správně.
Pokud chceš uložit datum do databáze, tak se musí použít standardizovaný tvar date("Y-m-d H:i:s");
Pokud proměnná Datum bude typu TIMESTAMP, nemusíš se o ukládání vůbec starat.
Další možností je
INSERT INTO chatOdeslane(Jmeno, Datum, Zprava)
VALUES("%s", now(), "%s");
A sprav si SQL injection.
Děkuji a Kite, teď se teprve učím práci s databází ale už se chystám na zabezpečení :-).
Tak se podívej, co dělá funkce mysql_real_escape_string() a použij ji na hodnoty z $_GET
Příklad #1 na
http://php.net/manual/en/function.mysql-real-escape-string.php
Jo a Kite, prosím, neexistuje něco takového jako překlad php.net do češtiny ?
Mě je teprve 13 a angličtinu mam 2 roky takže rozumim, nerozumim ;-O
Jo a Kite ?
Vložil jsem tam VALUES ("%s", now(), "%s"); , tady je celý kód: <?php
//adresar-insert-firma.php
$hostName="mysql.webzdarma.cz" ;
$databaseName = "grelek" ;
$userName="grelek" ;
$password="*" ;
// sestavení SQL dotazu pro vložení firmy
$dotaz_kodovani = 'SET NAMES utf8';
$dotaz_pridat_zpravu = 'INSERT INTO chatOdeslane(Jmeno, Datum, Zprava)
VALUES("%s", now(), "%s");
// pripojeni k databazi
if (!($link=mysql_pconnect($hostName, $userName, $password))) {
echo 'error connecting to host' . $hostName . ' by user ' . $userName;
exit();
};
// vyber databaze
if (!mysql_select_db($databaseName, $link)) {
echo 'Error in selecting ' . $databaseName . ' database';
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
// vykonani SQL dotazu dotaz_kodovani
if (!mysql_query($dotaz_kodovani, $link)) {
echo 'Error in executing ' . $dotaz_kodovani;
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
// vykonani SQL vyrazu pridani zpravy
if (!mysql_query(sprintf($dotaz_pridat_zpravu, $_POST['jmeno'], $_POST['zprava'], 'A'))) {
98 echo 'Error in executing ' . $dotaz_pridat_zpravu;
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
?>
A já se ptám, proč mi to říká že na řádku 98 (je označený..): Parse error: syntax error, unexpected T_STRING in /7p/wz.cz/g/grelek/chat/index.php on line 98
Před tím to bylo v poho ..
cz.php.net ?
http://translate.google.com/#auto
"Parse error: syntax error"
chyba pri parsovani php kodu = pokousi se kod spustit, ale najde chybu
chybna syntaxe = nastava, kdyz v kodu najde chybny znak. Chyba nastane prave na radku, kde to pise. Kdyz napise 98, tak na radku 98 narazil na znak, ktery nezapada do povoleneho kodu. Nekdy radek 98 je posledni znak souboru, protoze jsi nekde zapomel zavorku nebo apostrof a nebo neco jineho, )};"'
unexpected T_STRING = se to bude tykat stringu, pravdepodobne se jedna o zapomenuty apostrof nebo apostrof navic, kde byt nema
Chybna syntaxe se da obvykle vyresit obarvovacem php kodu. Editor napr pspad (soubor - novy - php kod) nebo ja pouzivam far manager + colorify plugin.
Muzes pouzit i online nastroje
http://www.tohtml.com/
$password="..." ; // tak tohle davat do fora, ktere je googlem vyhledatelne a navic jej muze sledovat 1000 lidi neni zrovna dobry napad.
-> Muzete mu nekdo z moderatoru to heslo smazat? Dik. :)
Z toho kodu tezko zjistime, ktery radek je 98, zkus to ulozit jako soubor.txt (misto soubor.php) a dat sem odkaz, priste, !bez hesla.
$dotaz_pridat_zpravu = 'INSERT INTO chatOdeslane(Jmeno, Datum, Zprava)
VALUES("%s", now(), "%s");
...
if (!($link=mysql_pconnect($hostName, $userName, $password))) {
echo '
// tady konci ten retezec.
http://www.tohtml.com/, sice nic moc obarvovac, ale krasne vidis, ze
"$dotaz_pridat_zpravu = " je cerne a pak nasleduje modry retezec, ktery konci az echo '
Sakra práce, já tam napsal heslo ! Jááj...
Můžu poprosit někoho z adminů aby to heslo změnil ? :(
Už to vidím. Pokud jsi to zkopíroval doslovně, tak ti pak na konci chybí uvozovka.
$dotaz_pridat_zpravu = 'INSERT INTO chatOdeslane(Jmeno, Datum, Zprava)
VALUES("%s", now(), "%s");
>> Parse error: syntax error, unexpected T_STRING
Toto je chybová hláška, která ti říká, že při zpracování (parsování) narazil na chybu v kódu (syntaxi). A unexpected T_STRING většinou znamená na chybu v uvozovkách. Postě na daném místě našel řetězec, který neočekával a neměl by tam být.
A proč si to nezměníš ty? Změna hesla se provádí v administraci, tam kde jsi aktivoval databázi. Po změně jen chvíli čekej, aby se změna mohla naplno projevit.
Ale to založí novou databázi .. jsem na to koukal ... zkusil jsem to a lup, je tam prázdná takže mám 2 a ještě tím porušuju pravidla tuším .. chjo, jsem trubka (slušně řečeno)
<HTML>No jsi koukám šikovný :-) a místo změny hesla se ti opravdu udělala nová db. Fungují obě db, ale být tebou, používám raději tu novou, která se ti zobrazuje i v administraci.</HTML>
Thalio já vím :(, děkuji za radu a doufam že už to neudělam .. ježiš já jsem fakt trotl .. bych měl být odstrašující případ ..
OT
Proc? Ber to i pozitivne. Zkusil jsi to a vis, co z toho se da pouzit k dobremu ci zlemu. Skodu jsi nezpusobil.
Je dobré přístupové informace k databázi ukládat mimo hlavní program do nějakého includu. Má to několik výhod:
- pokud ten kód sdílíš (třeba na Github.com), tak tyto informace neposíláš nebo posíláš smyšlené.
- pokud stejný skript používáš na více webech, můžeš mít různé přístupové informace nahrané přímo na těch webech a na domácím serveru také jiné. Jenom se nesmíš pokusit je zkopírovat :-)
- v každém skriptu tyto informace jednoduše includuješ a proto se už o správná hesla nemusíš starat.
- v případě změny hesla na některém ze serverů měníš jen jeden skript.
Samozřejmě je nutné, aby ten include měl příponu php a nejlépe v adresáři, kam smí jen PHP (Apache ne).
Teď mě napadlo, jak jsem se ptal na datum, nebylo by lepší poslat ho skrytým polem ?
<input type="hidden" name="datum" value="<?php Date("G:i"); ?>">
?
Proč se vlastně uživatele ptáš na čas?
Pokud uvedený sloupec v databázi označíš jako typ TIMESTAMP, tak se o datum a čas vůbec nemusíš starat.
Takže rada: Neposílej datum vůbec a nechej ho uložit automaticky. Nechceš přece, aby uživatel to datum modifikoval, že?
Kite, tvoje rada že TIMESTAMP do databáze uloží čas automaticky, jo jo, ale já mu musim nastavit formát .. viz.:
Do databáze ukládám Jmeno, Zprava, Datum, Email, Web .
Datum je TIMESTAMP
a zde celý kód, schválně se podívej hned ze začátku na INSERT INTO a dole mysql_query .
<?php
require("../config.php");
// sestavení SQL dotazu pro vložení firmy
$dotaz_kodovani = 'SET NAMES utf8';
$dotaz_pridat_zpravu = 'INSERT INTO Kniha(Jmeno, Zprava, Datum, Email, Web) VALUES("%s", "%s", "%s", "%s", "%s")';
// pripojeni k databazi
if (!($link=mysql_pconnect($hostName, $userName, $password))) {
echo 'error connecting to host' . $hostName . ' by user ' . $userName;
exit();
};
// vyber databaze
if (!mysql_select_db($databaseName, $link)) {
echo 'Error in selecting ' . $databaseName . ' database';
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
// vykonani SQL dotazu dotaz_kodovani
if (!mysql_query($dotaz_kodovani, $link)) {
echo 'Error in executing ' . $dotaz_kodovani;
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
// vykonani SQL vyrazu pridani zpravy
if (!mysql_query(sprintf($dotaz_pridat_zpravu, $_POST['jmeno'], $_POST['zprava'], Date("Y-m-d H:i:s"), $_POST['email'], $_POST['web'] )))
{
echo 'Error in executing ' . $dotaz_pridat_zpravu;
echo 'Error: ' . mysql_errno($link) . mysql_error($link);
exit();
};
?>
A datum tedy vůbec nepoužívám ve formuláři nýbrž ve skriptu.
A co chceš nastavovat? Vždyť to co tam máš je podstatě hotové. Datum se ukládá ve správném formátu spolu s ostatními.
Nebo tam chceš ukládat jiné datum než aktuální?
A pokud jde o zobrazení data z databáze na web, tak to je pak jiná kapitola. Tam se to pak musí překódovat.
$vypis_datum_z_db = date("j.n.Y",strtotime($data['Datum'])); nebo podobně.
Formát se dává časovému údaji až ve chvíli, kdy ho z databáze získávám. Teprve pak databázi sděluji, že chci den a měsíc nebo hodinu a minutu.
Je úplně zbytečné časové razítko při ukládání do databáze jakkoli formátovat. Formát je již dán systémem.
$dotaz_pridat_zpravu = 'INSERT INTO Kniha(Jmeno, Zprava, Email, Web) VALUES("%s", "%s", "%s", "%s")';
if (!mysql_query(sprintf($dotaz_pridat_zpravu, mysql_real_escape_string($_POST['jmeno']),
mysql_real_escape_string($_POST['zprava']),
mysql_real_escape_string($_POST['email']),
mysql_real_escape_string($_POST['web']) )))
{...
Jen stačí změnit typ sloupce na TIMESTAMP. Snad ho nemáš jako VARCHAR()?