mapare clasa peste tabela

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

mapare clasa peste tabela

Mesajde vekand » Mar Mai 03, 2016 11:03 am

Salut,
Au mai trecut citeva luni, revin cu o noua problema: am inceput sa-mi fac propriul meu CMS, am si facut primul modul (Tabele HTML), folosesc MVC, toate incursiunile in baza de date le fac cu Ajax si toate afisarile le fac cu Template, dar nu acesta este cel mai important lucru: ideea este ca am adoptat metoda maparii clasei peste tabela (am vazut asta in Java). Pe scurt, cind fac o tabela noua construiesc si clasa corespunzatoare tabelei. In clasa corespunzatoare am mai multe variabile, o variabila contine chiar numele clasei, alta variabila contine numele tabelei, mai am 2 array-uri asociative, unul contine cimpurile din tabela necesare pentru add-modify, celalalt array contine cimpurile din tabela pe care le afisez in tabela HTML (nu intotdeauna cele 2 coincid, ex. cimpul parola din tabela useri nu-l afisez in tabelul HTML dar il folosesc la add-modify). Toate clasele de mapare sint construite dupa acelasi sablon, variabilele de clasa au aceeasi denumire, difera doar valorile de la o clasa la alta. Cind am nevoie sa folosesc o tabela pur si simplu instantiez clasa corespunzatoare si folosesc acest obiect in toata aplicatia, la formulare, la INSERT, la UPDATE sau la SELECT. Formularele de add-modify sint generate cu cod PHP si la construirea lor parcurg cu foreach array-ul addmodify corespunzator din obiect, iar <input>-urile au name="chiar valoarea din array-ul addmodify, adica numele cimpului din tabela". La Submit merg in controler (prelucrari.php) unde construiesc un array JSON cu variabilele POST apoi trimit cu ajax la fisierul model impreuna cu variabila numeclasa. In model (modelinsert.php) parcurg din nou array-ul de addmodify al obiectului si atasez fiecarui element din array valorile corespunzatoare din variabilele POST (transmise prin ajax in format json). Abia apoi fac efectiv INSERT. Asta imi permite sa am un singur fisier de INSERT pentru toate tabelele, totul este parametrizat inclusiv numele tabelei si nu mai este nevoie sa ma uit pe ce tabela lucrez, singura grija este sa transmit variabila cu numele clasei respective si in obiectul respectiv am toate informatiile legate de tabela. La fel procedez la UPDATE sau la SELECT (si aici am cite un singur fisier php), doar ca la SELECT nu mai folosesc array-ul addmodify ci array-yl tabelahtml.
Ce parere aveti de aceasta abordare? Dupa mine exista avantaje si dezavantaje. Avantajele sint evidente, intretinere usoara, posibilitate de parametrizare, integrare rapida in aplicatie a oricarei tabele noi. Dar care ar fi dezavantajele, sint convins ca exista dar inca nu le vad pe toate. Un dezavantaj ar fi ca trimit array-ul cu variabilele POST cu ajax in format JSON, deci este vulnerabil. Alt dezavantaj ar fi ca exista o prea mare dependenta a tabelei fata de clasa corespunzatoare si se preteaza mai bine cind exista putine tabele, dar odata construita clasa acest dezavantaj se transforma in avantaj. Alte dezavantaje? Cum ar fi mai bine sa procedez? Voi aprecia orice parere critica. Multumesc.



nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: mapare clasa peste tabela

Mesajde nevvermind » Mar Mai 10, 2016 2:02 pm

Uau, frate. Poti sa faci un rezumat?

Cred ca vorbesti de un ORM. Unde iti sugerez sa folosesti un 3rd party, nu ceva inventat de tine. Lucrurile specifice CMS-ului tau, fa-le cum stii tu, dar celelalte lucruri - adica probleme obisnuite - lasa-le pe seama unor solutii deja gandite.

