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

Člen

Zobrazeno 12 zpráv z 12.
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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`");
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 :-/
Aha 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?
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.
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ľ...
Ď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
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
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ť?
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šší.
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.
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.
Zobrazeno 12 zpráv z 12.