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
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
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;
}
a tuto metodu volat na prvním místě v každém "novém" dokumentu.

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
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
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
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í :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: