IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

Diskuze: jak volat data z DB Objektově

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Radek Morris Sedláček:21.12.2020 20:46

Nejsem programátor a nemám to do školy!
Snažím se z načtených dat z DB poslat data do html. Jedná se o náhodně načtený citát i s autorem.
Současně bych rád požádal někoho šikovného o úpravu třídy tak aby při načtení HTML entit byly správně změněny na znaky a bylo to bezpečné. Na stránky se nevytváří žádné administrátorské prostředí ani logování. Nejde mi jen o html značky ale i o matematické symboly včetně jazyka MathML

příklad:

// mezery jsou úmyslně kvůli čitelnosti zde

< H1 > Nadpis > ⁄ H1 >
< P > TEXT > ⁄ P >

Výsledek:

<H1>NADPIS</H1>
<P>TEXT</P>

Hlavní cíl je zachovat čistotu obou kódů.
Předem děkuji za Váš čas a ochotu.
Radek

Zkusil jsem: Vytvořil jsem tuto třídu Database (PDO) a Citat
Níže uvedený kód je funkční, ale neplní to co požaduji. Nechci do PHP psát HTML pro správné zobrazení.
database.clas­s.php

<?php

class Database {
    private $servername;
    private $username;
    private $password;
    private $dbname;
    private $charset;

    public function connect() {
        $this->servername = "localhost";
        $this->username = "root";
        $this->password = "";
        $this->dbname = "grizzly";
        $this->charset = "utf8mb4";

        try {
            $dsn = "mysql:host=".$this->servername.";dbname=".$this->dbname.";charset=".$this->charset;
            $pdo = new PDO($dsn, $this->username, $this->password);
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $pdo;
        } catch (PDOException $e) {
            echo "Connection failed: ".$e->getMessage();
        }
    }
}

citat.class.php

<?php

class Citat extends Database {

    public function getCitat() {

        // sloupce v DB jsou ID_citat, citat_autor, citat
        $sql = "SELECT citat, citat_autor FROM citaty ORDER BY Rand() LIMIT 1";
        $stmt = $this->connect()->query($sql);
        while($row = $stmt->fetch()) {
            echo $row['citat'] . '<br>' . $row['citat_autor']; //funguje načte a zobrazí citát i autora
        }
    }
}

index.php

<?php
    include 'includes/autoloader.inc.php';
?>

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>

<?php
    $citatObj = new Citat();
    $citatObj->getCitat(); //vypíše citát a funguje
?>

</body>
</html>

Chci docílit: Načítání dat do HTML jako jednotlivé položky.

<?php

class Citat extends Database {

    public function getCitat() {

        // sloupce v DB jsou ID_citat, citat_autor, citat
        $sql = "SELECT citat, citat_autor FROM citaty ORDER BY Rand() LIMIT 1";
        $stmt = $this->connect()->query($sql);
        while($row = $stmt->fetch()) {
            $citat = $row['citat'];
            $citat_autor = $row['citat_autor'];
            return $citat;
            return $citat_autor;
        }
    }
}

HTML

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>

            <div class="cite">
                <div class="mount-cite">
                    <h2>Citát dne</h2>
                    <p>&bdquo;<?php $citatObj = new Citat(); $citatObj->getCitat('citat');?>&ldquo;</p>
                    <p class="right-cite"><cite><strong>&mdash;&nbsp;<?php $citatObj = new Citat(); $citatObj->getCitat('citat_autor');?></cite></strong></p>
                </div>
            </div>

NEBO

            <div class="cite">
                <div class="mount-cite">
                    <h2>Citát dne</h2>
                    <p>&bdquo;<?= $row['citat'] ?>&ldquo;</p>
                    <p class="right-cite"><cite><strong>&mdash;&nbsp;<?= $row['citat_autor']; ?></cite></strong></p>
                </div>
            </div>


</body>
</html>

Všechny pokusy končí chybou, pokud to napíšu jen procedurálně OK ale s třídou a metodami mam problém nevím jak proměnou vydolovat dle mých představ. Nechci do PHP psát HTML kód ani obráceně.

Editováno 21.12.2020 20:49
Odpovědět
21.12.2020 20:46
Při dotazování se povzneste nad pocit, že můžete působit dojmem nejhloupějšího člověka v místnosti. [Jack Welch]
Avatar
Radek Morris Sedláček:21.12.2020 21:18

Omlouvám se za prohozené tagy správně je to zde.

<p class="right-cite"><cite><strong>&mdash;&nbsp;<?= $row['citat_autor']; ?></strong></cite></p>

