Názory ke článku Kniha návštěv s PHP a metatable
Popsaný návrh databáze nedovoluje vložit v jedné sekundě dva příspěvky.
Funkci
__halt_compiler
doporučuji ukončovat pomocí __halt_compiler() ?>
, protože editory potom správně zvýrazní zdrojový kód a zbytek dokumentu není potřeba při zpracování trimovat. ?>
je v PHP platný ukončovač příkazu spolu se středníkem, navíc mu může následovat konec řádku.Reagoval na komentář od uživatele Jakub Vrána :
Popsaný návrh databáze nedovoluje vložit v jedné sekundě dva příspěvky.
Pravda. Snažil jsem se využít toho, že data v metatable jsou ukládána a vracena seřazená podle názvu řádku a sloupce. Naštěstí existuje jednoduchý způsob, jak toto opravit – užít ještě mikrosekundy (vzhledem k latenci úložných zařízení by na dnešním hardware /alespoň doufám/ nemělo být možné provést celý proces ukládání za méně jak jednu mikrosekundu). Na to je jednoduchý patch:
diff --git a/index.php b/index.php
index 59f371e..1c85d6a 100644
--- a/index.php
+++ b/index.php
@@ -44,7 +44,9 @@ ${'@form'}->addSubmit('ok', 'Přidat')
->onClick[] = '_add';
function _add()
{
- $now = date('Y-m-d H:i:s');
+ $now = date('Y-m-d H:i:s', (int) ($_ = microtime(true))) .
+ '.' . round(($_ - floor($_)) * 1000000);
+
foreach ($GLOBALS['@form']->getValues() as $k => $v)
$GLOBALS['@table']->set($now, $k, $v);
$GLOBALS['@table']->set('=', $now, TRUE);
date('u') nějak nevracelo, co bych si představoval, tak jsem se inspiroval na
http://php.net/manual/en/function.date.php#85376
Ukončovat __halt_compiler() pomocí ?> je hezké, přidám to do repozitáře.
Reagoval na komentář od uživatele Santas :
Treba si niečo prečítať o bezpečnosti keď chce niekto niekoho učiť
Tohle je záležitost Texy[1] a jak si ji kdo nastaví. Přiznám se, že já ji moc nenastavoval, ale stačí:
$texy = new Texy;
$texy->allowedTags = Texy::NONE;
${'@filter:texy'} = fn(array($texy, 'process'), array(fn::ph()));
A hle, nelze vkládat žádné <script>y, ani žádné jiné tagy ;-) O tom všem se dá dočíst v dokumentaci Texy[2].
Děkuji za upozornění.
[1] http://texy.info/
[2] http://texy.info/cs/api
Reagoval na komentář od uživatele Jakub Kulhan :
Řeší to příznaky problému, ale nikoliv problém. Principielně je samozřejmě možné, aby dva záznamy vznikly i se stejným mikročasem. Disky si data ukládají do cache a kontext dvou požadavků se může klidně přepnout v rámci jedné mikrosekundy. Granularita funkce microtime() je navíc na většině platforem jen .0001 a ne .000001, jak by se z názvu mohlo zdát.
Vyřešit by se to dalo tak, že by se za čas přidal nějaký skutečně unikátní identifikátor, pro jednoduchost by stačil třeba počet záznamů v tabulce. Tedy pokud se z ní nebude mazat, jinak by bylo potřeba ID posledního + 1 nebo třeba uniqid().
No, řešení se mi zdá zbytečně složté, avšak je zajímavé si pročítat informace (alespoň kusé) o jednotlivých přídavných knižnicích.
7. 9. 2009
zajímavé, ale ke čtení to není...když si vezmu to, že musím pořád odcházet ze stránky s textem někam pryč, tak je to článěk na dvě věci...takže autore promin, ale tohle je hnus...jinak "at" mě zaujalo...díky za tip
6. 12. 2009
Kniha návštěv šlape naprosto skvěle. Jenom se mi nepodařilo zjistit jak smazat vybraný příspěvek. Poraďte prosím naprostému amatérovi.
díky
9. 2. 2010
Reagoval na komentář od uživatele Tomáš Neumaier : Hej, já jsem totální začátečník a toto mi moc jednoduché něpřijde xD. Ne, fpoho, jinak mazec stránky, skvělý projekt, jen tak dál x). Já jenom, že pro úplný blby by se to dalo řešit třeba jen s pomocí funkce echo a pár podmínek k tomu x). Toto určitě pochopím tak za půl roku nejdřív xD