Unexpected value prři vkládání z formu do MySQL

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
symmetry
Člen | 71
+
0
-

Zdravím, vkládám do DB dta z formu, problém je s hodnotou pocházející z fileinputu.
Poud si ji nechám normálně echem vypsat, je vše o.k, pokud se ji pokusím zapsat do DB, dostanu hlášku:

INSERT INTO tbl_seminars (seminar_name, date_of_start, date_of_end, content,
attachments, is_allowed)
VALUES (‚Přepínání mezi taby prohlížeče, v závislosti na odkazu‘, ‚1985–08–10‘,
‚2000–04–08‘, ‚QSSS<br>‘, Unexpected object, 0)

A právě to mi vrtá hlavou, proč mi dibi nechce vzít klasickou hodnotu stringu?

Kdyby se někdo s podobným prblémem setkal, budu rád za jakoukolliv radu.

kod fromu vypada takto:

<?php
include './libs/nette-0.9-PHP-5.2/Nette/loader.php';
Debug::enable();
$form = new Form;
$form->addGroup('Vložení nového semináře');

$form->addText('nazev', 'Název semináře:')
->addRule(Form::FILLED, 'Vložte název semináře');

$form->addText('start', 'Datum začátku:')
->addRule(Form::FILLED, 'Vložte datum začátku semináře');

$form->addText('end', 'Datum konce:')
->addRule(Form::FILLED, 'Vložte datum konce semináře');

$form->addTextArea('content', 'Informace o semináři:')
->addRule(Form::FILLED, 'Vložte datum konce semináře');

$form->addFile('attachment','Příloha k semináři');


$form->addSubmit('send', 'Odeslat');
//End of form

if($form ->isSubmitted()&&$form ->isValid())
{
    $name = $form['nazev']->getValue();
	$start = $form['start']->getValue();
	$end = $form['end']->getValue();
	$content = $form['content']->getValue();
	mysql_escape_string($content);
	$attachment = $form['attachment']->getValue();
	//TODO VALIDATION
	$articles = new  Articles();
	if($articles->SaveNewSeminar($name,$start,$end,$content,$attachment))
	{echo 'o.k';}
	else
	{echo 'vložení se nezdařilo';}
}

echo $form;
?>

A metoda

<?php

	public function SaveNewSeminar($name,$start,$end,$content,$attachment) {
	$arr = array(
    'seminar_name' => $name,
    'date_of_start'  => $start,
	'date_of_end' => $end,
    'content'  => $content,
	'attachments' => $attachment,
	'is_allowed' => 0
);
		$result = dibi::test('INSERT INTO [tbl_seminars] ',$arr);
		if($result)
		return  TRUE;
	}
?>
blacksun
Člen | 177
+
0
-

V proměnné $attachment je objekt, jednou z jehož vlastností je i název vkládaného souboru ve stringu, vyžaduje to další zpracování.

redhead
Člen | 1313
+
0
-

a za druhé, by si měl používat něco jako toto

$values = $form->getValues();

a s tímto polem teprve dále operovat.

Po uploadnutí souboru je ve $values[‚attachments‘] objekt typu HttpUploadedFile, který zastřešuje ten soubor, který musíš někam uložit, a do databáze ukládat jen název (nebo url, nebo co potřebuješ), protože databáze si s objektem tohoto typu sama nedokáže poradit.. (nečekaně :) )

Editoval redhead (10. 11. 2009 22:21)

symmetry
Člen | 71
+
0
-

Nemohl by jsi tu prosím tedy uvést nějaký příklad, abych se naučil získávat správně hodnoty z fomulářů, především z fileinputu?
Pořád mám problém s tím to rozběhnout korektně.

K získávání hodnot bych tedy použil správně toto?:

<?php
$values = $form->getValues();
echo $values['attachment'];
?>

Editoval symmetry (10. 11. 2009 23:16)

symmetry
Člen | 71
+
0
-

Díky za nakopnutí, udělal sem to takto, problém teď ale nastal s uploadem.
Script sice proběhne a tváří se o.k ale k move_upload_file nedojde..
Kde by mohl být problém?

<?php
	//Get all values from array
	$values = $form->getValues();
	//Get separately values
    $name = $values['nazev'];
	$start = $values['start'];
	$end = $values['end'];
	$content = $values['content'];
	$attachment=  $values['attachment']->getName();
	//Try upload file
	$values['attachment']->move('files');
	//Save form values to the DB
	$articles = new  Articles();
	if($articles->SaveNewSeminar($name,$start,$end,$content,$attachment))
	{echo 'o.k';}
	else
	{echo 'vložení se nezdařilo';}
?>
symmetry
Člen | 71
+
0
-

Dokonce i pri overeni $values[‚attachment‘]->isOk() my to vrati true ale soubor se nikde upladovany neobjevi.

<?php
$values['attachment']->move('/files');
	if($values['attachment']->isOk())
    {echo 'uploado.k';}
?>
Tomik
Nette Evangelist | 485
+
0
-

Kam jej opravdu ukládáš? Protože mezi files a /files je rozdíl. Případně zkus zobrazit si i skryté souboru, pokud jsi mu nedal příponu, může se Ti schovávat…

Ondřej Mirtes
Člen | 1536
+
0
-

Nemá být v move() cesta ke konkrétnímu souboru, ne jen do složky?

Každopádně používej absolutní cesty způsobem:

dirname(__FILE__) . '/directory/file.txt'

Jinak se fakt nedá zjistit, kam se ten soubor uloží.

A isOk() bys měl kontrolovat před move(), indikuje totiž, jestli proběhl v pořádku upload, ne to přesunutí.

symmetry
Člen | 71
+
0
-

Tomik napsal(a):

Kam jej opravdu ukládáš? Protože mezi files a /files je rozdíl. Případně zkus zobrazit si i skryté souboru, pokud jsi mu nedal příponu, může se Ti schovávat…

Ukladam je do:

<?php
$values['attachment']->move('/files');
?>

protoze pri uvedeni:

<?php
$values['attachment']->move('files');
?>

Vyhodi exception>>
Unable to move uploaded file ‚C:\Data\Programing\PHP\tmp\php96C3.tmp‘ to ‚files‘.

Editoval symmetry (11. 11. 2009 0:49)

symmetry
Člen | 71
+
0
-

Vyreseno:

<?php
$values['attachment']->move('files/'.$attachment);
?>

Je spravne.

Diky moc za pomoc, snad to nekomu v budoucnu take pomuze.