dibi update bez pouziti WHERE

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

Ahoj,

nikde v dokumentaci dibi se mi nepovedlo vycist, jak udelat update tabulky teto struktury:

DROP TABLE IF EXISTS `config`;
CREATE TABLE `config` (
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `value` text COLLATE utf8_czech_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
INSERT INTO `config` (`name`, `value`) VALUES
('web_title',	'titulek webu'),
('web_keywords',	'klicova, slova'),
('web_description',	'nejaky description webu'),
('web_paginator',	'20');

a po odeslani formulare mam takoveto pole hodnot:

$values = array(
   web_title => novy titulek",
   web_keywords => "nova, klicova, slova"
);

kdzy pouyiju tento zapis:

dibi::update('config', $values)->execute();

tak mi to vyhodi tuto chybu:

Unknown column 'web_title' in 'field list'

jak by se resil takovyto update tabulky, kdyz nemohu pouzit WHERE?

dekuju za rady..

hAssassin
Člen | 293
+
0
-

ty v tom poli ale mas spatne ty hodnoty… klicem je nazev sloupecku v tabulce, ne? a to co vlastne chces ti udela akorat to, ze ti vsechny radky aktualizuje na novou hodnotu, coz asi nechces… takze se WHERE stejne nevyhnes, ale misto ID tam budes mit WHERE [name] = 'novy titulek'. Cili nejak takto:

$values = array(
	value => "nova, klicova, slova"
);
$name = "web_keywords";

dibi::update('[config]', $values)->where('[name] = %s', $name)->execute();

snad sem napsal spravne…

Editoval hAssassin (12. 10. 2011 21:48)

tomasnikl
Člen | 137
+
0
-

ale ano, to vpodstate chci. Jelikoz mam na webu jeden velky formular s cca 15ti inputy kde kazdy input predstavuje 1 radek v tabulce databaze. To znamena, ze kdyz mam takovyto input:

<input name="web_title" value="Titulek webu" />

tak v databazi je radek, ktery vypada takto:

name | value //nazvy sloupcu v db
web_title | Titulek webu

a potrebuji, aby po odeslani formulare s 15ti inputy doslu k aktualizaci vsech 15ti radku v tabulce config.

tomasnikl
Člen | 137
+
0
-

tak jsem to vyresil takto (sice se mi to moc nelibi ale asi to tak musi byt):

//presenter po odeslani formulare:
$values = $form->getValues();
foreach($values as $key => $value) {
	$data = array(
		'value' => $value
	);
	Shared::update($data, $key);
}

//model
public static function update($values, $key)
{
	dibi::update('config', $values)->where('name =%s', $key)->execute();
}
Milo
Nette Core | 1283
+
0
-

To jednim updatem rozumne neudelas:

foreach ($values AS $name => $value) {
	dibi::query('UPDATE [config] SET [value] = %s', $value, 'WHERE [name] = %s', $name);
}

Dibi forum

mkoubik
Člen | 728
+
0
-

Ja bych dal na sloupeček name unique index a pak pouzil neco jako INSERT ... ON DUPLICATE KEY SET value = ..., pak můžeš použít stejný dotaz pro insert i update a nemusíš řešit, jestli už to v tabulce je nebo ne.