Insert vrací FALSE i když data uloží

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

Ahoj,

zkouším relativně triviální operaci s \Nette\Database a to založení uživatele s jeho kontaktním údajem a heslem do databázové struktury, ale když se pokusím vložit data, tak dostanu jako odpověď FALSE i když se data úspěšně vloží do DB.

Kód mám následující

		$database = $this->getDatabase();
		//$database->beginTransaction();

		$salt = \Nette\Utils\Strings::random(10);

		$user = $database->table('user')->insert(array(
			'name' => $name,
			'surname' => $surname,
		));

		$userContact = $database->table('user_contacts')->insert(array(
			'user_id' => $user->id,
			'user_contact_type_id' => 1,
			'value' => $email,
		));
		$userCredential = $database->table('user_credentials')->insert(array(
			'user_id' => $user->id,
			'salt' => $salt,
			'password' => $database::literal('SHA2(CONCAT(?, ?), 512)', $salt , $password),
		));

		var_dump($userCredential);

Struktura DB je následující

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `surname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `user_contact_type` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `user_contacts` (
  `user_id` int(10) NOT NULL,
  `user_contact_type_id` int(10) NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`,`user_contact_type_id`),
  KEY `user_id` (`user_id`),
  KEY `user_contact_type_id` (`user_contact_type_id`),
  CONSTRAINT `user_contacts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
  CONSTRAINT `user_contacts_ibfk_2` FOREIGN KEY (`user_contact_type_id`) REFERENCES `user_contact_type` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_credentials` (
  `user_id` int(10) NOT NULL,
  `salt` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `user_credentials_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Verze Nette 2.1.1 (2014–02–08)

Tomáš Kolinger
Člen | 136
+
0
-

Určitě dotaz proběhne v pořádku? Určitě vypisuje debug bar všechny dorazy jako úspěšně provedené?

Editoval Tomáš Kolinger (21. 2. 2014 21:39)

2bfree
Člen | 248
+
0
-

Data do databaze jsou vlozena jak maji. Posledni dotaz spustiteny rucne funguje taktez. Dle debugbaru vraci pocet radek 1

David Matějka
Moderator | 6445
+
0
-

mozna to bude souviset s tim, ze primary key neni AI, ale rovnou ho tam nastavujes, zkus si odkrokovat co se deje v insert metode, mozna to bude nejaky bug v NDBT

2bfree
Člen | 248
+
0
-

Ano, primarni klic neni AI, jelikoz je zaroven cizim klicem na jinou tabulku. Je to chyba v navrhu DB, nebo v \Nette\Database? A jak z toho ven?

David Matějka
Moderator | 6445
+
0
-

tak potvrzuji, je to tim, ze tam neni AI – a muze za to primo PDO, ktery pro ->lastInsertId vrati 0, coz je trochu wtf :)

2bfree
Člen | 248
+
0
-

Imho je to proto, ze ten druhy insert nevlozi zadne id a proto ma ten treti hodnotu 0. Otazka je, co ted s tim?

David Matějka
Moderator | 6445
+
0
-

reportoval jsem to, https://github.com/…/issues/1421. ted jen doufat, ze to hrach opravi :)

btw, jako hotfix by melo stacit pridat auto increment na ten pk, i kdyz ho nebudes pouzivat, pdo potom vrati spravnou hodnotu

rixi
Člen | 109
+
0
-

vracat FALSE je urcite zvlastne, na to nie je iny sposob ako to vyriesit?

2bfree
Člen | 248
+
0
-

rixi napsal(a):

vracat FALSE je urcite zvlastne, na to nie je iny sposob ako to vyriesit?

Nakonec jsem i kvuli jinym duvodum refactoroval databazove schema, ale kazdopadne je tohle opravdu WTF