Problem s vracenim naposled vlozeneho ID

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

ahoj
pomoci nette vytvorim novou tabulku:

$tab = 'z'.$idZnacky.'_'.\App\Glb::$TABS['vyrobky'];


        if(!$this->MyDb->tableExists($tab))
        {
            $sql = 'CREATE TABLE IF NOT EXISTS `'.$tab.'` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nazev` varchar(200) COLLATE utf8_czech_ci NOT NULL,
  `objCislo` varchar(50) COLLATE utf8_czech_ci NOT NULL,
  `herstellerNumber` varchar(50) COLLATE utf8_czech_ci NOT NULL,
  `ean` varchar(50) COLLATE utf8_czech_ci NOT NULL,
  `origText` text COLLATE utf8_czech_ci NOT NULL,
  `transText` text COLLATE utf8_czech_ci NOT NULL,
  `url` varchar(200) COLLATE utf8_czech_ci NOT NULL,
  `nacteniZakladni` datetime DEFAULT NULL,
  `nacteniDetailu` datetime DEFAULT NULL,
  `nacteniBTS` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `objCislo` (`objCislo`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;';

            $this->db->query($sql);
        }

nasledne do ni vlozim data:

 $sqlVals = array('objCislo'=>$objCislo,
                            'url'=>$url,
                            'nacteniZakladni'=>date('Y-m-d H:i:s'));

$r = $this->db->table($tab)
           ->insert($sqlVals);

a pak bych rad ziskal nove ID

$idVyrobku = $r->id;

toto vraci NULL

ikdyz vymazu temp/cache

Editoval vosy (1. 6. 2015 14:32)

David Matějka
Moderator | 6445
+
0
-

verze nette?

vosy
Člen | 532
+
0
-

2.3.1

David Matějka
Moderator | 6445
+
0
-

A posila se do db nejaky dotaz? Na gh byly nejaky issues, ze se posila s id „0“.. jak se deje u tebe?

vosy
Člen | 532
+
0
-

Ano posila se dotaz:

$sqlVals = array('objCislo'=>$objCislo,
                            'url'=>$url,
                            'nacteniZakladni'=>date('Y-m-d H:i:s'));

$r = $this->db->table($tab)
           ->insert($sqlVals);

$idVyrobku = $r->id;

$idVyrobku ⇒ null

David Matějka
Moderator | 6445
+
0
-

spatne jsem se vyjadril. Po insertu provadi ndbt jeste jeden dotaz pro vyber aktualne vlozeneho radku. Provadi se? jak vypada?

vosy
Člen | 532
+
0
-

tak tomu trochu nerozumim :(

vosy
Člen | 532
+
0
-

Tento dotaz se mi provadi na pozadi pres AJAX, takze nevidim ladenku

vosy
Člen | 532
+
0
-
$r = $this->db->table($tab)
                                    ->insert($sqlVals);

    var_dump($r);
    echo'<br/>';
                    $idVyrobku = $r->id;

    echo 'idVyrobku: '.$idVyrobku.'<br/>';

var_dump($r) vraci 1
a $idVyrobku = null

Editoval vosy (1. 6. 2015 16:09)

vosy
Člen | 532
+
0
-

vycuc z Queries

time: 0.459

INSERT INTO `z36_vyrobky` (`objCislo`, `url`, `nacteniZakladni`)
VALUES ('722.00.31', 'http://www.domena.cz/article/153', '2015-06-01 16:08:39')

.../app/AdminModule/models/vyrobky/ZakladniRepository.php:291

rows: 1

------------------------
ERROR

INSERT INTO `z36_vyrobky_skupiny` (`vyrobky_id`, `skupiny_id`)
VALUES (NULL, 1)

.../app/AdminModule/models/vyrobky/ZakladniRepository.php:345
n.u.r.v.
Člen | 485
+
0
-

Nevím jestli to je stejná chyba, ale mě se tohle často teď stává na nejnovějším nette – spolehlivé řešení (alespoň u mě) je si udělat export té tabulky, pak ji smazat do DB a pak ji znova naimportovat a smazat cache nette (+zkontrolovat, zda db tabulka má PK)

vosy
Člen | 532
+
0
-

to asi nebude moc userFriendly

iguana007
Člen | 970
+
0
-

A zkoušel sis tu query, kterou tam posíláš spustit přímo v DB? Nevím jak u tebe, ale s tebou uvedeným kodém se mi ten INSERT nevykoná, protože tam nepředáváš některé hodnoty sloupců, které máš nastavené na NOT NULL + nemají nastavenou žádnou defaultní hodnotu:

INSERT INTO `z36_vyrobky_skupiny` (`objCislo`, `url`, `nacteniZakladni`) VALUES ('722.00.31', 'http://www.domena.cz/article/153', '2015-06-01 16:08:39')
Error in query (1364): Field 'nazev' doesn't have a default value
vosy
Člen | 532
+
0
-

spusteni v DB funguje dobre

Vložen 1 řádek.
ID vloženého řádku: 1 ( dotaz trval 0.0007 sekund )


INSERT INTO  `z30_vyrobky` (  `objCislo` ,  `url` ,  `nacteniZakladni` )
VALUES (
'722.00.31',  'http://www.domena.cz/article/153',  '2015-06-01 16:08:39'
)

navic query vytvoreni tabulky je export primo z DB

Unlink
Člen | 298
+
0
-

To nieje možné, nieje tam ešte niečo, čo si zabudol spomenúť?

Skús sem dať priamo dump tej tabuľky z30_vyrobky pretože ten čo máš v prvom príspevku určite nieje správny.

vosy
Člen | 532
+
0
-

F tom se fakt nevyznam

$r = $this->db->table($tab)
        ->insert($sqlVals);

    var_dump($r);

celej dump se mi sem nevejde

ma vice jak 1000znaku

vosy
Člen | 532
+
0
-

udelal jsem nazkousku

		$tab = 'zkouska';

$sql = 'CREATE TABLE IF NOT EXISTS `'.$tab.'` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `objCislo` varchar(50) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `objCislo` (`objCislo`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;';

$this->db->query($sql);

$r = $this->db->table($tab)
        ->insert(array('objCislo'=>'1234'));

var_dump($r->id);

$r = $this->db->table($tab)
        ->insert(array('objCislo'=>'5678'));

var_dump($r->id);

vysledek

NULL NULL

data v tabulce jsou ulozeny

a to i v pripade kdy vymazu cache

Editoval vosy (2. 6. 2015 21:35)

vosy
Člen | 532
+
0
-
$r = $this->db->table($tab)
                ->insert(array('objCislo'=>'5678'));

        var_dump($r);

vysledek → int(1)

Unlink
Člen | 298
+
0
-

A keď dáš

var_dump($this->db->table($tab)->getPrimary());

tak dostaneš čo?

vosy
Člen | 532
+
0
-

tak to nechapu:

Table ‚zkouska‘ does not have a primary key

pritom

10:            $sql = 'CREATE TABLE IF NOT EXISTS `'.$tab.'` (
11:              `id` int(11) NOT NULL AUTO_INCREMENT,
12:              `objCislo` varchar(50) COLLATE utf8_czech_ci NOT NULL,
13:              PRIMARY KEY (`id`),
14:              UNIQUE KEY `objCislo` (`objCislo`)
15:            ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;';
16:
17:            $this->db->query($sql);
18:
19:            var_dump($this->db->table($tab)->getPrimary());
Unlink
Člen | 298
+
0
-

No presne ako som predpokladal, to insert ti vráti 1 (lebo ten insert vložil jeden riadok) namiesto IRow a pre to nieje možné volať to $r->id a robí to preto, lebo nevie nájsť primárny kľúč.

Ale čím to je neviem, možno preto že tú tabuľku vytváraš dynamicky ale s tým ti musí poradiť už niekto skúsenejší.

Editoval Unlink (2. 6. 2015 22:27)

vosy
Člen | 532
+
0
-

DIX, za posunuti v problemu

n.u.r.v.
Člen | 485
+
0
-

j, přesně to ose mi někdy teď stává taky, ale přitom když si udělám export té tabulky, tak tam ten PK je… když tu tabulku znovu nahodím, tak už to běží…

vosy
Člen | 532
+
0
-

pomohlo mi, ze jsem tabulku dynamicky vytvoril mnohem drive nez na ni sel prvni prikaz INSERT z ktereho jsem chtel ID.

David Matějka
Moderator | 6445
+
0
-

@vosy mimochodem, muzu vedet, proc vytvaris tabulku dynamicky?

vosy
Člen | 532
+
0
-

protoze potrebuju urcite data dat do jedne tabulky a urcite dat do jine dle urciteho klice.

tak aby data byly jednoduse predatelne

David Matějka
Moderator | 6445
+
0
-

@vosy prijde mi to jako hloupost, proc si proste to id znacky nedas do nejakyho sloupecku?

vosy
Člen | 532
+
0
-

to sem vedel ze mi napises :)

Pavel Kravčík
Člen | 1196
+
0
-

Takhle ta tabulka moc významu nemá, kromě toho, že sis přidělal pár hodin práce navíc. :) Zkusil bych vytvoření té tabulky promazat cache automaticky, třeba to ten PK udělá. Občas mi to dělalo v práci s YetORM a stačilo smazat tu cache a vše bylo v pořádku.

vosy
Člen | 532
+
0
-

mazani cache neco specialniho nebo jen rm_dir()??? V cachi mam slozky _Nette.Database.eb6eecd95a4880f7c4a06be36a271c38, _Nette.Database.Structure.eb6eecd95a4880f7c4a06be36a271c38,
_Nette.RobotLoader,
Nette.Configurator

mamm smazat vse nebo jen nejakou konkretni slozku?

Pavel Kravčík
Člen | 1196
+
0
-

Použij ten finder a můžeš zkusit smazat všechno, co má database v sobě. Ale rozhodně to není dobré řešení! :)