Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
discount week 80
Avatar
Vojta Pšenák
Redaktor
Avatar
Vojta Pšenák:23.3.2014 9:55

Ahoj, ačkoliv dělám objektovou aplikaci, půjčil jsem si Sdracovo wrapper ze seriálu NERS. Nehází žádnou chybu, jenže ani výsledek :(
V class Head mám:

public function title()
        {
                $vysledek = Databaze::queryOne('
                SELECT *
                        FROM stranky
                        WHERE id=?
        ', array($id));
        echo $vysledek['title'];
        }
        public function nadpis()
        {
                $vysledek = Databaze::queryOne('
                SELECT *
                FROM stranky
                WHERE id=?
        ', array($id));
        echo $vysledek['nadpis'];
        }
        public function text()
        {
                $vysledek = Databaze::queryOne('
                SELECT *
                FROM stranky
                WHERE id=?
        ', array($id));
        echo $vysledek['text'];
        }

V databaze.php potom:

<?php
class Databaze
{
        /**
         * @var PDO Databázové spojení
         */
        private static $connection;

        /**
         * @var array Výchozí nastavení ovladače
         */
        private static $options = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                PDO::ATTR_EMULATE_PREPARES => false,
        );

        /**
         * Připojí se k databázi pomocí daných údajů
         * @param string $host Název hostitele
         * @param string $database Název databáze
         * @param string $user Uživatelské jméno
         * @param string $password Heslo
         */
        public static function pripoj($host, $database, $user, $password)
        {
                if (!isset(self::$connection)) {
                        $dsn = "mysql:host=$host;dbname=$database";
                        self::$connection = new PDO($dsn, $user, $password, self::$options);
                }
        }

        /**
         * Spustí dotaz a vrátí PDO statement
         * @param array $params Pole, kde je prvním prvkem dotaz a dalšími jsou parametry
         * @return \PDOStatement PDO statement
         */
        private static function executeStatement($params)
        {
                $query = array_shift($params);
                $statement = self::$connection->prepare($query);
                $statement->execute($params);
                return $statement;
        }

        /**
         * Spustí dotaz a vrátí počet ovlivněných řádků. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return int Počet ovlivněných řádků
         */
        public static function query($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->rowCount();
        }

        /**
         * Spustí dotaz a vrátí z něj první sloupec prvního řádku. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Hodnota prvního sloupce z prvního řádku
         */
        public static function querySingle($query) {
                $statement = self::executeStatement(func_get_args());
                $data = $statement->fetch();
                return $data[0];
        }

        /**
         * Spustí dotaz a vrátí z něj první řádek. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Pole výsledků nebo false při neúspěchu
         */
        public static function queryOne($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->fetch(PDO::FETCH_ASSOC);
        }

        /**
         * Spustí dotaz a vrátí všechny jeho řádky jako pole asociativních polí. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Pole řádků enbo false při neúspěchu
         */
        public static function queryAll($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->fetchAll(PDO::FETCH_ASSOC);
        }

        /**
         * Umožňuje snadné vložení záznamu do databáze pomocí asociativního pole
         * @param string $table Název tabulky
         * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
         * @return int Počet ovlivněných řádků
         */
        public static function insert($table, $data) {
                $keys = array_keys($data);
                self::checkIdentifiers(array($table) + $keys);
                $query = "
                        INSERT INTO `$table` (`" . implode('`, `', $keys) . "`)
                        VALUES (" . str_repeat('?,', count($data) - 1) . "?)
                ";
                $params = array_merge(array($query), array_values($data));
                $statement = self::executeStatement($params);
                return $statement->rowCount();
        }

        /**
         * Umožňuje snadnou modifikaci záznamu v databázi pomocí asociativního pole
         * @param string $table Název tabulky
         * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
         * @param string $condition Řetězec s SQL podmínkou (WHERE)
         * @return mixed
         */
        public static function update($table, $data, $condition) {
                $keys = array_keys($data);
                self::checkIdentifiers(array($table) + $keys);
                $query = "
                        UPDATE `$table` SET `".
                        implode('` = ?, `', array_keys($data)) . "` = ?
                        $condition
                ";
                $params = array_merge(array($query), array_values($data), array_slice(func_get_args(), 3));
                $statement = self::executeStatement($params);
                return $statement->rowCount();
        }

        /**
         * Vrátí poslední ID posledního záznamu vloženého pomocí INSERT
         * @return mixed Id posledního záznamu
         */
        public static function getLastId()
        {
                return self::$connection->lastInsertId();
        }

        /**
         * Ošetří string proti SQL injekci
         * @param string $string Řetězec
         * @return mixed Ošetřený řetězec
         */
        public static function quote($string)
        {
                return self::$connection->quote($string);
        }

        /**
         * Zkontroluje, zda identifikátory odpovídají formátu identifikátorů
         * @param array $identifiers Pole identifikátorů
         * @throws \Exception
         */
        private static function checkIdentifiers($identifiers)
        {
                foreach ($identifiers as $identifier)
                {
                        if (!preg_match('/^[a-zA-Z0-9\_\-]+$/u', $identifier))
                                throw new Exception('Dangerous identifier in SQL query');
                }
        }
}
Databaze::pripoj("host", "databaze", "user", "*******");

Nevíte někdo, co mám špatně? Moc díky
Myslel jsem, že OOP je mnohem jednodušší, ale začínám se přesvědčovat o opaku...

Editováno 23.3.2014 12:39
 
Odpovědět
23.3.2014 9:55
Avatar
Odpovídá na Vojta Pšenák
Martin Konečný (pavelco1998):23.3.2014 10:23

Nezakládal jsi i včera něco takového? Máš autoloader? Případně vkládáš soubor databaze.php někam do indexu před souborem head.php (kde bys měl mít třídu Head)?

Nahoru Odpovědět
23.3.2014 10:23
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar

Člen
Avatar
Odpovídá na Vojta Pšenák
:23.3.2014 10:38

Máš vůbec něco v té databázi?? Voláš někde ty funkce title, nadpis a text?

Projdi si tutoriály PHP a Databáze v PHP, které tu jsou.

 
Nahoru Odpovědět
23.3.2014 10:38
Avatar
Vojta Pšenák
Redaktor
Avatar
Odpovídá na
Vojta Pšenák:23.3.2014 10:44

Volám, v databázi všechno mám, tutoriály jsem si prošel a divím se, že to nefunguje, protože by to fungovat mělo.

 
Nahoru Odpovědět
23.3.2014 10:44
Avatar

Člen
Avatar
Odpovídá na Vojta Pšenák
:23.3.2014 11:01

No a co bude v té proměnné $id, kterou máš v každé té medodě, odkud se tam vůbec dostane nějaká hodnota?

Zkus přidat na začátek indexu

ini_set('display_errors', '1');
 
Nahoru Odpovědět
23.3.2014 11:01
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Vojta Pšenák
Redaktor
Avatar
Odpovídá na
Vojta Pšenák:23.3.2014 11:57

V index.php mám:

<?php
ini_set('display_errors', '1');
$id = "index";
require_once 'databaze.php';
require_once 'head.php';
$head = new Head($id);
$head->doctype();
?>
<html>
        <head>
                <?php $head->charset();
                $head->css();?>
                <title><?php $head->title();?></title>
        </head>
        <body>
                <h1><?php $head->nadpis(); ?></h1>
                <p><?php $head->text(); ?></p>
        </body>
</html>

Ten ini_set() nic nezměnil.

 
Nahoru Odpovědět
23.3.2014 11:57
Avatar
Odpovídá na Vojta Pšenák
Martin Konečný (pavelco1998):23.3.2014 12:15

Pokud předáš ID objektu $head, pak v těch metodách nepoužívej proměnnou $id (ta by byla jen pro danou metodu), ale $this->id.
Předpokládám, že máš v konstruktoru třídy Head takový kód:

class Head
{

  private $id;

  public function __construct($id)
  {
    $this->id = $id;
  }

...

}

A doporučuji nepřipojovat se k databázi v souboru Databaze.php, ale někde v indexu.

Nahoru Odpovědět
23.3.2014 12:15
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar

Člen
Avatar
Odpovídá na Vojta Pšenák
:23.3.2014 12:19
public function nadpis()
  {
     $vysledek = Databaze::queryOne('
       SELECT *
       FROM stranky
       WHERE id=?
     ', array($id)); // co je v této proměnné $id?
                     // nechtěl jsi spíš $this->id (proměnnou instance)?
      echo $vysledek['nadpis'];
}

pak ještě

function __construct($id) {
  $this->id = $id;
}
Editováno 23.3.2014 12:20
 
Nahoru Odpovědět
23.3.2014 12:19
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Vojta Pšenák
David Čápka:23.3.2014 12:23

Parametry se nepředávají v array. Chlape, přesně kvůli lidem jako ty jsem ten NERS psal, mohl by sis ten tutoriál alespoň udělat, potom bys tohle nenapsal. Má to jen 4 díly, to určitě zvládneš.

BTW posílat heslo na fórum není dobrý nápad.

Editováno 23.3.2014 12:39
Nahoru Odpovědět
23.3.2014 12:23
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
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 9 zpráv z 9.