Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Neaktivní uživatel:21.11.2014 18:36

Ahojte, mám otázku.
Spravil som si funkciu na pripojenie k databázi:

public function __construct() {
      try {
            $this->conn = new PDO("mysql:host=$this->host;dbname=$this->db", $this->name, $this->pass);
      } catch (PDOException $e) {
            echo $e->getMessage();
   }
}

Ďalej funkciu, ktorá má z databázy vypísať číslo:

public function fetchNumDouble($table, $param, $value, $param1, $value1) {
        $query = 'SELECT COUNT(*) AS num FROM :table WHERE :param = :value AND :param1 = :value1';
        $make = $this->conn->prepare($query);
        $make->bindParam(':table', $table);
        $make->bindParam(':param', $param);
        $make->bindParam(':value', $value);
        $make->bindParam(':value1', $value1);
        $make->bindParam(':param1', $param1);
        $make->execute();
        $this->result = $make->fetchColumn();
    }

Túto funkciu potom volám v inom súbore aby sa vykonala. Problém nastáva pri výpise. Vypíše sa mi toto namiesto čísla:

object(Fetch)#1 (6) { ["result"]=> bool(false) ["host":protected]=> string(9) "localhost" ["db":protected]=> string(5) "xxx" ["name":protected]=> string(4) "xxx" ["pass":protected]=> string(0) "xxx" ["conn":protected]=> object(PDO)#2 (0) { } }

Kde je problém?? Nezlyhá to náhodou ešte pri pripájaní do DB? ak hej prečo fungujú ostatné funkcie závislé tiež na tomto "pripájacom scripte"?

Dik vopred za odpoveď :)

Odpovědět
21.11.2014 18:36
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):21.11.2014 18:51

Tady spíš vypadá, že máš někde var_dump() nebo print_r().
Jak voláš tu metodu fetchNumDouble()?

Nahoru Odpovědět
21.11.2014 18:51
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:21.11.2014 18:57

Kód kde ju zavolám....

$result = new Fetch();
$result->fetchNumDouble('users', 'name', $nickname, 'active', $active);

výsledok potom vložím do podmienky:

if($result != 0) {
    header('Location: home.php');
}

a to tiež nefunguje, lebo nevypisuje číslo...

// EDIT: var_dump a print_r v tomto prípade nepoužívam (použil som to len na hľadanie chyby)

Editováno 21.11.2014 18:58
Nahoru Odpovědět
21.11.2014 18:57
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):21.11.2014 19:36

Chápu tedy správně, že napíšeš $result->fetchNumDouble(­...) a pak if ($result != 0)?
Pokud jo, tak porovnáváš objekt s číslem. Spíš to tam chce něco jako if ($result->result != 0).

Nahoru Odpovědět
21.11.2014 19:36
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:21.11.2014 19:43

Skúšal som ten $result->result. Teraz zobrazuje vo var_dump len bool(false) ale takisto to nejde.

Nahoru Odpovědět
21.11.2014 19:43
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:21.11.2014 19:57

Já když jsem posledně získával count, tak jsem použil na konci:

$this->result = $make->fetch(PDO::FETCH_ASSOC)['count(*)']
Nahoru Odpovědět
21.11.2014 19:57
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:21.11.2014 20:00

Vo var_dump vypíše NULL aj keď to nula nie je ...

Nahoru Odpovědět
21.11.2014 20:00
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):21.11.2014 20:09

Pokud ta proměnná $result není public, tak to fungovat nebude.
Nevím, jak přesně to v aplikaci máš, ale nějak takto by to fungovat mělo.

class Fetch
{

  public $result;

  public function fetchNumDouble()
  {
     // query dotaz
     $this->result = $make->fetchColumn();
  }

}

$f = new Fetch();
$f->fetchNumDouble(...);

if ($f->result != 0) {
   // OK
}
Nahoru Odpovědět
21.11.2014 20:09
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:21.11.2014 20:17

Dám tu celý zdroják:
trieda Fetch

<?php

class Fetch extends Connection {

    public $result;

    public function fetchNum($table, $param, $value) {
        $query = 'SELECT COUNT(*) AS num FROM :table WHERE :param = :value';
        $make = $this->conn->prepare($query);
        $make->bindParam(':table', $table);
        $make->bindParam(':param', $param);
        $make->bindParam(':value', $value);
        $make->execute();
        $this->result = $make->fetchColumn();
    }

    public function fetchNumDouble($table, $param, $value, $param1, $value1) {
        $query = 'SELECT COUNT(*) AS num FROM :table WHERE :param = :value AND :param1 = :value1';
        $make = $this->conn->prepare($query);
        $make->bindParam(':table', $table);
        $make->bindParam(':param', $param);
        $make->bindParam(':value', $value);
        $make->bindParam(':value1', $value1);
        $make->bindParam(':param1', $param1);
        $make->execute();
        $this->result = $make->fetch(PDO::FETCH_ASSOC)['count(*)'];
    }

