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
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
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
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
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
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íš.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0