Oznámení
Stále vyhazovaná chyba v dibi::update
před 8 lety
- taubda
- Člen | 7
Zdravím,
nedávno jsem začal dělat s dibi a když chci použít příkaz dibi::update
tak mi to vyhodí chybovou hlášku : Cannot redeclare class DibiPcreException
in …\www\admin\dibi\dibi.php on line 61. Přitom já jsem se v dibi
souborech nehrabal a zkoušel jsem ho asi 3× znova stáhnout a chyba stále
vyskakuje. Přitom kodu myslím že chybu nemám, takže opravdu nechápu pro to
nejde. Jsem začátečník takže na mě prosím berte ohledy :).
Díky Taubda
dibi::update("text",array(
"name" => $_POST["name"],
"author" => $_POST["author"],
"text" => $_POST["text"],
))->where("id = %i", $id)->execute();
před 8 lety
- taubda
- Člen | 7
Stáhl jsem novou verzi a nyní to vyhazuje chybku :
class DibiVariable in …\www\admin\dibi\dibi.php on line 65
Opravdu nevím co stím páč v tom souboru dibi.php na řádku 65 nic není. Děkuji za všechny rady.
před 8 lety
- Milo
- Nette Core | 1119
Divné. Nepoužíváš nějaký akcelerátor? Nebo vlastní class loader?
před 8 lety
- taubda
- Člen | 7
promin, ale nevím co je to akcelerátor. Opravdu jsem jen začátečník. Tip bych si že je to obecný název pro programy typu EasyPHP které používám (verze 5.3.6) takže nevím zda to může být tím páč na webu jsem to nezkoušel. V dibi jsem nic neupravoval. Taubda
před 8 lety
- Václav M.
- Člen | 34
Ta chyba je, že za poslední položkou pole s sloupci a jejich novými hodnotami je čárka. Takže dibi čeká další položku toho pole, ale ta už není.
Když se ta čárka za poslední položkou toho pole zruší, tak už by mělo být všechno OK.
Takže poté (po změně) bude celý příkaz takto:
dibi::update( "text",array(
"name" => $_POST["name"],
"author" => $_POST["author"],
"text" => $_POST["text"]
))->where("id = %i", $id)->execute();
Editoval Václav M. (20. 10. 2011 11:28)
před 8 lety
- Milo
- Nette Core | 1119
Václav M.
Čárka tam klidně může být, to je standard PHP syntax.
taubda
Zjednodušeně řečeno… při vykonávání PHP kódu se kód pokaždé
naparsuje, poté se převede do bytekódu a tento bytekód je spuštěn.
Parsování a převod do bytekódu má určitou procesorovou režii a aby se
ušetřila, existují pro PHP rozšíření, který bytekód udržují dokud se
PHP skript nezmění. Tím se sníží režie a stránky se načítají
rychleji.
EasyPHP neznám a nevím jak se konfiguruje. Ale najdi si php.ini soubor, volby extension=xxxxxxxx.dll a o každé povolené si něco vygoogli ať víš co dělá. Akcelerátory a debugery zakaž a pak restartuj webserver.
před 8 lety
- Václav M.
- Člen | 34
Milo napsal(a):
Václav M.
Čárka tam klidně může být, to je standard PHP syntax.
Ale stejně bych tu čárku za poslední položkou stejně raději odstranil.
Takže bych doporučil použití
dibi::test("UPDATE `text` SET %a", array(...) );
A to by odhalilo případnou chybu v SQL, pokud se tam nějaká vyskytuje.
Editoval Václav M. (20. 10. 2011 14:04)
před 8 lety
- 22
- Člen | 1484
Václav M. napsal(a):
A PHP to také vadí.
.. čemu to vadí? Na žadný problém jsem s čarkou za posledním prvkem nikdy nenarazil…
před 8 lety
- Václav M.
- Člen | 34
Koukám, že jsem byl s tou opravou pomalý. Takže si někdo mohl přečíst …
před 8 lety
- Milo
- Nette Core | 1119
V SQL chyba není, to by vyskočila DibiException
. Vypadá to,
že se volá 2× require dibi.php
, nebo dělá problém nějaký
akcelerátor (což už se mi také několikrát stalo).
před 8 lety
- HosipLan
- Moderator | 4693
taubda napsal(a):
dibi::update("text",array( "name" => $_POST["name"], "author" => $_POST["author"], "text" => $_POST["text"], ))->where("id = %i", $id)->execute();
syntaxe je naprosto v pořádku a zde chyba není. Chyba bude buď v pokusu o opakovanou inicializaci, možná nějaký hloupý loader načítá třídu znova… Nebo máš zaplé nějaké rozšíření, které to rozbíjí. Chyba je tedy na serveru, né v tomto kódu.
Ukaž tedy jak dibi inicializuješ a jaké máš loadery… atd
před 8 lety
- Václav M.
- Člen | 34
No, a co takhle použít
dibi::query("UPDATE `text` SET %a", array(...) )
před 8 lety
- HosipLan
- Moderator | 4693
Proč? nic si tím nepomůžeš a je to jenom delší zápis…
před 8 lety
- taubda
- Člen | 7
Děkuju všem za rady, ale zkusil jsem upravit nějaké ty extension= (díky Milo !) a už to krásně jede. Díky !
před 8 lety
- Václav M.
- Člen | 34
HosipLan napsal(a):
Proč? nic si tím nepomůžeš a je to jenom delší zápis…
Mě nepřipadá, že by ten můj zápis byl o tolik delší … ale budiž, protože každému vyhovuje něco jiného.
-->
A jen tak mimochodem, na stránce DIBI Quick Start je
tenhle text
dibi::query('UPDATE `table` SET ', array(
'time' => new DateTime,
));
// UPDATE `table` SET ('2008-01-01 01:08:10')
Jenže v textu použitého SQL dotazu je chyba – chybí totiž název sloupce, jehož obsah se mění – nebo ne?
Editoval Václav M. (21. 10. 2011 22:05)
před 8 lety
- Milo
- Nette Core | 1119
Je u toho napsáno:
Také si můžeme dovolit luxus žádný modifikátor před polem neuvést. V tom případě dibi použije tuto dedukci: jde-li o příkaz INSERT či REPLACE, zvol %v, jinak %a (platí pro asociativní pole).
před 8 lety
- Václav M.
- Člen | 34
Chyba není v tom PHP příkazu
dibi::query('UPDATE `table` SET ', array(
'time' => new DateTime,
));
ale v tom zapoznámkovaném SQL dotazu
// UPDATE `table` SET ('2008-01-01 01:08:10')
před 8 lety
- Milo
- Nette Core | 1119
Aha, už to vidím. Tohle spíš patří do vlákna Dokumentace…
před 8 lety
- Václav M.
- Člen | 34
To připouštím – že by to chtělo odstřihnout (posledních pár příspěvků) a přemístit do sekce Dokumentace …
před 8 lety
- taubda
- Člen | 7
Mohu se teda zeptat jak to má správně být? Nějak jsem to nepochopil..
před 8 lety
- Václav M.
- Člen | 34
Co? Ten chybný dotaz z stránky Dibi Quick start? Ten by měl být přeci (datum a čas jsem, samozřejmě, ponechal z původního textu)
// UPDATE `table` SET `time`='2008-01-01 01:08:10'
před 8 lety
- Milo
- Nette Core | 1119
Jde o to, že ukázový kód je napsaný správně a SQL dotaz se vygeneruje správně. Je chyba pouze v komentáři pod kódem.