Oricum, nu mai scrie atata (si baga spatii intre paragrafe) ca nu stiu cati or sa-ti citeasca posturile, si mai baga si niste cod, sa vedem mai bine despre ce vorbesti.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Mar Mai 10, 2016 6:23 pm

Da, e un fel de ORM facut dupa "reteta" proprie, dar lucrurile obisnuite nu le-am modificat, eu zic ca respect procedurile doar am parametrizat, in rest circuitul firesc al informatiilor este respectat. MVC, ajax, template sint toate la locul lor. Un exemplu de clasa :
<?php
////////////////////////////////////// clasa Ore
$o_anul = $lang['ore']['anul'];
$o_luna = $lang['ore']['luna'];
$o_oreluc = $lang['ore']['oreluc'];
class Ore {
public $vclasa = 'Ore';
public $vtabela = 'ore';
public $vcimpuri = 0;
public $vnumeid = 'ore_id';

public $v = ['a'=>'anul','b'=>'luna','c'=>'oreluc'];
public $vtabel = ['a'=>'anul','b'=>'luna','c'=>'oreluc'];

function __construct(){
GLOBAL $o_anul,$o_luna,$o_oreluc;
$this->v = [$o_anul=>$this->v['a'],$o_luna=>$this->v['b'],$o_oreluc=>$this->v['c']];
$this->vtabel = [$o_anul=>$this->vtabel['a'],$o_luna=>$this->vtabel['b'],$o_oreluc=>$this->vtabel['c']];
}
}
?>

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Mar Mai 10, 2016 6:29 pm

PS: deja am aplicat aceasta strategie si s-a dovedit viabila, adica am o aplicatie care functioneaza exact dupa aceasta idee.

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: mapare clasa peste tabela

Mesajde nevvermind » Mie Mai 11, 2016 12:17 pm

Eu te cred ca tie iti functioneaza, dar nu inseamna ca e bine. Si un ceas stricat "functioneaza" de doua ori pe zi, nu?

a) Nu folosi proprietati publice. Oricine iti va putea schimba starea obiectului, si vei vea probleme. Ascunde cat poti. Inclusiv metodele. Nimeni nu mai foloseste proprietati publice.

b) $GLOBAL? Sper ca era doar ca exemplu, nu? Nu folosesti asa ceva sper.

c) Cam criptice denumirile alea. Vrei sa-mi faci procesul de intelegere mai greu sau ce? Ce tabel mapeaza clasa aia?

La urma urmei, ce vrei sa afli despre metoda ta? Mapper-ele sunt folositoare, da, dar nu cum le-ai facut tu.
Ai un repository ceva?
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Mie Mai 11, 2016 5:44 pm

Multumesc pentru precizari, sint foarte utile pentru mine si voi tine cont de ele, dar oricum inca nu e gata si mai suporta modificari. Scuze ca n-am pus mai multe informatii, mi-am dat seama dupa ce am postat. Reiau exemplul de clasa de mapare (am pus unul mai simplu):
$o_anul = $lang['ore']['anul']; // sint luate din fisierul limba.php - pentru compatibilitate cu alte limbi
$o_luna = $lang['ore']['luna'];
$o_oreluc = $lang['ore']['oreluc'];
class Ore {
public $vclasa = 'Ore'; // numele clasei (il folosesc sa verific obiectul cu care lucrez la un moment dat)
public $vtabela = 'ore'; // numele tabelei (folosit la fisierul modelinsert.php, modelupdate.php,
//modelselect.php - am cite un singur fisier pentru toate tabelele )
public $vnumeid = 'ore_id'; //numele cimpului ID din tabela (sa nu-l mai caut ulterior, dar am nevoie pe parcurs in special la Modify)

public $v = ['a'=>'anul','b'=>'luna','c'=>'oreluc']; // array cu cimpurile folosite in Add/ Modify
public $vtabel = ['a'=>'anul','b'=>'luna','c'=>'oreluc']; // array cu cimpurile folosite in tabela HTML
// in acest caz cele 2 coincid dar de cele mai multe ori nu

function __construct(){
GLOBAL $o_anul,$o_luna,$o_oreluc;
$this->v = [$o_anul=>$this->v['a'],$o_luna=>$this->v['b'],$o_oreluc=>$this->v['c']];
$this->vtabel = [$o_anul=>$this->vtabel['a'],$o_luna=>$this->vtabel['b'],$o_oreluc=>$this->vtabel['c']];
}
}

