IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 3. diel - Práca s MySQL v PHP - Použitie ovládača MySQLi

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:6.7.2012 10:10

V první verzi jsi vlastně nasimuloval práci se starším ovladačem MySQL pomocí MySQLi. Podle mne by bylo lepší použít procedurální volání, např:

mysqli_query(...);

Přiznávám, že druhá verze je mi docela blízká, nějaký podobný wrapper bych si asi napsal.

Poslední verze je zajímavá, hlavně použití implode. Nesedí mi ale název třídy MyDB, když třída reprezentuje adresář. Jako logičtější bych viděl třídu Adresar s přetíženým __toString, tam by dávalo smysl, že:

echo adresar;

vypíše adresář. Podobný princip používám v C#, kde je ORM (LINQ). Ten vytvoří DB třídy. Já si je poté rozšířím pomocí partial class a přidám jim ToString().

V PHP mám s tímto problém, protože zde jsem s ORM nedělal. Vím, že ty ORM příliš nectíš, jak tedy řešíš tvorbu objektů z query?
Já to mám zatím tak, že když to nepotřebuji, tak si objekty netvořím (např. chci jen 1 atribut odněkud), ale občas něco používám tak často, že se mi vyplatí tomu udělat třídu a tu naplnit daty na začátku požadavku na server. Musím si to samozřejmě ručně namapovat v konstruktoru a to je docela otrava. Říkal jsem si, že by šlo nějakou magií naplnit atributy objektu sloupci z DB (kdyby měly stejný název), jen nevím, jestli se to sluší a patří.

Odpovedať
6.7.2012 10:10
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:6.7.2012 11:32

Možná bych první příklad ještě mohl předělat na mysqli_query(), aby si i odpůrci objektů přišli na své :)

Také jsem nad názvem třídy MyDB váhal a zřejmě Adresar by byl vhodnější název. Nevím, jestli to ještě má smysl měnit v tomto článku, ale v PDO (které je mi bližší) to spravím. Ke tvorbě objektů z dotazu se časem také dostanu.

Na naplnění atributů objektu sloupci z DB není třeba magie. Na to stačí metoda MySQLi::fetch_a­ll(), resp. PDO::fetchAll(). Samozřejmě se k tomu používá jen jedna privátní proměnná. Pokud potřebuji konkrétní názvy sloupců, upravím si je přímo v SQL dotazu.

Odpovedať
6.7.2012 11:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:7.7.2012 9:03

Jo, když už procedurálně, tak bych tak volal i MySQLi. Ani ne pro nepřizpůsobivé odpůrce objektů (ty na tomto webu ani nechceme a rozhodně pro ně nebudeme něco psát), ale pro začátečníky, kteří nevědí, co to objekt je. Názory na začátky v programování se liší, já zatím myslím, že by měl člověk začít bez objektů a poté na ně brzy navázat, jinak je toho hodně najednou. Někdo říká, že by měl začít přímo v neobjektovém jazyce, někdo že má začít objekty. Psát procedurálně v obj. jazyce mi přijde jako dobrý kompromis pro osvojení základů.

Třídu bych přejmenoval.

To fetchAll ale vrací nějaký svůj objekt ne? Já chci, aby data byla v instanci mé třídy. Tedy abych napsal např.:

$diar = new Diar();
// konstruktor načte data
echo $diar->dnes();
echo $diar->majitel;

Tedy abych mohl volat své metody a přistupovat k získaným atributům z DB. Teď mám v konstruktoru mraky dosazení do atributů.

Odpovedať
7.7.2012 9:03
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:7.7.2012 9:33

Však jsem první příklad přepsal a třídu přejmenoval.

Metoda MySQLi::fetch_all() vrací obyčejné nebo asociativní pole. Seznam objektů umí až PDO::fetchAll(). Možná to dám do 5. dílu.

MySQLi se už déle zabývat nebudu. Beru ho jen jako mezičlánek. Je lepší, než původní ovladač, ale na PDO nemá.

Odpovedať
7.7.2012 9:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:7.7.2012 9:49

Aha, jsem si nevšiml, promiň :)

Jo, tak v PDO, jestli lze, aby to naplnilo daty instanci mé třídy.

Odpovedať
7.7.2012 9:49
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:7.7.2012 9:54

PDO::fetch() umí vrátit objekt, PDO::fetchAll() pole objektů. Mělo by to stačit.

Odpovedať
7.7.2012 9:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Marek Šafránek:2.3.2015 14:50

takže jako začátečník bych měl ideálně začít s PDO nebo MySQLi?:) A naučit se dobře oba způsoby?

Odpovedať
2.3.2015 14:50
Stojí-li něco za námahu, je třeba to udělat pořádně...
Avatar
Odpovedá na Marek Šafránek
Martin Konečný (pavelco1998):2.3.2015 15:06

Doporučuji určitě PDO, umí toho víc než MySQLi a myslím, že ti PDO bude bohatě stačit :)

Odpovedať
2.3.2015 15:06
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!