Dalle info che mi avete fornito ho preso alcuni imput e ho elaborato qualcosa.
In particolare ho preso spunto da alcuni consigli disseminati su questo topic e ho googlato un pò:
- evitare di estendere la classe mysql e passarla come parametro di una funzione (whisher)
- il concetto di DAO (anche se dovrei fare qualche domandina...) e di Entities (Santino)
Il seguente script da un punto di vista strettamente funzionale và (con error_reportig E_ALL).
Sapete dirmi se sono sulla strada giusta o se sono andato ulteriormente fuori strada?
MySqlClass.php
Codice PHP:
<?php
Class Utilizza_Mysql
{
/*
classe mooooolto banale... giusto il minimo indispensabile
- connessione
- esecuzione query
- fetch dei record estratti con select
... ovviamente implementabile ulteriormente per:
num_rows,affected_rows,gestione degli errori
,escape delle stringhe
,etc etc)
*/
private $host = 'localhost';
private $user = 'root';
private $pass = '';
private $name_db = 'my_test';
protected $db_link;
public function __construct()
{
$this->db_link = mysql_connect ($this->host, $this->user, $this->pass);
mysql_select_db ($this->name_db, $this->db_link);
}
protected function esegui_query($query)
{
$result = mysql_query($query, $this->db_link);
return $result;
}
protected function fetch($result)
{
$row = mysql_fetch_array($result);
return $row;
}
}
?>
ArticoliClass.php (dovrebbe essere qualla a cui santino si riferiva quando parlava di classe guscio)
Codice PHP:
<?php
class Articoli {
/*le proprietà coincidono coincidono con i campi del db*/
protected $id_art;
protected $titolo_art;
protected $testo_art;
protected $data_inserimento;
/*serie di metori set e get per impostare/ottenere il valore di tali proprietà*/
public function getId_art()
{
return $this->id_art;
}
public function setId_art($id_artIn)
{
$this->id_art = $id_artIn;
}
public function getTitolo_art()
{
return $this->titolo_art;
}
public function setTitolo_art($titolo_artIn)
{
$this->titolo_art = $titolo_artIn;
}
public function getTesto_art()
{
return $this->testo_art;
}
public function setTesto_art($testo_artIn)
{
$this->testo_art = $testo_artIn;
}
public function getData_inserimento()
{
return $this->data_inserimento;
}
public function setData_inserimento($data_inserimentoIn)
{
$this->data_inserimento = $data_inserimentoIn;
}
}
?>
ArticoliDao.php (qui viene il bello... anzi il brutto...)
Codice PHP:
<?php
Class ArticoliDao
{
/*
questo metodo è usato ogni qual volta occorre creare delle nuove entità.
In pratica quando si estraggono dati da una query i valori ottenuti dovranno essere "incapsulati"
all'interno degli oggetti id_articolo, testo_articolo, etc etc.
pertanto dopo aver istanziato la classe Articoli potro accedere ai suoi metodi set
e così attribuire il valore agli oggetti.
*/
protected function CreateEntities()
{
return new Articoli();
}
/*
Utilizzando il metodo SET della classe Articoli potremo attribuire valori agli oggetti.
Tali valori essendo presenti nel db occorrerà anzitutto prelevarli tramite query MySql.
La classe che gestisce query a mysql è 'Utilizza_Mysql' che passeremo alla classe ArticoliDao come parametro
Possono presentarsi due casi:
- selezione di un unico record tramite id (chiave primaria):
creo un istanza alla classe Articoli()
tramite metodo SET attribuisco direttamente il valore (prelevato dal db)
dopodichè all'interno della pagina potrò accedere a tali valori con metodo GET
- selezione di più record:
la logica è identica alla precedenza con la sola differenza che
avrò una sorta di array di istanze Articoli()
pertanto all'interno della pagina scorrendo l'array con un foreach ciascun elemento
sarà costituito da
*/
protected function select_single_to_object($conn, $query)
{
$Valore_Entita = $this->CreateEntities();
$result = $conn->esegui_query($query);
if ($row = $conn->fetch($result))
{
$Valore_Entita->setId_art($row[0]);
$Valore_Entita->setTitolo_art($row[1]);
$Valore_Entita->setTesto_art($row[2]);
$Valore_Entita->setData_inserimento($row[3]);
}
else
{
return false;
}
return $Valore_Entita;
}
protected function select_multiple_to_arrayobject($conn, $query)
{
$Array_con_oggetti = array();
$result = $conn->esegui_query($query);
while ($row = $conn->fetch($result))
{
/*per ogni record estratto creiamo un'entità*/
$Valore_Entita_Elemento_Array = $this->CreateEntities();
/*Con metodo SET attribuiamo un valore agli oggetti di tale entità*/
$Valore_Entita_Elemento_Array->setId_art($row[0]);
$Valore_Entita_Elemento_Array->setTitolo_art($row[1]);
$Valore_Entita_Elemento_Array->setTesto_art($row[2]);
$Valore_Entita_Elemento_Array->setData_inserimento($row[3]);
/*aggiungiamo all'array l'entità appena creata*/
array_push($Array_con_oggetti, $Valore_Entita_Elemento_Array);
}
return $Array_con_oggetti;
}
/*
Concentrandoci solo sulle query select poniamo che
- in un caso vogliamo ottenere gli ultimi 5 articoli
- in n altro vogliamo ottenere il singolo articolo
*/
public function Get_Ultimi_Articoli($conn)
{
$query = "SELECT * FROM articoli ORDER BY data_inserimento DESC LIMIT 5";
$Array_result_object = $this->select_multiple_to_arrayobject($conn, $query);
return $Array_result_object;
}
public function Get_Articolo_By_Id($conn, $id_articolo)
{
$query = "SELECT * FROM articoli WHERE id_articolo ='".$id_articolo."' LIMIT 1";
$result_object = $this->select_single_to_object($conn, $query);
return $result_object;
}
}
?>
Ultimi_articoli.php
Codice PHP:
<?php
error_reporting(E_ALL);
require_once('ArticoliClass.php');
require_once('ArticoliDao.php');
require_once('MySqlClass.php');
/*
Istanziamo la classe per connetterci al db e poter interazire con esso
*/
$connessione = new Utilizza_Mysql();
/*
Istanziamo la classe ArticoliDao per poter ottenre gli oggetti che ci occorrono
*/
$articoli = new ArticoliDao();
/*
Utilizziamo il metodo GET per ottenere le ultime news
*/
$ultimi_articoli = $articoli->Get_Ultimi_Articoli($connessione);
//echo '<pre>';
//var_dump($ultimi_articoli);
//exit;
?>
<html>
<body>
<h1>Ultimi 5 articoli inseriti:</h1>
<ul>
<?php foreach($ultimi_articoli as $key => $object) : ?>
[*]
<a href="leggi_articolo.php?id=<?php echo $object->getId_art(); ?>">
<?php echo $object->getTitolo_art(); ?>
</a>
<?php endforeach; ?>[/list]
</body>
</html>
leggi_articolo.php
Codice PHP:
<?php
error_reporting(E_ALL);
require_once('ArticoliClass.php');
require_once('ArticoliDao.php');
require_once('MySqlClass.php');
$connessione = new Utilizza_Mysql();
$articoli = new ArticoliDao();
$id = (isset($_GET['id']))? intval($_GET['id']) : 0;
$singolo_articolo = $articoli->Get_Articolo_By_Id($connessione, $id);
//echo '<pre>';
//var_dump($singolo_articolo);
//exit;
?>
<html>
<body>
[url="Ultimi_articoli.php"]TORNA ALLE ULTIME NEWS[/url]
<h1><?php echo $singolo_articolo->getTitolo_art(); ?></h1>
<?php echo $singolo_articolo->getTesto_art(); ?></p>
</body>
</html>