„SQL translate error“ v případě addFile()
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Lawondyss
- Člen | 106
Vytvořil jsem si překladovou třídu, která podle zadaného indexu vyhledá překlad v DB.
Ale ve chvíli, kdy do formuláře přidám pole pro soubor addFile(),
vyhodí dibi po odeslání výjimku se zprávou SQL translate
error.
Trace začíná v
dibi\libs\DibiConnection.php(255): DibiTranslator->translate(Array)
.
Vůbec nechápu, co je za problém.
- Lawondyss
- Člen | 106
Překladová třída
<?php
class Lang implements ITranslator
{
/**
* Jazyk lokalizace
* @var string
*/
private static $lang;
/**
* Modul lokalizace
* @var string
*/
private static $module;
/**
* Pole se vsemi preklady
* @param array
*/
private static $translations;
/***************
* SETTERS *
***************/
/**
* Nastavi jazyk lokalizace
* @param string $lang
*/
public static function setLang($lang)
{ self::$lang = $lang;}
/**
* Nastavi modul pro lokalizaci
* @param string $module
*/
public static function setModule($module)
{ self::$module = $module;}
/**
* Nastavi prekladSet translations
* @param array $translations
*/
public static function setTranslations($translations)
{ self::$translations = $translations;}
/***************
* GETTERS *
***************/
/**
* Vrati jazyk lokalizace
* @return string
*/
public static function getLang()
{ return self::$lang;}
/**
* Vrati modul lokalizace
* @return string
*/
public static function getModule()
{ return self::$module;}
/**
* Vrati preklady
* @return array
*/
public static function getTranslations()
{ return self::$translations;}
/**
* Konstruktor
* @param string $lang jazyk localizace
* @param string $module modul lokalizace
*/
public function __construct($lang='cz', $module=NULL)
{
self::setLang($lang);
self::setModule($module);
self::translateAll();
}
/**
* Implementovane rozhrani
* @param string $message text k prekladu
* @param int $count pocet //neimplementovano
*/
public function translate($message, $count=NULL)
{
return self::trl($message);
}
/**
* Return translation or ID
* @param string $idf
* @return string
*/
public static function trl($idf)
{
if(isset(self::$translations[$idf]))
{
return self::$translations[$idf];
}
else
{
return $idf;
}
}
/**
* Load all translations
*/
public static function translateAll()
{
$sql[] = "
SELECT [idf], [translate] FROM [translates]
WHERE [language]=%s
";
$sql[] = self::getLang();
if(self::getModule())
{
$sql[] = " AND [module]=%s";
$sql[] = self::getModule();
}
self::$translations = dibi::query($sql)->fetchPairs('idf', 'translate');
}
}
?>
Formulář a zpracování formuláře
<?php
/**
* Formular
*/
function formPohovory($id=NULL)
{
// vychozi hodnoty
$defaults = array();
if(isset($id))
{
$sql = "
SELECT * FROM [ucastnici_pohovory]
WHERE id=%s
LIMIT 1
";
$defaults = dibi::fetch($sql, $id);
}
// definice formulare
$form = new Form('pohovor');
$form->setAction('#pohovory');
$form->addHidden('id', $id);
$form->addHidden('id_ucastnici', ID);
$form->addHidden('id_user', ID_USER);
$form->addGroup();
$form->addSelect('typ_pohovoru', 'Typ pohovoru', $GLOBALS['typ_pohovoru'])
->skipFirst('-- vyberte --')
->addRule(Form::FILLED, 'Vyberte Typ pohovoru.');
$form->addDate('datum', 'Datum')
->addRule(Form::FILLED, 'Vyplňte Datum.');
$form->addTextArea('poznamka', 'Poznámka');
$form->addFile('priloha', 'Příloha');
$form->addGroupButtons();
$form->addSave('Uložit', 'img/bt_apply.png');
$form->onSubmit[] = 'formPohovorySubmitted';
// nastaveni vychozich hodnot
if(!$form->isSubmitted())
{
$form->setDefaults($defaults);
}
$form->fireEvents();
return $form;
}
/**
* Zpracovani formulare
*/
function formPohovorySubmitted(Form $form)
{
$values = $form->getValues();
// INSERT
if(!$values['id'])
{
try
{
dibi::query('INSERT INTO [ucastnici_pohovory]', $values);
$GLOBALS['hlasky'][] = Lang::trl('Pohovor uložen.');
}
catch(Exception $e)
{
$form->addError(Lang::trl('Pohovor nebyl uložen.'));
Developer::printDebug($e);
}
}
// UPDATE
else
{
// prelozeni ID
$id = $values['id'];
unset($values['id']);
try
{
dibi::query('UPDATE [ucastnici_pohovory] SET', $values, 'WHERE id=%s', $id);
$GLOBALS['hlasky'][] = Lang::trl('Pohovor uložen.');
}
catch(Exception $e)
{
$form->addError(Lang::trl('Pohovor nebyl uložen.'));
Developer::printDebug($e);
}
}
Generate::flashMessages($GLOBALS['hlasky']);
// pokud je vse v poradku, vymaze formular
if(!count($form->getErrors()))
{
$form->setValues(array(
'id_ucastnici' => ID,
'id_user' => ID_USER,
), TRUE);
}
}
echo formPohovory(POHOVOR);
?>
Pokud formulář odešlu, debug vyplivne tohle:
SQL translate error
#0 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\dibi\libs\DibiConnection.php(255): DibiTranslator->translate(Array)
#1 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\dibi\dibi.php(281): DibiConnection->query(Array)
#2 D:\Weby\projekty\EASYPORT\www\e2_2050\pages\ucastnici.php(807): dibi::query('INSERT INTO [uc...', Array)
#3 [internal function]: formPohovorySubmitted(Object(Form))
#4 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Utils\Callback.php(112): call_user_func_array('formPohovorySub...', Array)
#5 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Utils\ObjectMixin.php(56): NCallback->invokeArgs(Array)
#6 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Utils\Object.php(90): NObjectMixin::call(Object(Form), 'onSubmit', Array)
#7 [internal function]: NObject->__call('onSubmit', Array)
#8 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Forms\Form.php(447): Form->onSubmit(Object(Form))
#9 D:\Weby\projekty\EASYPORT\www\e2_2050\pages\ucastnici.php(790): NForm->fireEvents()
#10 D:\Weby\projekty\EASYPORT\www\e2_2050\pages\ucastnici.php(917): formPohovory(NULL)
#11 D:\Weby\projekty\EASYPORT\www\e2_2050\index.php(249): include('D:\Weby\projekt...')
#12 {main}
- Majkl578
- Moderator | 1364
Problém IMHO není v tvém překladači, ale na řádku kde ukládáš
hodnoty do DB (tj.
dibi::query('INSERT INTO [ucastnici_pohovory]', $values);
) kde
$values['priloha']
není string, ale objekt Nette\Web\HttpUploadedFile,
který není konvertovatelný na string.