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: Zaciatocnicka pomoc s pdo

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

Aktivity
Avatar
Lava
Člen
Avatar
Lava:16.9.2018 23:26

Nenatiahne mi premennu zo suboru do suboru

Zkusil jsem: Skusal som pouzit zazracne slovicko global $db

Chci docílit: Mam subor config.php a potom este iny subor. Trebars article.php. v config.php mam hlavny pdo connection na databazu. To mi ide. A potrebujem sa cez tento connection pripajat na databazu a posielat queries v subore article.php. article.php je includovany v config.php, takze $db by malo byt dostupne aj tam. Ibaze je null. Neviem preco

Odpovědět
16.9.2018 23:26
Aspartám, sacharín, to je môj vitamín
Avatar
Odpovídá na Lava
Martin Konečný (pavelco1998):16.9.2018 23:46

Ahoj, nemělo by to být spíš opačně? Že si do articles.php vložíš config.php, kde máš různá nastavení aplikace?
Tzn. v config budeš mít nějaká všeobecná nastavení

<?php

header("content-type: text/html; charset=UTF-8");

const DEBUG = TRUE;

$db = new PDO(...);
$language = "sk";
// atd.

A v articles.php pak konkrétní stránku, tedy nějakou práci s články.

<?php

require_once "config.php";

$articles = $db->query("SELECT * FROM `article`");
Nahoru Odpovědět
16.9.2018 23:46
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Lava
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Lava:17.9.2018 0:58

Jj, z praktickeho hladiska asi ano, to teraz neriesim, nakolko ide o prerabanie jedneho stredovekeho systemu... V kazdom pripade bude asi problem niekde inde. Skusal som to teraz s mysqli a taktiez nejde. Premenna $db proste nie je v article.php dostupna :-/

Nahoru Odpovědět
17.9.2018 0:58
Aspartám, sacharín, to je môj vitamín
Avatar
Odpovídá na Lava
Martin Konečný (pavelco1998):17.9.2018 1:24

Aha :D Zkoušel jsem to aktuálně takhle:

config.php

<?php

$db = new PDO("mysql:host=localhost;dbname=misa", "root");

include "articles.php";

articles.php

<?php

var_dump($db);

A vypisuje mi to správně "object(PDO)". Jak prosím vypadá tvůj kus kódu, že to vypisuje NULL?

Nahoru Odpovědět
17.9.2018 1:24
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.9.2018 10:58

Tu strukturu includu bys mel mit asi takovouto:

stranka.php <- function.php <- config.php (jakoze config includujes do function a function includujes do stranka)
stranka.php <- pdo.php ( a navic do stranka pridavas sql funkce, protoze budes pracovat s sql)

nebo

stranka.php <- config.php
stranka.php <- function.php
stranka.php <- pdo.php

stranka.php <- config.php
stranka.php <- pdo.php
stranka.php <- function.php

Pdo ma nejakou class, ktera resi jen sql dotazy.
Function jsou obecne funkce.
Config je neco jako textovy soubor, ktery pouzivaji classy a funkce. Pripadne mas nejakou funkci init, ktera ten config zpracuje a pripojuje se k db a pod.

Do articles php bys pdo vubec nemel zanaset. Tam bys mel pracovat se svou pomocnou classou na pdo.

$pole = $SQL->query("...")

Az ta class ti vola pdo, resi connect, disconnect a pod.
Proc? Zitra se rozhodnes, ze uz nechces pdo. A ze pujdes do oracle nebo mssql. A ted bys musel prepisovat vsechny takove articles.php. Proto je lepsi mit na sql vlastni class, funkce.

 
Nahoru Odpovědět
17.9.2018 10:58
Avatar
Lava
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Lava:17.9.2018 21:04

Toto funguje aj mne. Zistil som, kde je problém... Nie v include, problém je ten, že v article.php to PDO volám vrámci triedy a metódy. Preto to nejde... čo s tým, je otázne?