    public function select($param, $table, $param1, $value) {
        $query = 'SELECT :param FROM :table WHERE :param1 = :value';
        $make = $this->conn->prepare($query);
        $make->bindParam(':table', $table);
        $make->bindParam(':param', $param);
        $make->bindParam(':value', $value);
        $make->bindParam(':param1', $param1);
        $make->execute();
        $result = $make->fetchColumn();
        return $result;
    }

    public function update($table, $param, $value, $param1, $value1) {
        $query = 'UPDATE :table SET :param = :value WHERE :param1 = :value1';
        $make = $this->conn->prepare($query);
        $make->bindParam(':table', $table);
        $make->bindParam(':param', $param);
        $make->bindParam(':value', $value);
        $make->bindParam(':value1', $value1);
        $make->bindParam(':param1', $param1);
        $make->execute();
    }

    public function register($nick, $pass, $mail, $rday, $active) {
        $query = 'INSERT INTO users (name, pass, mail, rday, active) VALUES (:nick, :pass, :mail, :rday, :active)';
        $make = $this->conn->prepare($query);
        $make->bindParam(':nick', $nick);
        $make->bindParam(':pass', $pass);
        $make->bindParam(':mail', $mail);
        $make->bindParam(':rday', $rday);
        $make->bindParam(':active', $active);
        $make->execute();
    }
}

volanie triedy:

$nickname = $_SESSION['nickname'];
$active = 1;
$result = new Fetch();
$result->fetchNumDouble('users', 'name', $nickname, 'active', $active);
/* --- test --- var_dump($result->result); */

if($result->result != 0) {
    header('Location: home.php');
}

?>

takto to nefunguje.

Editováno 21.11.2014 20:18
Nahoru Odpovědět
21.11.2014 20:17
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):21.11.2014 20:23

Nejsem si jistej, ale můžeš bindovat do query dotazu název tabulky?
Můžeš ještě zkusit v té metodě fetchNumDouble() místo

$this->result = $make->fetch(PDO::FETCH_ASSOC)['count(*)'];

hodit

$this->result = $make->fetch(PDO::FETCH_ASSOC)['num'];
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
21.11.2014 20:23
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:21.11.2014 20:42

No istotne sa pozriem na to bindovanie názvu tabuľky. Na Stacku som našiel niečo takéto. Myslíš, že to môže byť (hlavne z hľadiska zabezpečenia):
"SELECT * FROM {$mytable}" ?
Dnes už sa mi nechce v tom hrabať. :)

Editováno 21.11.2014 20:44
Nahoru Odpovědět
21.11.2014 20:42
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:21.11.2014 20:56

Když to ošetříš přes mysql_real_es­cape_string tak by to z hlediska bezpečnosti tak nějak šlo, ale nemyslím si, že je to ideální řešení.

Nahoru Odpovědět
21.11.2014 20:56
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:21.11.2014 21:06

Nerád by som do toho pchal príkazy typu mysql_xxx :D, takže asi najideálnejšie riešenie bude urobiť pre každú tabuľku zvlášť funkciu.
Aj tak ostatné tabuľky budem riešiť väčšinou cez AJAX.
Každopádne zajtra skúsim, či to pôjde. :D dúfam, že hej. 8|

Nahoru Odpovědět
21.11.2014 21:06
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):21.11.2014 21:07

Pokud ten název tabulky nezadává uživatel, tak je to v poho. Jinak to musíš nějak ošetřit, jak psal Jirka (v PDO by k tomu měla být alternativa PDO::quote()).

Nahoru Odpovědět
21.11.2014 21:07
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:21.11.2014 21:09

Tahle funkce se běžně používá, neříkám ti, že máš používat jinak ovladač mysql(i) :D

Nahoru Odpovědět
21.11.2014 21:09
Neaktivní uživatelský účet
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:22.11.2014 9:20

No názov tabuľky užívateľ zadávať nebude. Bude pevne daný, vidz kód, kde vytváram inštanciu.

Nahoru Odpovědět
22.11.2014 9:20
Neaktivní uživatelský účet
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:22.11.2014 11:49

Dík moc :D Vážne sa nesmú bindovať názvy tabuliek a dokonca ani stĺpcov :) už to funguje.

Nahoru Odpovědět
22.11.2014 11:49
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):22.11.2014 12:21

Nemáš zač a díky za označení, i když to ode mě byl spíš dotaz, taky jsem si nebyl jistý :D

Nahoru Odpovědět
22.11.2014 12:21
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.