NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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 – Lekce 7 - Databázový wrapper

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
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
Jan Lupčík:8.7.2015 17:17

http://www.itnetwork.cz/…eni-wrapperu
Pokud něčemu pořádně nerozumíš, vyplatí se koupit si prémiové články.

Odpovědět
8.7.2015 17:17
TruckersMP vývojář
Avatar
Odpovídá na Michal Kuba
Pavol Duroska:24.4.2016 8:54

Mal som rovnaky problem. nastavenie databazy som dal do pola ktole som potom vkladal do funkcie pripoj a mal som opacne host a meno databazy. vid help k __construct pdo . http://php.net/…onstruct.php . ma to byt opacne.

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

aspon mne to pomohlo

 
Odpovědět
24.4.2016 8:54
Avatar
pakos710
Člen
Avatar
pakos710:20.5.2016 18:03

testoval som Vasu funkciu -
public static function pripoj($host, $uzivatel, $heslo, $databaze) {
if (!isset(self::$spo­jeni)) {.....

a pri kazdom nacitani index.php sa vytvara nove spojenie na mysql.... isset() v tomto pripade nefunguje

 
Odpovědět
20.5.2016 18:03
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:18.8.2016 19:58

Ať s tím bojuji jak chci, nedaří se mi web rozchodit a zřejmě se to zasekává někde na metodě pripoj, ale nevím v čem. Háže mi to chybu:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1045] Access denied for user '23oddilbrno'@'le­beda.skaut.cz' (using password: YES)' in /var/www/virtu­al/23oddilbrno/web/www­/modely/Db.php:22 Stack trace: #0 /var/www/virtu­al/23oddilbrno/web/www­/modely/Db.php(22): PDO->__construct('mys­ql:host=mysq.­..', 'user', 'pass', Array) #1 /var/www/virtu­al/23oddilbrno/web/www­/index.php(26): Db::pripoj('mys­ql.skauting..­..', 'user', 'pass', 'db_name') #2 {main} thrown in /var/www/virtu­al/23oddilbrno/web/www­/modely/Db.php on line 22

Když v indexu nevolám mysql.skauting.cz ale localhost (dávám prázdné uvozovky), vypíše to zase tuto chybu:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in /var/www/virtu­al/23oddilbrno/web/www­/modely/Db.php:24 Stack trace: #0 /var/www/virtu­al/23oddilbrno/web/www­/modely/Db.php(24): PDO->__construct('mys­ql:host=;dbn.­..', 'user', 'pass', Array) #1 /var/www/virtu­al/23oddilbrno/web/www­/index.php(26): Db::pripoj('', 'user', 'pass', 'db_name') #2 {main} thrown in /var/www/virtu­al/23oddilbrno/web/www­/modely/Db.php on line 24

Pro jistotu přikládám i začátek souboru Db.php, byť je identický:

 private static $spojeni;

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

        // Připojí se k databázi pomocí daných údajů
    public static function pripoj($host, $uzivatel, $heslo, $databaze) {
        if (!isset(self::$spojeni)) {
                self::$spojeni = @new PDO(
                        "mysql:host=$host;dbname=$databaze",
                        $uzivatel,
                        $heslo,
                        self::$nastaveni
                );
        }
}

Díky za každou radu!! :)

 
Odpovědět
18.8.2016 19:58
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:18.8.2016 20:38

A když zadám "localhost" tak to vyhazuje smyčku při přesměrování a web se nenačte.. Může to být potom nějakou chybou .htaccess? Že třeba na straně serveru něco z toho souboru nefunguje?

 
Odpovědět
18.8.2016 20:38
Avatar
Bita Radek
Člen
Avatar
Bita Radek:15.12.2016 8:49

Zdravím, mám problém pokud používám například LIKE nebo WHERE IN. Například:
Správný dotaz má vypadat takto:

SELECT eshop_id FROM products_data WHERE id IN (1,2)

když jsem zapl logování všech sql dotazů, tak sem zjistil že wrapper posílá následující dotaz

SELECT eshop_id FROM products_data WHERE id IN ('1,2')

Ten samý problém nastává u LIKE
Ještě kód dotazu v mém modelu

$imp = implode(",", $this->priceHistoryProductsId);
$eshops = Db::dotazVsechny("SELECT eshop_id FROM products_data WHERE id IN (?)", array($imp));

Jak tomu prosím Vás předejdu ? Děkuji moc za každou radu ! :)

 
Odpovědět
15.12.2016 8:49
Avatar
Kara
Člen
Avatar
Odpovídá na Michal Kuba
Kara:26.8.2017 14:21

Ahoj, podarilo se ti to vyresit??? Mne to hazi uuuplne stejnou chybu, kdyz to pripojim postaru pres $con = mysqli_connec­t...funguje to.....vubec nevim, cim by to mohlo byt.....

 
Odpovědět
26.8.2017 14:21
Avatar
Erik Šťastný:17.7.2018 12:24

Koukám, že databázovou třídu tvoříš jako statickou, v desktopové aplikaci může nastat problém s přístupem z více threadů. Php je singlethread nebo jak funguje to, že bude více requestů zároveň na stejný dotaz (od více uživatelů)?

 
Odpovědět
17.7.2018 12:24
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:7.7.2019 20:12

Zaujímavá možnosť je pridať viac parametrov do dotazu, bud zastupnym znakom "?", alebo ":text"

public function vratClanky_vztahy($Usera,$Userb,$Userc,$Userd)
        {
                return Db::dotazVsechny('

SELECT Usera,Userb,Accepted FROM vztahy WHERE (Usera=? AND Userb!=? AND Accepted=1) OR (Userb=? AND Usera!=? AND Accepted=1)

                ', array($Usera,$Userb,$Userc,$Userd));
        }

potom som sa poupravil metóda dotazVsechny(), s bindParam() to funguje:

public static function dotazVsechny($dotaz, $parametry = array()) {
               $navrat = self::$spojeni->prepare($dotaz);

              for ($i = 0; $i < count($parametry); $i++)
               $navrat->bindParam($i+1, $parametry[$i]);

               $navrat->execute();
               return $navrat->fetchAll();
       }

Je to kratší zápis, ale menej prehľadný, oveľa jasnejší je zápis s pomenovaným zástupným znakom ":text"

public function vratClanky_vztahy($Usera,$Userb,$Userc,$Userd)
        {
                return Db::dotazVsechny('

SELECT Usera,Userb,Accepted FROM vztahy WHERE (Usera=:Usera AND Userb!=:Userb AND Accepted=1) OR (Userb=:Userc AND Usera!=:Userd AND Accepted=1)

                ', array(':Usera'=>$Usera,':Userb'=>$Userb,':Userc'=>$Userc,':Userd'=>$Userd));
        }

a potom metóda dotazVsechny() ostane bez zmeny :

public static function dotazVsechny($dotaz, $parametry = array()) {
             $navrat = self::$spojeni->prepare($dotaz);


             $navrat->execute($parametry);
             return $navrat->fetchAll();
     }

Poznamka: Nemôžeme vkladať jeden parameter na viac miest v dotaze, preto to Userc, Userd...

Odpovědět
7.7.2019 20:12
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Pavel Polívka:29.9.2023 9:37

Ve větě "Kód vychází z článku PDO objektově a modulárně nefungje odkaz

 
Odpovědět
29.9.2023 9:37
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 10 zpráv z 41.