Ako správne získavať data z riadku tabuľky?
- lime
- Člen | 55
Ahoj, minule som tu založil tému kde mi vrátené data z tabuľky nepoznali 1 stlpec keď som použil niečo takéto:
$row = $this->pripojenie->table('users')->fetch();
- fungovalo to, keď som to zmenil na:
$ro = $this->pripojenie->table('users')->get($riadok_tabuľky);
Aký je medzi týmito 2 funkciami rozdiel? (teda okrem toho, že tá prvá mi nejako nefunguje :) ), a chcem sa ešte opýtať ako získať riadok tabuľky (nap. podľa username) lebo get() má povinný parameter, takže niečo takéto nefunguje:
$row = $this->pripojenie->table('users')->where('username', $username)->get();
Ja by som nejako potreboval dostať id riadku (teda užívateľa) do parametra funkcie get, ale neviem ako, ďakujem za objasnenie :)
Editoval lime (9. 12. 2013 23:11)
- factor
- Člen | 28
Hoj hoj,
sice asi nejsem ta nejkopetentnější osoba ale co už :)
$row = $this->pripojenie->table('users')->fetch();
Vrátí vše s limitem 1
$ro = $this->pripojenie->table('users')->get($riadok_tabulky);
Získá řádek s primárním klíčem $riadok_tabulky
$row = $this->pripojenie->table('users')->where('username', $username);
Pokud chceš získat pomocí where vynech ->get()
nebo pro víc argumentů
$array = array(
'username' => 'Jenda',
'age' => 18
);
$row = $this->pripojenie->table('users')->where($array);
Snad nekecám :)
Update
Zapoměl jsem odpovědět na tvou otazku k ziskani ID
$id = $this->pripojenie->table('users')->get($riadok_tabulky)->id;
Editoval factor (10. 12. 2013 9:05)
- lime
- Člen | 55
Toto bude poznať iba stlpec username
$row = $this->connection->table('users')
->where('username', $username);
A k tomu id, ja to potrebujem preto aby som to dal do argumentu funkcie get(), niečo takéto mi nejde:
$id = $this->connection->table('users')
->where('username', $username)
->get('id');
if(!$id) { //nepozná $id
throw new NS\AuthenticationException();
}
$row = $this->connection->table('users')
->get($id);
- elevate
- Člen | 31
$selection = $this->connection->table('users')
->where('username', $username);
Toto ti vrátí Selection (můžeš si to představit jako chytřejší pole řádků tabulky). Když chceš pouze jeden, tak můžeš požádat o první řádek z výsledku
$row = $selection->fetch();
Nebo celý seleciton vypsat v cyklu
foreach($selection as $row){
echo $row->username;
echo $row->id;
}
$row obsahuje celý řádek, nemusíš zpřesňovat, které sloupce chceš vrátit. Pokud ti tam nějaký chybí, tak smaž cache, protože NDB si ukládá, které sloupce má vrace.
Pokud bys přesto chtěl zpřesnit, jaké sloupce chceš, tak můžeš takto:
$selection = $this->connection->table("users")->select(array("id", "username"))->where("username", $username);
E.
- lime
- Člen | 55
Potreboval som iba vrátiť všetky stlpce z riadku tabuľky, už som to vyriešil takto:
$row = $this->connection->table('users')
->select('*')
->where('username', $username)
->fetch();
Po dlhom čase som začal robiť s databázou a zabudol som tam dať ten select(‚*‘) takže $row nepoznala všetky stlpce, to bol môj problém, ale už to je vyriešené, diky
- factor
- Člen | 28
Hoj Lime,
pokud budeš mít např tuhle tabulku (users):
id | name | surname | |
---|---|---|---|
1 | Zdeněk | Novák | test1@example.com |
2 | Jaroslav | Novák | test2@example.com |
tak dotaz bude vypadat takhle:
$row->db->table("users")->where("name", "Zdeněk");
a pokud budeš chtít získat nějaká data z toho řádku tak potom už jen (pozor aby ti to nevytáhlo více řádků, potom by byl tenhle zápis špatně a musel by jsi to projet pomocí např foreach):
$row->id;
$row->name;
$row->surname;
asi tě plete metoda ->get($id), (jak jsem psal) ta dělá jen to že v DB vybere řádek kterej má primární klíč roven předanému parametru.
Nic složitého a ještě ti to ulehčí práci :)
Editoval factor (10. 12. 2013 12:50)
- lime
- Člen | 55
Šaman má pravdu, ja som tam doteraz nedával select a jeden stlpec mi to nepoznalo, mal som asi takú tabuľku ako urobil factor, a takýto dotaz:
$row->db->table("users")->where("name", "Zdeněk");
poznal iba stlpce id a name, mal som niečo podobné, a keď som nejako v podmienke where() nespomenul stlpec tak ho potom nepoznalo, preto som musel selectom vybrať stlpce, ktoré som potreboval
Editoval lime (10. 12. 2013 14:27)
- Oli
- Člen | 1215
Šaman: Ano, to máš pravdu. Problem je, že pokud ho nepoužije, tak na co ten nevyužitej sloupec tahat? Kdybych měl uvést příklad, jak to používám, tak:
$row = $this->connection->table('users')->where('name' 'Zdeněk')->fetch();
$row // stáhne pravděpodobně jen id a name
$row->email // stáhne id, name, email
$row->role->name // stáhne id, name, (tady jen tipuju) role_id, role.name
...
Takhle to používám a neměl jsem jedinkrát problém. Jestli to opravdu stahuje jen takhle jen tipuju. Takže ano, není to jedno, ale z hlediska přístupu ke sloupcům to jedno je… :-)
lime: napadlo mě, jaké používáš úložiště? Doporučovaný je InnoDB, kvuli cizím klíčům. Teoreticky tohle může dělat problém nebo jsi měl nacachovány 2 sloupce a ty jsi chtěl 3.
- lime
- Člen | 55
Oli napsal(a):
lime: napadlo mě, jaké používáš úložiště? Doporučovaný je InnoDB, kvuli cizím klíčům. Teoreticky tohle může dělat problém nebo jsi měl nacachovány 2 sloupce a ty jsi chtěl 3.
Áno, používam InnoDB a cache som tiež vymazával, ale v tom nebol problém, no už používam selecty a viem si pekne vybrať stlpce, ktoré potrebujem
- romiix.org
- Člen | 343
Ide o to, že ak nepoužiješ select
, nemusíš si vyberať
stĺpce ktoré potrebuješ, ale NDB to optimalizuje samo. Je to proste
zbytočnosť. (Ak všetko funguje ako má)
- lime
- Člen | 55
Aháááá :) no problém je, že u mňa to nefunguje ako má, teda tento kód nepozná stlpec role pri vracaní novej identity:
function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->connection->table('users')
->where('username', $username)
->fetch();
if(!$row) {
throw new NS\AuthenticationException();
}
if($row->password !== (sha1($password."A45xOm"))) {
throw new NS\AuthenticationException();
}
return new NS\Identity($row->id, $row->role); //$row->role nepozná
}
- romiix.org
- Člen | 343
lime napsal(a):
Daj sem export tabuľky users
, alebo ideálne celú DB.
(pastebin)
- lime
- Člen | 55
romiix.org napsal(a):
lime napsal(a):
Daj sem export tabuľky
users
, alebo ideálne celú DB. (pastebin)
takýto export alebo ako si to myslel? :)
INSERT INTO `users` (`id`, `username`, `password`, `role`, `register_date`) VALUES
(1, 'lime', 'fde955e73998719e0a85a07ce0f9f08f59a3a8a1', 'member', '2013-12-08 13:49:03'),
(2, 'honza', 'd00a5d0fb8d645369cbe7829d818d4ed7dbc53e0', 'member', '2013-12-10 09:55:01');
alebo: http://pastebin.com/zS9TjDm7
Editoval lime (10. 12. 2013 16:30)
- romiix.org
- Člen | 343
Myslel som export štruktúry tabuliek, ale aj toto postačilo.
Skutočne by to takto malo fungovať. Možno by stálo za to otestovať to na čistom sandboxe.
- lime
- Člen | 55
keď tak ešte obrázok: http://screenshot.cz/EN9NG/
- ja to skúsim niekedy zajtra na novom sandboxe, teraz nemám čas