NDB INSERT – rozpoznaní stringu omezeno na 20 znaků

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

Narazil na problém, že se mi v dotazu automaticky neescapuje string delší než 20 znaků a nechá v dotazu ? mysql pak vyhodí chybu syntaxe.

<?php
// dump pole $data
// array (5)
//   firstname => "Jan" (3)
//   lastname => "Novak" (5)
//   email => "jan.novak11@seznam.cz" (21)
//   agreement => TRUE
//   password => "$2y$10$bEfKiPqNvOhthWJfUScT5eyQPPbol7c/kEIrUsCzSiRPgGivGc4bW" (60)

// \Nette\Database\Context $db
$db->query("INSERT INTO `user` SET", $data);

// vygeneruje toto
INSERT INTO `user`
SET (`firstname`, `lastname`, `email`, `agreement`, `password`)
VALUES ('Jan', 'Novak', ?, 1, ?)
?>

to omezení jsem našel tady https://github.com/…rocessor.php#L111 ale vůbec nechápu proč.

Je to chyba, nebo to má nějaký význam a musí se to nějak obejít?
Testováno na Nette 2.1.2.

Jan Mikeš
Člen | 771
+
0
-

IMO to co jsi nasel je pouze vypis do debug barru, pokud je string delsi nez 20, vypise se ?, nez aby se vypisoval cely string, kvuli velikosti debug baru.

Caine
Člen | 216
+
0
-

To neni vypis do debug baru. To je, kdyz je string vetsi nez 20 znaku, pouzij misto nej otaznik (parametr) a hodnota toho parametru se preda az pri bindovani parametru..

Zkus toto:
$db->query("INSERT INTO user", $data);

Jinak syntaxe se SETem je:
INSERT INTO user SET col_name={expr | DEFAULT}, ...

Editoval Caine (8. 4. 2014 11:46)

Oli
Člen | 1215
+
0
-

Pokud nemáš nějaký důvod použít query, tak použij NDBT:

$db->table('user')->insert((array) $data);

To mě nikdy nedělalo problém, kterej popisuješ…

milroe
Člen | 7
+
0
-

Díky za reakce.

Bohužel i tento zápis se chová stejně:
$db->query(„INSERT INTO user“, $data);

NDBT mi funguje, ale spis mi šlo o to někam nahlasit co nefunguje.
Problém je v tom ze se nenabinduje ten parametr a pak přímo MySQL hodí chybu syntaxe.

Caine
Člen | 216
+
0
-

A co takhle:
$db->query(„INSERT INTO user“, array($data));

milroe
Člen | 7
+
0
-

Tak omyl, tenhle zapis

<?php
$db->query(„INSERT INTO user“, $data);
?>

funguje.