| 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: 10 let
|
|||
0