Avatar
Samuel Illo
Redaktor
Avatar
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Odpovídá na Samuel Illo
Martin Konečný (pavelco1998):

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
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Odpovídá na Samuel Illo
Martin Konečný (pavelco1998):

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
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Samuel Illo
Jiří Gracík:

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
Creating websites is awesome till you see the result in another browser ...
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Jiří Gracík
Samuel Illo :

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

Nahoru Odpovědět 21.11.2014 20:00
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Odpovídá na Samuel Illo
Martin Konečný (pavelco1998):

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
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Odpovídá na Samuel Illo
Martin Konečný (pavelco1998):

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 21.11.2014 20:23
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Samuel Illo
Jiří Gracík:

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
Creating websites is awesome till you see the result in another browser ...
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Jiří Gracík
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Odpovídá na Samuel Illo
Martin Konečný (pavelco1998):

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  +1 21.11.2014 21:07
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Samuel Illo
Jiří Gracík:

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

Nahoru Odpovědět  +1 21.11.2014 21:09
Creating websites is awesome till you see the result in another browser ...
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Samuel Illo
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Samuel Illo :

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
www.samuelillo.com; lamka02sk(zavináč)samuelillo.com, www.point.samuelillo.com, www.csgorig.eu
Avatar
Odpovídá na Samuel Illo
Martin Konečný (pavelco1998):

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