Avatar
Vojta Pšenák
Redaktor
Avatar
Vojta Pšenák:

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  ±0 23.3.2014 9:55
Avatar
Odpovídá na Vojta Pšenák
Martin Konečný (pavelco1998):

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
Avatar
TsukiRa
Člen
Avatar
Odpovídá na Vojta Pšenák
TsukiRa:

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
Někdy je lepší zůstat v pondělí v posteli než celý týden ladit pondělní kód.
Avatar
Vojta Pšenák
Redaktor
Avatar
Odpovídá na TsukiRa
Vojta Pšenák:

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
TsukiRa
Člen
Avatar
Odpovídá na Vojta Pšenák
TsukiRa:

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
Někdy je lepší zůstat v pondělí v posteli než celý týden ladit pondělní kód.
Avatar
Vojta Pšenák
Redaktor
Avatar
Odpovídá na TsukiRa
Vojta Pšenák:

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):

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
Avatar
TsukiRa
Člen
Avatar
Odpovídá na Vojta Pšenák
TsukiRa:
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
Někdy je lepší zůstat v pondělí v posteli než celý týden ladit pondělní kód.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Vojta Pšenák
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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.