Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 13. diel - Objektové počítadlo návštev v PHP - dokončenie

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Petr
Člen
Avatar
Petr:26.7.2018 10:00

Ahoj.
rowCount() nejspíš po SELECTu neradno používat vůbec (viz. php.net):
If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.

Tedy v praxi raději pouze pro zjištění počtu řádek ovlivněných příkazy INSERT, UPDATE a DELETE.

Odpovedať
Kdyby zakladatel nebyl arogantni k****, mohl byt ITNetwork fakt ceska oborova socialni sit.
Avatar
Patrik Dlouhý:9.8.2021 14:36

Takovy detail pokud by se s nim nekdo setkal:
Fatal error: Uncaught PDOException: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected in /var/www/html­/projekty/Poci­tadlo/tridy/Da­tabaze.php:32

Byl problem

"mysql:host = $host;dbname = $databaze",

Za dbname pred rovna se ani za rovna se nesmi byt mezera. IDE mi ji tam vlozilo protoze normalne pisi mezery kolem =.

Editované
Avatar
Václav Dostál:12.4.2022 13:08

Tento článek mi pomohl s problémem, který jsem řešil - v podstatě se jedná o výpis řádků z databázové tabulky jen pro určité záznamy (klauzule WHERE). Díky.

Avatar
Radek Linhart:10.7.2023 18:17

Bylo by vhodné doplnit, že si ve složce /tridy vytvoříme nový soubor SpravceNavstev.php a tam umístíme kód nové třídy
SpravceNavstev.

Avatar
Pavel Bališ
Člen
Avatar
Pavel Bališ:22.8.2023 19:34

pořád mi chybí nějaký úvod do databáze, co jsem koukal tak teprve přijde, tato lekce nějak předběhla dobu

Avatar
Radim Jankovský:25. apríla 20:17

Pořád nevím jak nastavit databázi, takže jsem skončil v předchozí lekci.

Avatar
Tano7
Člen
Avatar
Tano7:27. augusta 4:04

**Pocitadlo pristupu funguje perfetne, **jak v localhost /pouzivan XAMPP/ tak Online na serveru.
Zde par tipu, jak na to, treba to nekomu pomuze, snazim se to napsat jednoduse:

A. localhost:

1. Pripojeni:
:http://localhost/…in/index.php
Jmeno: root
Heslo: admin123

// phpMyAdmina na localhost, vyzkoušej po přihlašovacích údajích zapátrat v souboru "config.inc.php" c:\xampp\phpMy­Admin\config.in­c.php

$cfg['Servers'][$i]['user']
$cfg['Servers'][$i]['password']

2. Vytvoreni databaze a tabulky:
SQL dotazy /v horni liste druha zalozka zleva/

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";

