Nette Database – problém s načtením záznamu
- blaztar
- Člen | 93
Zdravím,
chtěl jsem se zeptat čím by mohlo být že mi následující část kódu:
$this->db->table('material_vany')->fetchAll();
při této struktuře databáze:
id: 0 nazev: Pozink
id: 1 nazev: Nerez
vrací pouze položku Pozink.
Když dám:
$this->db->table('material_vany')->count();
dostanu 1, ale zas když dám přímo:
$this->db->table('material_vany')->get(1);
dostanu Nerez. Musí to být nějaký prkotina, ale nevidím to.
Editoval blaztar (23. 7. 2015 19:32)
- Mysteria
- Člen | 797
Co ti to vygeneruje za dotaz? Když ten vygenerovaný dotaz spustíš třeba v PHPMyAdmin, tak ti vrátí oba řádky?
Jinak místo ->count() používej radši
->count('*')
protože to první ti vybere všechny řádky a interně v PHP spočítá, kdežto to druhé ti vytvoří normální dotazy ve stylu SELECT COUNT(*) FROM table;
- blaztar
- Člen | 93
je to instalovaná nedávno.
"require": {
"php": ">= 5.4.0",
"nette/application": "~2.3.0",
"nette/bootstrap": "~2.3.0",
"nette/caching": "~2.3.0",
"nette/database": "~2.3.0",
"nette/di": "~2.3.0",
"nette/finder": "~2.3.0",
"nette/forms": "~2.3.0",
"nette/http": "~2.3.0",
"nette/mail": "~2.3.0",
"nette/robot-loader": "~2.3.0",
"nette/safe-stream": "~2.3.0",
"nette/security": "~2.3.0",
"nette/utils": "~2.3.0",
"latte/latte": "~2.3.0",
"tracy/tracy": "~2.3.0"
},
Provedl jsem i update právě a furt stejný problém.
Editoval blaztar (23. 7. 2015 20:06)
- Unlink
- Člen | 298
Zax napsal(a):
Nebude to nějaká blbost s tím ID=0? Číslovat od nuly není zrovna úplně běžný si myslím, tak jestli to není třeba nějaký bug který s tím souvisí?
No veď preto by som chcel ten dump tej tabuľky, aby sa to dalo nasimulovať, je možné že to je aj tým, ale mne to funguje aj s id = 0
- blaztar
- Člen | 93
Myslíš takto?
dump($this->db->table('material_vany'));
K čemu konkrétnímu bych se měl v tom dumpu proklikat. Je tam toho hodně.
Jinak ID 0 mám i jinde a tam vše běží.
Číslování se váže ke kódu produktu např: MBK-51–54–12–0 kde právě poslední číslo určuje ten materiál :) proto 0 i v DB.
Editoval blaztar (23. 7. 2015 20:31)
- blaztar
- Člen | 93
-- phpMyAdmin SQL Dump
-- version 4.3.11
-- http://www.phpmyadmin.net
--
-- PoÄŤĂtaÄŤ: 127.0.0.1
-- Vytvořeno: Čtv 23. čec 2015, 20:40
-- Verze serveru: 5.6.24
-- Verze PHP: 5.6.8
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Databáze: `konfigurator`
--
-- --------------------------------------------------------
--
-- Struktura tabulky `material_vany`
--
CREATE TABLE IF NOT EXISTS `material_vany` (
`id` int(10) unsigned NOT NULL,
`nazev` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Vypisuji data pro tabulku `material_vany`
--
INSERT INTO `material_vany` (`id`, `nazev`) VALUES
(1, 'nerez'),
(0, 'pozink');
--
-- KlĂÄŤe pro exportovanĂ© tabulky
--
--
-- KlĂÄŤe pro tabulku `material_vany`
--
ALTER TABLE `material_vany`
ADD PRIMARY KEY (`id`), ADD KEY `material_vany_nazev_index` (`nazev`);
--
-- AUTO_INCREMENT pro tabulky
--
--
-- AUTO_INCREMENT pro tabulku `material_vany`
--
ALTER TABLE `material_vany`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
- Unlink
- Člen | 298
No, mysql pri AUTO_INCREMENT
berie defaultne 0 ako prázdnu
hodnotu, takže dosadí nové ID
ty nastavuješ SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
čo ti
dovolí do primárneho kľúča s AUTO_INCREMENT vložiť 0 a zrejme s týmto
si NTDB nedokáže poradiť.
Buď zrušíš to AUTO_INCREMENT alebo budeš mať idčka štandardne od 1
Editoval Unlink (23. 7. 2015 20:49)
- blaztar
- Člen | 93
Mám podobnou tabulku Lišty a tam mi vyjedou všechny výsledky.
Struktura tabulky lista
Pole | Typ | Nullable |
---|---|---|
id | int(10) | Ne |
nazev | varchar(255) | Ne |
Vypisuji data pro tabulku lista
0 | bez lišty |
2 | L-lišta |
1 | U-lišta |
3 | Z-lišta |
array (4)
0 => Nette\Database\Table\ActiveRow #3519
table private => Nette\Database\Table\Selection #4550
data private => array (2)
id => 0
nazev => "bez lišty" (10)
dataRefreshed private => FALSE
2 => Nette\Database\Table\ActiveRow #ebc9
table private => Nette\Database\Table\Selection #4550
data private => array (2)
id => 2
nazev => "L-lišta" (8)
dataRefreshed private => FALSE
1 => Nette\Database\Table\ActiveRow #fccf
table private => Nette\Database\Table\Selection #4550
data private => array (2)
id => 1
nazev => "U-lišta" (8)
dataRefreshed private => FALSE
3 => Nette\Database\Table\ActiveRow #ea2f
table private => Nette\Database\Table\Selection #4550
data private => array (2)
id => 3
nazev => "Z-lišta" (8)
dataRefreshed private => FALSE
Editoval blaztar (23. 7. 2015 20:55)
- Unlink
- Člen | 298
Ono je to celkom zaujímavé, že prečo vlastne keď selectuješ z materialov tak ti to najskôr selectne ten s ID 1 a potom ten s ID 0 a v tom druhom máš najskôr to s ID 0
Problém je ale tuna
https://github.com/…election.php#L490
Ono ti to prepíše ten prvý záznam, lebo v php je „0“ false, skúsim spraviť PR a fixnut to.
Zatiaľ to môžeš skúsiť takto:
$this->db->table('material_vany')->order('id')->fetchAll();
Editoval Unlink (23. 7. 2015 21:15)