tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Ajax problem s predavani parametru payload = ->fetchAll()

před 9 lety

wolker
Člen | 4

Nette Framework 1.0-dev (revision a723be7 released on 2010–09–20) a dibi te verze

Mam problem s predavanim object DibiRow do $this->payload->autoComplete
Respektive mam dva drivery a database.
Mysql (driver mysqli) a IBM DB/2 (driver odbc).

Pro mysql mi to funguje, ale pro db2 ani za mak a skonci to chybou 500 asi pri transformaci do JSON.

Pritom pri debagu ty hodnoty z modelu vypadnout, ale presto to upadne na 500.

Kdyz zadam pole rucne: array(‚surname‘=>‚SURNAME‘,‚name‘=>‚NAME‘); tak to funguje.

kdyz je predam pres smycku

foreach ($rows as $n => $row) {
  $autoComplete[] =  array('surname'=>$row['SURNAME'], 'name'=>$row['NAME'],
 'akc'=>$row['AKC'], 'csp'=>$row['CSP'], 'orgj'=>$row['ORGJ'], 'skup'=>$row['skup']);
}
$this->payload->autoComplete = $autoComplete;

pole vidim spravne ale zase konci na 500.

Kody jsou zde: (pro mysql se musi vyhodit FETCH FIRST 10 ROWS ONLY a nahradit to limit 10)

public function handleAutoComplete($name){
 if ($name != '') {
    $this->payload->autoComplete = array();
    $person = new Personal;
    $this->payload->autoComplete = $person->findAutoComplete($name)->fetchAll();
  }
  $this->terminate();
}

public function findAutoComplete($id){
    return $this->connection->query("select rtrim(DW06_PRIJMENI) as surname,
C_CPRAC as csp, rtrim(DW06_JMENO) as name,C_AS as akc, rtrim(DW06_ORGJ) as orgj, DW06_SKUP as skup
from ".$this->table." WHERE lcase(DW06_PRIJMENI) like lcase('". $id ."%') or
DW06_PRIJMENI like '". $id ."%' ORDER BY DW06_PRIJMENI, DW06_JMENO FETCH FIRST 10 ROWS ONLY ");
}

Editoval wolker (7. 10. 2010 11:50)

před 9 lety

wolker
Člen | 4

Tak po opětovném laborování jsem na tem problém přišel.

Při předání pole hodnot do $this->payload (asi transformaci do JSON) dojde k systémové vyjímce (server vrátí jen code 500), v připadě, že pole obsahuje české znaky konkrétně kodování WIN1250.

Prostředí je v UTF, DB/2 databáze (použitý system ODBC driver) umí jen kódování WIN1250.

Pokud provedu překódování array pole hodnot před předáním do $this->payload do ASCII nebo UTF, heuréka funguje to bez problému :D

V případě mysql ten problém nebyl, jelikož data už byla v kódování UTF.

Pokud by mi někdo znalejší, vysvětlil důvod této záludnosti, budu zase chytřejší.

před 9 lety

David Grudl
Nette Core | 6806

No jasně, JSON pracuje pouze s UTF-8. Nicméně to není systémová výjimka, měla by vyskočit obyčejná výjimka JsonEncode s patřičným vysvětlením.