Jak získám z tohoto insertu jeho ID
- cs_paladin
- Člen | 7
Ahoj všem,
snažím se posunout někam v PHP, takže jsem se začal trápit s nette ale
trochu mi uniká jak z tohoto insertu
$this->getTable()->insert(array(
'nazev'=>$jmeno,
'poloha_x'=>$poloha_x,
'poloha_y'=>$poloha_y,
'pocetLidi'=>$pocetLidi,
'rozloha'=>$rozloha,
'uzivatel_id'=>\Nette\Environment::getUser()->getId(),
'imuni'=>2000,
'rodine'=>$rodine,
'cihlove'=>$cihlove,
'panelove'=>$panelove,
'vezaky'=>$vezaky,
'firmy'=>$firmy
));
získám „LastInsertId“. Sloupce s ID se jmenuje „ID“
Díky moc za pomoc.
- David Matějka
- Moderator | 6445
ten insert by mel vracet instanci ActiveRow, takze:
$row = $this->getTable()->insert(array(....));
$row->id;
alternativou je pouzit metodu lastInsertId v 2.0 respektive getInsertId v 2.1 v Nette\Database\Connection
- cs_paladin
- Člen | 7
vosy napsal(a):
$this->database->lastInsertId()
Díky bohužel to nefunguje hlásí to chybu.
Používám Nette 2.0.12
Nette\MemberAccessException
Cannot read an undeclared property WebGame\MestoRepository::$database. search►
Source file ►
Call stack ▼
...\libs\Nette\common\Object.php:126 source ► Nette\ObjectMixin:: get (arguments ►)
...\app\model\MestoRepository.php:58 source ► Nette\Object-> __get (arguments ►)
48: 'uzivatel_id'=>\Nette\Environment::getUser()->getId(),
49: 'imuni'=>2000,
50: 'rodine'=>$rodine,
51: 'cihlove'=>$cihlove,
52: 'panelove'=>$panelove,
53: 'vezaky'=>$vezaky,
54: 'firmy'=>$firmy
55:
56: ));
57:
58: echo $this->database->lastInsertId();
59:
60: }
61:
62: public function getIdMesta($jmeno)
...\app\presenters\MestoPresenter.php:36 source ► WebGame\MestoRepository-> zalozMesto (arguments ►)
inner-code MestoPresenter-> noveMestoSubmitted (arguments ►)
...\libs\Nette\common\Callback.php:100 source ► call_user_func_array (arguments ►)
...\libs\Nette\common\ObjectMixin.php:59 source ► Nette\Callback-> invokeArgs (arguments ►)
...\libs\Nette\common\Object.php:79 source ► Nette\ObjectMixin:: call (arguments ►)
...\libs\Nette\Forms\Form.php:405 source ► Nette\Object-> __call (arguments ►)
...\libs\Nette\Forms\Form.php:405 source ► Nette\Application\UI\Form-> onSuccess (arguments ►)
...\libs\Nette\Application\UI\Form.php:131 source ► Nette\Forms\Form-> fireEvents ()
...\libs\Nette\Application\UI\Presenter.php:302 source ► Nette\Application\UI\Form-> signalReceived (arguments ►)
...\libs\Nette\Application\UI\Presenter.php:185 source ► Nette\Application\UI\Presenter-> processSignal ()
...\libs\Nette\Application\Application.php:128 source ► Nette\Application\UI\Presenter-> run (arguments ►)
...\www\index.php:10 source ► Nette\Application\Application-> run ()
Editoval cs_paladin (19. 9. 2013 8:49)
- cs_paladin
- Člen | 7
matej21 napsal(a):
ten insert by mel vracet instanci ActiveRow, takze:
$row = $this->getTable()->insert(array(....)); $row->id;
alternativou je pouzit metodu lastInsertId v 2.0 respektive getInsertId v 2.1 v Nette\Database\Connection
Tohle zase vrací vždy číslo 1 :-(
- Badaboom
- Člen | 33
Přečetl jsi si tu chybu vůbec?
Nejde vůbec o metodu lastInsertId
, ale že se ji snažíš
volat nad nedeklarovanou proměnnou. Metoda lastInsertId
patří
PDO, ze které dědí Nette\Database\Connection
A způsob, který nastínil matej21 funguje. Jenom je třeba si dávat pozor na to, že funguje pouze při vložení nového řádku a INSERT … SELECT namísto ActiveRow vrací počet řádků. Také update ActiveRow nevrací.
Oba způsoby fungují na Nette 2.0.12, jenom je špatně používáš.
Zkus poslat obsah proměnné $row
.
$row = $this->getTable()->insert(array(....));
dump($row);
exit;
- cs_paladin
- Člen | 7
četl, bohužel nevím jak udělat aby si to správně zdědil, vlastně jsem nejdřív jel podle tutorialu a pak jsem si to pomalu začal točit na svojí věc
Nette\Database\Table\ActiveRow(4) {
table private => Nette\Database\Table\Selection(18) {
connection protected => Nette\Database\Connection(6) {
dsn private => "mysql:host=localhost;dbname=webgame" (35)
driver private => Nette\Database\Drivers\MySqlDriver(1) { ... }
preprocessor private => Nette\Database\SqlPreprocessor(6) { ... }
databaseReflection private => Nette\Database\Reflection\DiscoveredReflection(5) { ... }
cache private => Nette\Caching\Cache(4) { ... }
onQuery => array(1) [ ... ]
}
cache protected => Nette\Caching\Cache(4) {
storage private => Nette\Caching\Storages\FileStorage(4) { ... }
namespace private => "Nette.Database.043dfc14c489014cffc975c040d3970a\x00" (48)
key private => NULL
data private => NULL
}
sqlBuilder protected => Nette\Database\Table\SqlBuilder(14) {
driver private => Nette\Database\Drivers\MySqlDriver(1) { ... }
driverName private => "mysql" (5)
tableName protected => "mesto" (5)
databaseReflection protected => Nette\Database\Reflection\DiscoveredReflection(5) { ... }
delimitedTable protected => "`mesto`" (7)
select protected => array(0)
where protected => array(0)
conditions protected => array(0)
parameters protected => array(0)
order protected => array(0)
limit protected => NULL
offset protected => NULL
group protected => ""
having protected => ""
}
name protected => "mesto" (5)
primary protected => "ID" (2)
primarySequence protected => NULL
rows protected => array(1) {
62 => Nette\Database\Table\ActiveRow(4) { *RECURSION* }
}
data protected => NULL
dataRefreshed protected => FALSE
referenced protected => array(0)
referencing protected => array(0)
referencingPrototype protected => array(0)
aggregation protected => array(0)
accessedColumns protected => NULL
previousAccessedColumns protected => NULL
observeCache protected => FALSE
checkReferenced protected => TRUE
keys protected => array(0)
}
data private => array(13) {
nazev => "MiraPolis" (9)
poloha_x => 7893
poloha_y => 1319
pocetLidi => 5546
rozloha => 5608
uzivatel_id => 1
imuni => 2000
rodine => 1109.0
cihlove => 555.0
panelove => 1941.0
vezaky => 1664.0
firmy => 555.0
ID => "62" (2)
}
dataRefreshed private => FALSE
modified private => array(0)
}
- cs_paladin
- Člen | 7
matej21 napsal(a):
$row->ID;
To je ono, ať žije zvyk z windowsů, velikost znaků. Super díky moc. Díky moc všem.
- mildhouse
- Člen | 27
Tady pozor na to, abys neukládal ID, např.:
// špatně
$row = $this->getTable()->insert(array('id' => 50, 'hodnota1' => $hodnota1, 'hodnota2' => $hodnota2));
// sloupec id je pravděpodobně auto increment, takže DB si to doplní sama např. na 123, ale...
echo $row->id; // 50
// správně
$row = $this->getTable()->insert(array('hodnota1' => $hodnota1, 'hodnota2' => $hodnota2));
// sloupec id je pravděpodobně auto increment, takže DB si to doplní sama např. na 123, pak...
echo $row->id; // 123
Nevim, jak u verze 2.1, ale u 2.0.x jsem na to narazil při kopírování z tabulky do tabulky (do archivu)