config.php:
$db = new PDO("mysql:host=localhost;dbname=arcticms", "root");

article.php

var_dump($db);exit; // tu je to dobre
class Article {
        public function getArticle($id) {
                var_dump($db);exit; // NULL
        }
}

Potrebujem dajako dosiahnuť, aby to pripojenie na PDO bolo dostupné odvšadiaľ...

Nahoru Odpovědět
17.9.2018 21:04
Aspartám, sacharín, to je môj vitamín
Avatar
Lava
Člen
Avatar
Odpovídá na Peter Mlich
Lava:17.9.2018 21:06

Ďakujem veľmi pekne za ozrejmenie veci, ktoré už dávno viem. Ako som uviedol vyššie, ja riešim systém z roku 2002, ktorý používa aktuálne mysql_pconnect a podobné už mrtve funkcie. Na PHP 7 mi vobec ani nenabehne appka, lebo tieto veci sú už dávno z PHPčka preč. Ako prvé chcem poriešiť taký základ ako pripojenie a prácu s databázou, potom budem riešiťvšetky šturktúry a MVC a pod... teraz ma to nezaujíma

Nahoru Odpovědět
17.9.2018 21:06
Aspartám, sacharín, to je môj vitamín
Avatar
Odpovídá na Lava
Martin Konečný (pavelco1998):17.9.2018 21:09

Nejvíc vhodné řešení je té třídě Article tu proměnnou $db přidat přes konstruktor. Tzn.

<?php

class Article
{

        private $db;

        public function __construct($db)
        {
                $this->db = $db;
        }


        public function getArticle($id)
        {
                return $this->db->query("SELECT ...");
        }

}

$article = new Article($db);

Nevím, jak vypadá ta třída, ale v konstruktoru snad místo pro DB mít bude :D

Nahoru Odpovědět
17.9.2018 21:09
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Lava
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Lava:17.9.2018 21:14

Jasne, že bude, len neviem, či je toto vhodný spôsob, ako to riešiť... resp dajme tomu, že kopec podobných tried ako article bude použitých v appke. Do všetkých constructorov to teda musím pridávať?

Nahoru Odpovědět
17.9.2018 21:14
Aspartám, sacharín, to je môj vitamín
Avatar
Odpovídá na Lava
Martin Konečný (pavelco1998):17.9.2018 21:20

Tak je to správné řešení z hlediska OOP. Jiná varianta je tu práci zabalit do jakési statické třídy typu

<?php

class Db
{

        private static $pdo;

        public static function connect($data)
        {
                self::$pdo = new PDO($data);
        }


        public static function query($query)
        {
                return self::$pdo->query($query);
        }

}


class Article
{

        public function getArticle($id)
        {
                return Db::query("SELECT ...");
        }

}

Ale toto není zrovna hezký způsob řešení, byť by asi byl o něco jednodušší.

Nahoru Odpovědět
17.9.2018 21:20
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18.9.2018 8:48

No, a to jsem presne rikal :)
Hlavne si tim zjednodusis praci, kdyz ti tva trida vrati presne definovane vysledky a nespolehas se na jakesi random struktury. Mysleno, jakoze v kazde takove funkci vola treba pro stejnou vec jine funkce z toho sql.
Vim, zda se to mozna pracnejsi, ale pak se muzes spolehnout na vysledek.

 
Nahoru Odpovědět
18.9.2018 8:48
Avatar
Lava
Člen
Avatar
Lava:18.9.2018 18:23

Problem je, ze premenna db neni dostupna ani v constructore danej triedy. Za class Daco{} proste $db neexistuje... :-( najlepsie asi reda urobit classu na Db a vsetky db queries riesit teda asi cez to. Kazda classa tym padom bude mat hire use DB (to bude asi model?) A takto by to mohlo byt. Nesom s tym sice spokojny, ale co ine sa da robit.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.9.2018 18:23
Aspartám, sacharín, to je môj vitamín
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 12 zpráv z 12.