Autor Zpráva
honzaik
Profil
čau mám udělanej script kterej mi logne každýho kdo zadá heslo:
function zapis()
{
$text = "Někdo napsal jako heslo: <b>".$_POST["heslo"]."</b> v <b>".date("H:i:s")."</b> dne <b>".date("d.m.Y")."</b> z IP: <b>".ip."</b>.\n<br><hr>";
$log = fopen("log.php", "a+");
fwrite($log, $text);
fclose($log);
} 

a chci aby mi to v tom logu posunulo např <span> s nějakym ID, nebo jak docílit toho, aby ten $text byl mezi nějakýmu dvěma prvky, protože takhle mi to loguje dolu, a když to dám s parametrem "r+" tak mi to zase posune celej obsah "log.php" takže hlavičku atd. takže jde nějak jednoduše (protože jsem začátečník a nechci používat scripty který nechápu) docílit toho aby se $text přidal mezi nějaký dva prvky např přechozí log, ale aby to nebylo nakonci a uplně nahoře před hlavičkou.
Chro
Profil
<?php
$hlavicka = '...';
$soubor = 'log.php';
if (file_exists($soubor))
{
$stare_zaznamy = file_get_contents($soubor);
$stare_zaznamy = str_replace($hlavicka, '', $stare_zaznamy);
}
else
{
$stare_zaznamy = '';
}
$novy_zaznam = '...';
file_put_contents($soubor, $hlavicka.$novy_zaznam.$stare_zaznamy, LOCK_EX);
?>
honzaik
Profil
super díky už to funguje ale ted mám problém, protože jsem to chtěl dát do funkce log() a napíše mi to
Fatal error: Cannot redeclare log()

pravděpodobně musí bejt něco mezi těma závorkama u log("tady") a to je další problém protože já jsem nikdy nepochopil (a to už jsem četl hodně tutoriálů na JS a PHP) k čemu je ta závorka u funkce, kdyby se někdo obětoval a napsal mi sem stručnej popis, protože já to nejsem schopen z ničeho vyčíst
honzaik
Profil
mám to takhle
<?
function log()
{
$hlavicka = 
"
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html>        
  <head>
<script type='text/javascript'>
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-25300344-3']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>                                    
    <meta http-equiv='Content-Type' content='text/html; charset=windows-1250'>                 
    <link rel='stylesheet' type='text/css' href='./css/style.css'>
<script src='./js/index.js'></script>              
    <title>Praktika na ?                
    </title>        
  </head>
  ";
$soubor = "./log.php";
if (file_exists($soubor))
{
$stare_zaznamy = file_get_contents($soubor);
$stare_zaznamy = str_replace($hlavicka, "", $stare_zaznamy);
}
else
{
$stare_zaznamy = "";
}
$novy_zaznam = "TEST\n<br>";
file_put_contents($soubor, $hlavicka.$novy_zaznam.$stare_zaznamy, LOCK_EX);
}
log();
?>
Mike8748
Profil
honzaik:
nemůžeš to dát do funkce log() protože taková funkce již existuje v php (počítá logaritmy)

pokud na názvu své funkce fakt trváš tak jedině přes jmenné prostory (v php 5.3)
honzaik
Profil
ahá tak to jsem nevěděl, dík :D, už to funguje a ještě bych někoho poprosil jestli by mi k tomu něudělal nějaký komentář, moc jasně nechápu řádky 27 až 35
Chro
Profil
honzaik:
Doporučuju pojmenovávat vlastní funkce s nějakým prefixem nebo postfixem. Já to dělám např. takhle (my = moje): my_getgps(), my_createimage(). Je to přehlednější.

K řádkům 27 až 35. Když bude existovat soubor se záznamy, načti jeho obsah do proměnné a odstraň hlavičku. Pokud soubor neexistuje, definuj prázdnou proměnnou, aby její neexistence později případně nevyvolávala ve funkcích chyby typu notice (ve file_put_contents).
honzaik
Profil
dík, už to jakž takž chápu, akorát mě napadlo, že bych nastavil aby se ten soubor log.php za den přejmenoval na nějakou hodnotu, která by se měnila, např date(d_m_Y), ale nevím jak nastavit ten timeout a vůbec jak by se to spustilo, nemáte nějaký nápad? jo a funkci set_time_limit() jsem zkoušel a ta je zakázaná na mém hostingu, takže jestli se někomu chce mi poradit tak do toho :D
Chro
Profil
To jsem moc nepochopil, co a jak měnit. Timeout jsi myslel timestamp? Zkus se rozepsat v bodech, co by to postupně mělo dělat, čím víc detailů, tím lépe.

Abych nezapoměl. Závorky u funkce vymezují oblast pro parametry, tzn. s jakými hodnotami má funkce pracovat, případně jak s nima pracovat. Třeba:
<?php
muj_kalkulator($prvni_cislo, $druhe_cislo, $co_s_nima)
{
if ($co_s_nima == 'sečti')
{
return $prvni_cislo + $druhe_cislo;
//return vrací výsledek funkce k dalšímu zpracování
}
}