Mapeaza tabela :
$sql = "CREATE TABLE IF NOT EXISTS `ore`
(`ore_id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `anul` int(5) UNSIGNED NOT NULL,
`luna` int(5) UNSIGNED NOT NULL, `oreluc` int(5) UNSIGNED NOT NULL,
`aredoc` TINYINT(1) UNSIGNED DEFAULT 0,
`userid` INT(11) UNSIGNED NOT NULL, datamod TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
CHARACTER SET utf8 COLLATE utf8_general_ci";

Exemplu de insert (extras din fisierul modelinsert.php);
$re='';
$re .= 'INSERT INTO '.$tabela.' ('; // in cazul nostru tabela ore - $tabela este chiar public $vtabela = 'ore'; din clasa
$i = 0;
foreach ($variabile as $key => $value) { //pentru numele cimpurilor - $variabile este chiar array-ul public $v = ['a'=>'anul','b'=>'luna','c'=>'oreluc']; diin clasa (in toate clasele are aceeasi denumire)
$re .=$value;
if(++$i === $numItems) {
$re .=', userid';
$re .=') VALUES (';
}
else $re .=', ';
}
$i = 0;
$userid =isset($_SESSION['userid']) ? $_SESSION['userid'] : 0;
foreach ($variabile as $key => $value) { //pentru valorile cimpurilor (variabilele POST)
if (isset($_POST[$value])) $value = "'".trim($_POST[$value])."'"; else $value ="''";
$re .=$value;
if(++$i === $numItems) {
$re .=', '.$userid;
$re .=')';
}
else $re .=', ';
}

Pentru mine avantajul este ca nu mai stau sa ma uit dupa tabela cind am de lucru cu ea, pur si simplu ma uit in obiect indiferent unde sint in aplicatie. Ce sa folosesc in loc de $GLOBAL si in loc de PUBLIC (dar sa le vad in toata aplicatia)? Multumesc.

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Mie Mai 11, 2016 6:05 pm

PS: Ce vreau sa aflu? Vreau sa aflu de ce nu e buna metoda mea si care sint dezavantajele. Eu zic ca e buna daca e facuta ca lumea. Aplicatia pe care am facut-o e perfectibila, dar deocamdata se comporta foarte bine (are la baza afisarea datelor in tabele HTML), nu-mi face probleme, nu vad de ce sa n-o folosesc daca o pun la punct, mai ales ca refolosesc mult codul si reduce timpul de intretinere. O tabela noua o integrez in aplicatie in 1 pana la 3 ore (daca fac form separat pentru ea, presupunind ca are cimpuri nu doar text sau numerice). Am omis ceva? Care ar fi dezavantajele? Multumesc.

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: mapare clasa peste tabela

Mesajde nevvermind » Mie Mai 11, 2016 6:17 pm

Foloseste tag-urile forumului pt cod sau pastie.org, rogu-te. Mi-e greu sa urmaresc asa, text simplu.

In primul rand, mapper-ul tau nu te ajuta prea mult. Inca ai o gramada de logica in loc s-o ascunzi in mapper.

Tre sa ajungi sa poti face cam asa:

Cod: Selectaţi tot

(new Ore())->insert(['areora' => isset($_POST['areora']), 'luna' => (int) $_POST['luna'], 'user_id' => $_POST['user_id']]);

(new Ore())->update(...);

(new Ore())->delete($id);


Nimeni nu stie sa comunice cu DB-ul decat adaptorul de conexiune (PDO) si mapper-ele tale. Altfel nu ascunzi complexitatea nicaieri si ele nu-si mai au rostul. Rolul lor este sa ascunda detaliile de implementare. De asta proprietatile sunt cel mult protected, si au doar cateva metode publice.

Vezi Propel si Doctrine ce fel fac. Inca iti recomand sa nu faci un ORM de la zero decat in scopuri pedagogice. Cine sta sa-ti mai invete si sistemul tau de gandire? Asta un inseamna sa nu incerci, app.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: mapare clasa peste tabela

Mesajde nevvermind » Mie Mai 11, 2016 6:19 pm

> Ce sa folosesc in loc de $GLOBAL si in loc de PUBLIC (dar sa le vad in toata aplicatia)?

Nu inteleg. Ce ai nevoie sa vezi in toata aplicatia? Imi miroase a valori globale. Evita-le. Scapa de "globalizare". Aduce numai probleme. Daca orice poate modifica orice de oriunde, vei avea un haos de aplicatie.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Mie Mai 11, 2016 6:39 pm

Eu folosesc pentru conexiune clasa class.pdo_mysqli.php luata de pe site-ul http://www.marplo.net. Ofera conexiune atit mysqli cit si PDO si are metoda prepare(), dar e clar ca mai trebuie sa umblu pe la cod si pe la clasele de mapare. Am inceput sa fac CMS-ul de la zero tocmai ca sa invat, dar treptat caut sa-i dau si o utilitate practica si vreau sa-l dezvolt, acum lucrez la modulul Acces dinamic useri in aplicatie in functie de tipul (rolul) userului, in care setez accesul nu doar in aplicatie ci si la nivel de tabela, buton sau optiune in functie de cerinte, spre exemplu accesul selectiv al userilor in aplicatie mi-a fost cerut chiar de beneficiar. Astea le fac in special pentru mine, pe viitor vom vedea. Multumesc mult, voi studia.

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: mapare clasa peste tabela

Mesajde nevvermind » Mie Mai 11, 2016 6:54 pm

Despre acel ACL pe care-l faci (permisii si roluri): nu asocia tabelele mysql cu permisiile. Domeniul tau de business tre sa stie cat mai putine despre baza de date. Asociaza-le cu resurse abstracte. Iar ce reprezinta acele resurse, vezi tu. O insertie in tabel, o creare de fisier, un buton disabled etc. Din nou, ai o gramada de optiuni: https://packagist.org/search/?q=acl.

La urma urmei, o resursa poate reprezenta o insertie de tabel, dar nu le-as asocia atat de mult.

PS: Pune-ti codul pe bitbucket sau gitlab undeva. Ai mai multe sanse sa primesti sfaturi bune. Chiar si cod. Majoritatea omilor d-aci nu urca fiindca le este jena sau nu stiu. Si raman cu proiectele lor in caverna si, cand e timpul sa primeasca feedback, sunt surprinsi ca arata ca o aplicatie din 2007. Ai inceput bine intreband.

PPS: N-am nimic cu acea clasa a lui MarPlo, dar uite un dezavantaj al invatarii unui sistem obscur sau custom: nu inveti nimic transferabil. Cunoasterea acelei clase nu-ti va folosi la nimic. Cand e timpul sa treci pe un framework/cms mai popular, vei vedea ca foloseste nush-ce Zend_Db_Select sau Doctrine, dar, fiindca tu nu le stii, practic tre sa inveti din nou un alt ORM. Pe parcursul carierei tale, vei vedea ca este preferabil sa inveti X o singura data, si sa-l folosesti de mai multe ori, decat sa-ti risipesti timpul si neuronii cu o clasa pe care nu o vei mai folosi niciodata. De asta te bat la cap cu "nu mai inventa, ia o solutie gata gandita". Multi spun ca nu inveti asa. Nu e 100% corect. Inveti o gramada folosind o librarie bine gandita.

Tu spui ca o faci pt tine, dar ai si un client... Hotaraste-te. De ex, daca ti-ai fi facut CMS-ul folosind componente MVC Symfony sau Laravel, deveneai de 100 de ori mai preferabil altor clienti. Poate si ca o viitoare posibila angajare. Nu mai spun ca ai fi terminat CMS-ul ala in 2-3 miscari.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Joi Mai 12, 2016 8:42 am

Bine ca mi-ai zis de ACL, eu aveam lista de tabele dar acum imi dau seama ca nu e bine deloc. Voi inlocui tabelele cu descrieri, oricum la aplicatia asta accesul userilor va tine de mentenanta, beneficiarul nu mi-a cerut-o ca o componenta, ci doar sa-i fac accesul dupa reguli pe care mi le-a dat iar astea nu se schimba in fiecare zi.
Nu renunt la CMS-ul meu dar voi incepe sa studiez Symfony sau Laravel, eventual sa fac si acolo un CMS ca compar cu ce am facut eu. Probabil voi descoperi mari diferente, dar asta e, nimeni nu se naste invatat, deja consider ca am avansat putin. Cum mi-am dat seama ca stiu ceva mai mult? Simplu, acum nu-mi vine sa ma uit la codul pe care il scriam in urma cu citeva luni (desi acel cod functioneaza si acum), spun ca nu e al meu, as vrea sa-l repar dar cred ca nu e nimic de reparat, trebuie rescris. Numai bine!

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Vin Mai 13, 2016 2:13 pm

PS: am instalat Laravel si voi porni pe asta. Multumesc "nevvermind", e bine sa intrebi un specialist la momentul potrivit. Toate bune!

vekand
Average Member
Mesaje: 83
Membru din: Dum Mai 03, 2015 9:15 am

Re: mapare clasa peste tabela

Mesajde vekand » Lun Mai 23, 2016 11:48 am

Salut nevvermind, am modificat clasele de mapare si le-am imbunatatit putin, am pus PROTECTED la proprietati si metode iar metodele INSERT, UPDATE, DELETE le-am scos din modelinsert.php si le-am inclus in clasa.

Cod: Selectaţi tot

$o_anul = $lang['ore']['anul']; // vine din fisierul language/ro/limba.php
$o_luna = $lang['ore']['luna'];
$o_oreluc = $lang['ore']['oreluc'];
class Ore {
  protected $vclasa = 'Ore'; // numele clasei (il folosesc sa verific obiectul cu care lucrez la un moment dat)
  protected $vtabela = 'ore'; // numele tabelei (folosit la fisierul modelinsert.php, modelupdtae.php,   
                            //modelselect.php - am un singur fisier de inserare)
  //public $vcimpuri = 0;
  protected $vnumeid = 'ore_id'; //numele cimpului ID din tabela (sa nu-l mai caut ulterior)

  protected $v = ['a'=>'anul','b'=>'luna','c'=>'oreluc']; // array cu cimpurile folosite in Add/ Modify
  protected $vtabel = ['a'=>'anul','b'=>'luna','c'=>'oreluc']; // array cu cimpurile folosite in tabela HTML
                                             // in acest cele 2 coincid dar de cele mai multe ori //nu
  function __construct(){   
   GLOBAL $o_anul,$o_luna,$o_oreluc;  // aceste variabile global se folosesc numai in clasa pentru popularea array protected $v si protected $vtabel
   $this->v = [$o_anul=>$this->v['a'],$o_luna=>$this->v['b'],$o_oreluc=>$this->v['c']];
   $this->vtabel = [$o_anul=>$this->vtabel['a'],$o_luna=>$this->vtabel['b'],$o_oreluc=>$this->vtabel['c']];
  }
protected function modelInsert($conn, $posturi){ // parametri conexiune, array numecimp=>valoare variabila POST
   $cols = implode(', ', array_keys($posturi));  //get the keys
   $vals = "'". implode("', '", array_values($posturi)) ."'";  //get the values
   $sql ="INSERT INTO $this->vtabela ( $cols ) VALUES ( $vals )";
   $rows = $conn->sqlExec($sql);  // executa INSERT
   return $rows;
}
protected function modelUpdate($conn, $posturi, $where){
   $i = 0;
   $numItems = count($posturi);
   $re='';
   foreach ($posturi as $key => $value) {
      $re .= "$key = '$value' ";
      if(++$i < $numItems) $re .= ",";
   }   
   $sql ="UPDATE $this->vtabela SET $re ".$where;
   $rows = $conn->sqlExec($sql);
   return $rows;
}
protected function modelDelete($conn, $where){
   $sql ="DELETE FROM $this->vtabela ".$where;
   $rows = $conn->sqlExec($sql);
   return $rows;
}
public function getClasa(){
   return $this->vclasa;
}
public function getTabela(){
   return $this->vtabela;
}
public function getNumeid(){
   return $this->vnumeid;
}
public function getVariabile(){
   return $this->v;
}
public function getTabel(){
   return $this->vtabel;
}
public function getInsert($conn, $posturi){
   $this->modelInsert($conn, $posturi) ;
}
public function getUpdate($conn, $posturi, $where){
   $this->modelUpdate($conn, $posturi, $where) ;

public function getDelete($conn, $where){
   $this->modelDelete($conn, $where) ;
}         

Ideea n-ar fi de utilitatea (sau inutilitatea) codului, ci daca aceasta abordare e cea corecta. Multumesc.

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: mapare clasa peste tabela

Mesajde nevvermind » Lun Mai 23, 2016 4:11 pm

1. Daca mai vad o data "GLOBAL", nu te mai ajut. Atat de mult imi displac. Injecteaza in constructor sau intr-o metoda ce ai nevoie, nu imprumuta din alt context. Nu mai folosi GLOBAL niciodata.

2. Nu trebuie sa declari clasa, poti folosi constanta __CLASS__.

3. Poti folosi rezultatul interogarii "DESCRIBE TABLE ..." sa preiei informatii despre coloanele unui tabel, fara a mai fi nevoie sa le scrii in cod. E putin mai dinamic.

4. Denumeste-ti variabilele/metodele/proprietatile ca lumea. oreluc nu inseamna nimic. v_luna nu inseamna nimic, $vclasa wtf si $v... wtf. Scrie in engleza.

5. Pentru inceput, vezi asta cum iti place:

Cod: Selectaţi tot

abstract class AbstractTableMapper
{
    /**
     * @var Pdo
     */
    protected $connection;

    public function __construct()
    {
        $this->connection = new Pdo(/* ... */);
    }

    abstract protected function getMappedTableName();

    abstract protected function getPrimaryKeyColumnName();

    public function insert(array $data)
    {
        // insert here and return the new primary key
    }

    public function getByPrimaryKey($pk)
    {
        // return data here
    }

    public function deleteByPrimaryKey($pk)
    {
        $stmt = $this->connection
                     ->prepare("DELETE FROM {$this->getMappedTableName()} WHERE `{$this->getPrimaryKeyColumnName()}` = ?");

        return $stmt->execute([$pk]);
    }
}

class Ore extends AbstractTableMapper
{
    protected function getMappedTableName()
    {
        return 'ore';
    }

    protected function getPrimaryKeyColumnName()
    {
        return 'ore_id';
    }
}

$oreMapper = new Ore();

$oreMapper->getByPrimaryKey(1);
$oreMapper->insert(['oreluc' => $lang['ore']['oreluc'], 'anul' => $lang['ore']['anul'], 'luna' => $lang['ore']['luna']]);
$oreMapper->deleteByPrimaryKey(2);
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 46 vizitatori