Autor | Zpráva | ||
---|---|---|---|
houbín Profil |
Zdravím.
Začínám s OOP, něčemu už jsem přišel na kloub, ale ještě mám občas problém se syntaxí, jak něco zavolat a tak. Tady je fiktivní kód, abych vysvětlil, o co mi jde. <?php class Trida { public function neco (){ zavolej funkci necoUdelej(); // kód ... } private function necoUdelej(){ // kód ... } } ?> Nemůžu přijít na to, jak zavolat metodu ve funkci (nejsem si jistý správností terminologie, kdyžtak mě opravte ;) ). |
||
pcmanik Profil |
houbín:
<?php class Trida { public function neco (){ $this->necoUdelej(); // kód ... } private function necoUdelej(){ // kód ... } } ?> |
||
houbín Profil |
#3 · Zasláno: 10. 7. 2016, 13:08:06
Aha, díky :)
Asi dělám něco špatně, protože funkce nic nedělá. Mám private funkci, kde se má vykonat sql příkaz. Ten jsem testoval a v databázi funguje, takže je chyba někde v mém php kódu. <?php public function neco(){ $this->necoUdelej(); // další kód ... } private function necoUdelej(){ $this->mysqli->query( /* sql dotaz */ ); } ?> Funkce $this->necoUdelej(); nefunguje (nevykoná se).
|
||
Joker Profil |
#4 · Zasláno: 10. 7. 2016, 13:09:59
houbín:
Pro přístup k vlastnostem stejného objektu slouží klíčové slovo this .
Pokud by to byla statická metoda, kdy žádný objekt neexistuje (volá se Třída::Metoda(); ), použije se klíčové slovo self .
[#3]: „funkce nic nedělá“ A provede se volání té funkce neco ?
|
||
houbín Profil |
Joker:
Zkoušel jsem tu funkci zavolat přímo kódu, ne ve funkci (a změnil jsem ji na public), ale také se sql příkaz neprovedl, takže netuším, v čem je chyba. |
||
pcmanik Profil |
houbín:
Ukáž nam ako voláš tu metódu neco(); A rovno nám aj ukáž kód tej triedy. A inak predpokladám že máš zapnutý výpis chýb. |
||
houbín Profil |
#7 · Zasláno: 10. 7. 2016, 13:37:45
pcmanik:
Tady je kus mého kódu: <?php class Item { public function delete($id){ $this->mysqli->query('DELETE FROM '.$this->table_name.' WHERE id = '.$id.' LIMIT 1'); $this->setCounterDb(); } private function setCounterDb(){ $query = ' SET @num := 0; UPDATE '.$this->table_name.' SET id = @num := (@num+1); ALTER TABLE '.$this->table_name.' AUTO_INCREMENT =1 '; $this->mysqli->query($query); } } ?> A pak: $item = new Item(); if(isset($_REQUEST['delete'])){ $item->delete($_REQUEST['id']); header('Refresh: 0; index.php'); } Odstranění záznamu delete($id); funguje, ale setCounterDb(); už z nějakého důvodu nefunguje/nedělá co má.
|
||
Radek9 Profil |
#8 · Zasláno: 10. 7. 2016, 13:59:53
houbín:
Protože cpeš víc SQL příkazů do jednoho volání query . To ti MySQLi nevezme. Musíš je rozdělit do třech volání. Doporučuji používat $this->mysqli->error . ;-)
|
||
juriad Profil |
#9 · Zasláno: 10. 7. 2016, 14:02:44
houbín:
Nikdy neměň záznamům ID! Autům se nemění SPZ jakmile je jedno vyřazeno z evidence; stejně tak se lidem nemění rodné číslo, jakmile někdo umře. ID je navěky neměnné. Některé časteji řešené dotazy pro MySQL - FAQ » Recyklování primárních klíčů smazaných záznamů A nefunguje to proto, že mysqli umí spustit jen jeden příkaz a nikoli 3 najednou. |
||
houbín Profil |
Radek9, juriad:
aha, no chybami se člověk učí :) ... díky moc juriad: „Nikdy neměň záznamům ID“ Jedná se o takovou blbost, jde o seznam položek, které se dají mazat a přesouvat nahoru/dolů. Na id tedy tolik nezáleží, chtěl jsem ho mít pokaždé pěkně poskládané od 1 do n. V nějaké jiné aplikaci bych to samozřejmě nedělal, ale pokud je to špatně kdykoli, tak se tomu vyvaruji i zde. |
||
Radek9 Profil |
houbín:
Tak nějak jsem si to myslel. Ale v tom případě ten sloupec přejmenuj na order a přidej normální unikátní a neměnné ID. Nicméně ale asi nepotřebuješ přegenerovávat všechny hodnoty. Při mazání tam holt bude mezera, při přidávání se přidá o jedno větší než poslední a při výměně dvou řádků jim jen hodnoty prohodíš. |
||
Časová prodleva: 9 let
|
0