echo muj_kalkulator(5, 2, 'sečti');
?>
Honzaik
Profil *
Jj ta () mi ted z ničeho nic došla:D, ale k tematu. No aby ten soubor log, obsahoval jen data za určitej den, takze by se přejmenoval na to datum, ale jak udelat to aby se na konci dne přejmenoval. Jako rename("log.php", date("d-m-Y").".php") neni problem asi ale jak nastavit aby se ten soubor na konci dne teda renamenul a ted předchozí script by automaticky vytvoril novej a pak by to šlo dokola.
Takzě stručně, jak udelat, aby se v souboru funkce spustila např za 24h od vytvoření, je to teda vůbec možné provést?
Tori
Profil
Honzaik:
Použila bych asi takovýhle postup:

- Jméno souboru: $log = [dnešní datum ve formátu Y-m-d] + ".log"
- Funkcí touch soubor $log vytvořím, pokud neexistuje (myslím, že by to mělo být bezpečnější pro paralelní přístup, než fopen/fclose). Tím odpadne přejmenovávání nebo kopírování souboru. (tohle by se mělo provést jen jednou na začátku skriptu)
- Zapíšu data (všechno dohromady na konci skriptu, nebo pokaždé když je zavolaná logovací funkce. Osobně bych data k zapsání ukládala do proměnné a do souboru je zapsala až při ukončení běhu skriptu, viz funkce register_shutdown_function.)
honzaik
Profil
Já ale používám řešení, ktere mi doporučil Chro, pro mě je to to, co jsem hledal, ted jen jak nastavit vykonání přikazu jednou za 24hodin, jestli je něco jako interval v js a spustilo by se to treba o pulnoci toho dne...
okolojdouci
Profil *
honzaik:
jak nastavit vykonání přikazu jednou za 24hodin

Existuje nástroj CRON, kde si můžeš nastavit automatické spouštění php souborů. Jeho dostupnost na hostinzích je různá - někde k dispozici není, někde je za příplatek, někde zadarmo.
honzaik
Profil
Díky podívám se na to.
honzaik
Profil
Jj cron je to co potrebuju dik.
honzaik
Profil
mám ted problém s cronem a jakoby nastavením cesty spíše, mám soubor rename.php ve kterém je
<?php
$newname = "neco.php";
$oldname = "log.php";
rename( $oldname, $newname);
?>

a ten mám když se připojím k ftp celkové ve složce /public_html/praktika/rename.php
a na mém webhostingu, je to 000webhost.com kdyb to chtěl někdo zkusit, je tohle ve ftp detailech a tohle při nastavení cronu

jak tam mám dopsat tu cestu? a stačí cronu ten soubor tak jak je nahoře?
Chro
Profil
honzaik:
Možná by ti stačilo, aby návštěvník, který přišel např. ve 23:56 se zapsal do log.php. A ten co příjde po půlnoci, třeba v 0:14, archivoval log.php do souboru den.mesic.rok.php a zapsal se do nového log.php.
<?php
/* nastaveni */
$hlavicka = <<< EOT
<html>
<head>
<!-- nalezitosti -->
</head>
<body>

EOT;
//i tak lze zapsat HTML do promenne
$konec_html = "</body>\n</html>";
$soubor = 'log.php';

/* log soubor neexistuje? vytvor ho */
if (!file_exists($soubor))
{
file_put_contents($soubor, $hlavicka.$konec_html, LOCK_EX);
}

/* nacti nove a starsi zaznamy */
$novy_zaznam = "...\n";
$starsi_zaznamy = file_get_contents($soubor);
$starsi_zaznamy = str_replace(array($hlavicka, $konec_html), '', $starsi_zaznamy);

/* kdyz je novy den, archivuj log */
$dnesni_datum = date('d.m.Y', time());
$soubor_datum = date('d.m.Y', filectime($soubor));
if ($dnesni_datum != $soubor_datum)
{
rename($soubor, $soubor_datum.'.php');
$starsi_zaznamy = '';
//starsi zaznamy byly, archivovany, vymaz je pro novy log soubor
}

/* ukladame novy zaznam */
file_put_contents($soubor, $hlavicka.$novy_zaznam.$starsi_zaznamy.$konec_html, LOCK_EX);
?>
honzaik
Profil
hm já bych byl radši pro ten cron, protože ten mi bude v budoucnu užitečnej, to přejmenovaní použiju, ale mám k tmu dotaz co znamená to <<<EOT a na konci EOT?
a ještě to
/* log soubor neexistuje? vytvor ho */
if (!file_exists($soubor))
mám místo toho "!" a funguje to jak má.. to je tam za zmenu?
Tori
Profil
honzaik:
co znamená to <<<EOT a na konci EOT?
"heredoc" zápis řetězce. Funguje stejně, jako řetězec v uvozovkách (=názvy proměnných se nahrazují jejich hodnotou), ale není potřeba escapovat uvozovky.
honzaik
Profil
díky za vysvětlení
honzaik
Profil
bych potřeboval vědět to, jak je cesta v tom cronu... jako jestli je /home/"ten_nick"/ a v tom ta složka public_html do který to uploaduju nebo jestli to je rovnou /home/"ten_nick"/ a zde uploaduju
Tori
Profil
honzaik:
Pokud neznáte cestu ke skriptu ale jen jeho url, zjistíte ji např. tímto
echo __FILE__;
honzaik
Profil
už jsem to zjistil ale ted prostě ten cron nefunguje, stačí cronu dát cestu k tomu soboru php, ve kterém je příkaz? nebo to musí bejt jinak? máte s tím někdo zkušenosti?

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