Také se chci zeptat zda správně ukončuji spojení s DB

<?php

class Citat extends Database {

    public function getCitat() {

        // sloupce v DB jsou ID_citat, citat_autor, citat
        $sql = "SELECT citat, citat_autor FROM citaty ORDER BY Rand() LIMIT 1";
        $stmt = $this->connect()->query($sql);
        while($row = $stmt->fetch()) {
            echo $row['citat'] . '<br>' . $row['citat_autor']; //funguje načte a zobrazí citát i autora
        }

        $this->connect = null;
    }
}
Nahoru Odpovědět
21.12.2020 21:18
Při dotazování se povzneste nad pocit, že můžete působit dojmem nejhloupějšího člověka v místnosti. [Jack Welch]
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.12.2020 22:28
google = php encode html entities
google = php decode html entities

php.net/htmlentities
htmlentities
htmlspecialchars
htmlspecialchars_decode
html_entity_decode

google = php encode html mathml
https://annevankesteren.nl/…r-references

 
Nahoru Odpovědět
21.12.2020 22:28
Avatar
kaskader202
Člen
Avatar
kaskader202:8.1.2023 21:15

Návrh bych takovéto řešení.

  • Upravil jsem třídu Database, aby oddělilo přihlašování a nastavení spojení od samotného volání sql
  • Vytvořil jsem třídu Citat která obsahuje všechna data co se vrací z DB. Navíc má funkci která vrací data již v dekodovaná
  • Upravil jsem původní třídu Citat na CitatRepository aby bylo jasné že se odsud berou data
  • Upravil jsem index.php aby to odráželo nový kod
  • Uzavírat spojení není třeba podk není nastaveno jinak tak se ukončí na konci běhu scriptu

Database.php

<?php

class Database {
    private $servername;
    private $username;
    private $password;
    private $dbname;
    private $charset;

    private $pdo = null;

    private function createPDOConnection() {
        $this->servername = "localhost";
        $this->username = "root";
        $this->password = "";
        $this->dbname = "grizzly";
        $this->charset = "utf8mb4";
        $dsn = "mysql:host=".$this->servername.";dbname=".$this->dbname.";charset=".$this->charset;
        $pdo = new PDO($dsn, $this->username, $this->password);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo = $pdo;
    }

    protected function execSingleResultQuery($sql)
    {
        try {
            if ($this->pdo === null) {
                $this->createPDOConnection(); // pokud by se v běhu kodu volalo více sql tak se bude využívat jedno připojení a nebude se zbytečně otvírat nové.
            }
            $statement = $this->pdo->prepare($sql);
            $statement->execute();
            return $statement->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            echo "Connection failed: " . $e->getMessage(); // echal bych jí vyletět až uplně nehoru ale to záleží no
            die();
        }
    }
}

Citat.php

<?php

class Citat
{
    private $citat;
    private $autor;

    public function __construct($citat, $autor)
    {
        $this->citat = $citat;
        $this->autor = $autor;
    }

    public function getCitatHtmlDecoded()
    {
        return html_entity_decode($this->citat);
    }

    public function getAutor()
    {
        return $this->autor;
    }

}

CitatRepository.php

<?php

class CitatRepository extends Database {

    public function getCitat() {

        // sloupce v DB jsou ID_citat, citat_autor, citat
        $sql = "SELECT citat, citat_autor FROM citaty ORDER BY Rand() LIMIT 1";
        $result = $this->execSingleResultQuery($sql);
        if ($result === false || $result === []) {
            return new Citat('', ''); // chtělo by to vymyslel lepší řešení když nic nejdeme, ale pro ukázku to stačí
        }
        return new Citat($result['citat'], $result['citat_autor']);
    }
}

index.php

<?php
require_once('includes/autoloader.inc.php');
$repository = new CitatRepository();
$citat = $repository->getCitat();
?>
<!DOCTYPE html>
<html lang="cs">
<head>
    <title></title>
</head>
<body>

<div class="cite">
    <div class="mount-cite">
        <h2>Citát dne</h2>
        <p>&bdquo;<?= $citat->getCitatHtmlDecoded() ?>&ldquo;</p>
        <p class="right-cite"><cite><strong>&mdash;&nbsp;<?= $citat->getAutor() ?></strong></cite></p>
    </div>
</div>

</body>
</html>
Editováno 8.1.2023 21:16
 
Nahoru Odpovědět
8.1.2023 21:15
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 4 zpráv z 4.