CREATE DATABASE IF NOT EXISTS `pocitadlo_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;
USE `pocitadlo_db`;

CREATE TABLE IF NOT EXISTS `zobrazeni` (
  `zobrazeni_id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(40) COLLATE utf8_czech_ci NOT NULL,
  `datum` int(11) NOT NULL,
  PRIMARY KEY (`zobrazeni_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
COMMIT;

"pocitadlo/in­dex.php"
// Heslo je vyzadovano, misto 'root' lze pouzit 'admin'
// Poradi musi byt zachovano:

Databaze::pripoj('localhost', 'root', 'admin123', 'pocitadlo_db');

B. Online
Neomezene vytvoreni MySQL Databází a zadarmo:
:https://www.db4free.net/signup.php
"pocitadlo/in­dex.php"
// Poradi musi byt zachovano:

Databaze::pripoj('server', 'MySQL Jméno', 'MySQL Heslo', 'nazev MySQL Databáze');
Databaze::pripoj('db4free.net', 'mistrsveta', 'tajneHeslo1234', 'pocitadlo_db');

Vytvoreni tabulky v databazi vytvorene v https://www.db4free.net/signup.php
SQL dotazy:
1.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";

2.

CREATE TABLE IF NOT EXISTS `zobrazeni` (
  `zobrazeni_id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(40) COLLATE utf8_czech_ci NOT NULL,
  `datum` int(11) NOT NULL,
  PRIMARY KEY (`zobrazeni_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
COMMIT;

Info: vypise to cervenou hlasku o nepouzitelnosti prikazu "COMMIT;" ale to ignoruj, tabulka se vytvori a ulozi.

Cele kody souborů, vytvorit adresare v korenovem rootu:
tridy/Databaze­.php

<?php
// Nastavení PDO připojení
class Databaze
{
        // /**
        //  * @var PDO Spojení
        //  */
        private static PDO $spojeni;

        // /**
        //  * @var array Nastavení
        //  */
        private static $nastaveni = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // chceme, aby se vyvolaly výjimky v případě, když se něco nepovede
                PDO::ATTR_EMULATE_PREPARES => false, // nechceme emulovat prepared statements pro staré verze MySQL, které je nepodporovaly
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // chceme pracovat pod Unicode kódováním
        );

        // /**
        //  * Připojí se k databázi
        //  * @param string $host Název hosta
        //  * @param string $uzivatel Uživatel
        //  * @param string $heslo Heslo
        //  * @param string $databaze Název databáze
        //  * @return PDO
        //  */
        public static function pripoj(string $host, string $uzivatel, string $heslo, string $databaze): PDO
        {
                if (!isset(self::$spojeni)) {
                        self::$spojeni = @new PDO(
                                "mysql:host=$host;dbname=$databaze",
                                $uzivatel,
                                $heslo,
                                self::$nastaveni
                        );
                }
                return self::$spojeni;
        }

        // /**
        //  * Dotaz pro databázi
        //  * @param string $sql SQL dotaz
        //  * @param array $parametry Parametry
        //  * @return PDOStatement
        //  */
        public static function dotaz(string $sql, array $parametry = array()): PDOStatement
        {
                $dotaz = self::$spojeni->prepare($sql);
                $dotaz->execute($parametry);
                return $dotaz;
        }
}
?>

tridy/Spravce­Navstev.php

<?php
// Nastavení PDO připojení

class SpravceNavstev
{

    public function zapocitej() : void
    {
        Databaze::dotaz('
            INSERT INTO `zobrazeni`
            (`ip`, `datum`)
            VALUES (?, ?)
        ', array($_SERVER['REMOTE_ADDR'], time()));
    }

    public function zobrazeniCelkem() : int
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(*) AS `pocet`
            FROM `zobrazeni`
        ');
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function zobrazeniZa(int $dnu) : int
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(*) AS `pocet`
            FROM `zobrazeni`
            WHERE `datum` > ?
        ', array(time() - $dnu * 86400));
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function uipCelkem() : int
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(DISTINCT `ip`) AS `pocet`
            FROM `zobrazeni`
        ');
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function uipZa(int $dnu) : int
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(DISTINCT `ip`) AS `pocet`
            FROM `zobrazeni`
            WHERE `datum` > ?
        ', array(time() - $dnu * 86400));
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function vypisStatistiky() : void
    {
        echo('<table>');
            echo('<tr>
                <td>Zobrazení celkem</td>
                <td>' . $this->zobrazeniCelkem() . '</td>
            </tr>');
            echo('<tr>
                <td>UIP celkem</td>
                <td>' . $this->uipCelkem() . '</td>
            </tr>');
            echo('<tr>
                <td>Zobrazení měsíc</td>
                <td>' . $this->zobrazeniZa(30) . '</td>
            </tr>');
            echo('<tr>
                <td>UIP mesíc</td>
                <td>' . $this->uipZa(30) . '</td>
            </tr>');
            echo('<tr>
                <td>Zobrazení týden</td>
                <td>' . $this->zobrazeniZa(7) . '</td>
            </tr>');
            echo('<tr>
                <td>UIP týden</td>
                <td>' . $this->uipZa(7) . '</td>
            </tr>');
        echo('</table>');
    }
    }
?>

pocitadlo/index­.php

<h5>Návštěvnost webu:</h5>
<?php
mb_internal_encoding("UTF-8");

function nactiTridu($trida) : void
{
    require("tridy/$trida.php");
}

spl_autoload_register("nactiTridu");
// localhost
// Poradi musi byt zachovano:
Databaze::pripoj('localhost', 'root', 'admin123', 'pocitadlo_db');

// Online
// Poradi musi byt zachovano:
// Databaze::pripoj('server', 'jmeno', 'heslo', 'nazev databaze');
// Databaze::pripoj('db4free.net', ''jmeno'', 'heslo'', 'pocitadlo_db');

// Obsluha správce návštěv
$spravceNavstev = new SpravceNavstev();
$spravceNavstev->zapocitej();
$spravceNavstev->vypisStatistiky();
?>
Odpovedať
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 7 správy z 37.