Autor | Zpráva | ||
---|---|---|---|
RastyAmateur Profil |
Dobrý den,
abych mohl používat databázi uvnitř třídy, v konstruktoru si ji přiřadím do proměnné <?php class Abc { private $mysqli; public function __construct($mysqli) { $this->mysqli = $mysqli; } } Poté ukládám nově vytvořenou instanci objektu do sessions <?php session_start(); // inicializace $mysqli $_SESSION["project"] = new Abc($mysqli); Ovšem když volám pomocí ajaxu jiný soubor, kam opět nahraju tu třídu ( require "classes/project.class.php"; ) a volám metodu, ve které se právě databáze využívá ($_SESSION["project"]->method(); ), tak to nefunguje. Hlásí to chybu mysqli::real_escape_string()(i jiné funkce): Couldn't fetch mysqli
Stačí to takto obecně, nebo sem mám nakopírovat konkrétní kódy? Děkuji :-) |
||
Alphard Profil |
#2 · Zasláno: 9. 9. 2016, 20:57:12
RastyAmateur:
„Stačí to takto obecně, nebo sem mám nakopírovat konkrétní kódy?“ Stačí, v $mysqli je pouze reference připojení k databázi, to takhle uložit nelze. Po obnovení nemůže být validní. Jestli s tím chceš pracovat takhle, musel bys aktualizovat referenci na aktuální připojení. Ale lepší bude změnit návrh tak, aby se ukládala pouze nějaká datová entita a připojení k databázi si držela nějaká služba (která se vždy vytvoří znovu). |
||
RastyAmateur Profil |
#3 · Zasláno: 9. 9. 2016, 21:01:43
Alphard:
„Jestli s tím chceš pracovat takhle, musel bys aktualizovat referenci na aktuální připojení.“ Pokud to chápu, tak to znamená vytvořit metodu, která obnoví tu instanci $mysqli (následovně) public function updateMysqli($mysqli) { $this->mysqli = $mysqli; } „Ale lepší bude změnit návrh tak, aby se ukládala pouze nějaká datová entita a připojení k databázi si držela nějaká služba (která se vždy vytvoří znovu).“ Mohl by jsi Tvé řešení nějak rozvést, nebo uvést konkrétní ukázku? Nevím, co si pod tím představit... |
||
juriad Profil |
#4 · Zasláno: 9. 9. 2016, 21:08:09
session_start:
„When session_start() is called or when a session auto starts, PHP will call the open and read session save handlers. These will either be a built-in save handler provided by default or by PHP extensions (such as SQLite or Memcached); or can be custom handler as defined by session_set_save_handler(). The read callback will retrieve any existing session data (stored in a special serialized format) and will be unserialized and used to automatically populate the $_SESSION superglobal when the read callback returns the saved session data back to PHP session handling.“ Takže session se při ukončení skriptu někam uloží (serializovaná) a při zavolání session_start se deserializuje. Připojení k databázi nepřežije serializaci (rozmysli si, jak bys ukládal připojení k databázi třeba do souboru, tak abys ho později mohl obnovit; asi uložit přihlašovací údaje? To by nebylo moc rozumné.) |
||
Alphard Profil |
#5 · Zasláno: 9. 9. 2016, 21:18:52
RastyAmateur:
„a tuto metodu volat na prvním místě v každém "novém" dokumentu.“ Asi tak. „Mohl by jsi Tvé řešení nějak rozvést, nebo uvést konkrétní ukázku?“ Jestli chceš mít v session třeba instanci uživatele, tak ten objekt bude obsahovat pouze informace o uživateli class User { private $id; private $name; private $age; private $group; } a připojení k databázi bude držet nějaká služba, která bude uživatele spravovat class UserService { private $dbConn; public function saveUser(User $user) { } } |
||
RastyAmateur Profil |
#6 · Zasláno: 9. 9. 2016, 21:25:47
juriad:
Děkuji za reakci Alphard: Děkuji za pomoc, využiji první řešení, jelikož se mi zdá v mé situaci jako výhodnější a především rychlejší na vytvoření :-) |
||
Časová prodleva: 8 let
|
0