NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

Diskuze – Lekce 13 - Objektové počítadlo návštěv v PHP - Databáze

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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.

Odpovědět
26.7.2018 10:00
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 =.

Editováno 9.8.2021 14:36
 
Odpovědět
9.8.2021 14:36
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.

 
Odpovědět
12.4.2022 13:08
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.

 
Odpovědět
10.7.2023 18:17
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

 
Odpovědět
22.8.2023 19:34
Avatar
Radim Jankovský:25. dubna 20:17

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

 
Odpovědět
25. dubna 20:17
Avatar
Tano7
Člen
Avatar
Tano7:27. srpna 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();
?>
Odpovědět
27. srpna 4:04
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
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 7 zpráv z 37.