tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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

Milo
Nette Core | 1119

Zkoušel jsi stáhnou aktuální verzi z GitHubu?

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.