Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    [PHP] Class MySql e metodi

    Ciao a tutti,
    E' da qualche giorno che mi sto costruendo una classe cercando di pensare a tutto ciò che mi possa servire..
    A parte i metodi standard di connessione, query fetch ecc vorrei integrare dei medoti che permettano l'elaborazione/controllo dei dati passati dall'utente e di stampa.
    Es

    function GetText(){
    //Metodo che aggiunge gli slash e elimina eventuali caratteri strani
    //qualche controllo "da scopiazzare" per evitare sql injection
    }
    function ShowText(){
    //Metodo che toglie gli slash
    }
    function GetNum(){
    //restituisce il numero o false
    }
    function GetData(){
    //valida e prepara la data per il db
    }
    function ShowData(){
    //formatta la data dd/mm/Y
    }

    tutti i "Get" preparano per il db
    tutti gli Show preparano per la stampa a video e cosi a continuare per tutte i tipi di caratteri che necessitano di cotnrollo

    Pensavo di fare in modo che tutti i metodi restituissero o il valore elavorato o il valore false
    settando una proprieta della classe Es: $err_campi a true e $err_mess con il mess di testo Es("Data Errata") se avvenisse un errore.

    Nelle pagine di elaboratione andavo a trattarle in questo modo :

    //Individuo il post
    $_POST["nome"]=$db->GetText($_POST["nome"]);
    $_POST["cognome"]=$db->GetText($_POST["cognome"]);
    $_POST["data"]=$db->GetData($_POST["data"]);
    if($db->err_campi){
    //salto eventuale insert o update
    }
    stampo messaggio di errore....

    Vorrei un parere sulla gestione in questo modo e magari qualche suggerimento di come poter gestire queste cose
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Detto che questa cosa:
    Codice PHP:
    $_POST["nome"]=$db->GetText($_POST["nome"]);
    $_POST["cognome"]=$db->GetText($_POST["cognome"]);
    $_POST["data"]=$db->GetData($_POST["data"]); 
    È assolutamente oscena da vedersi per vari motivi, primo fra tutti la sovrascrittura delle variabili in post. Vediamo di analizzare quello che puoi fare.

    Parte 1:
    Codice PHP:
    function GetText(){
    //Metodo che aggiunge gli slash e elimina eventuali caratteri strani
    //qualche controllo "da scopiazzare" per evitare sql injection
    }
    function 
    ShowText(){
    //Metodo che toglie gli slash 

    Non ti serve nulla da scopiazzare ne rocket science. Se utilizzi l'estensione mysqli o pdo puoi anzi dovresti in quanto cosa buona e giusto avvalerti della feature prepared statement che ti risolve per certo il primo problema e tendenzialmente anche il secondo.

    Parte 2:
    Codice PHP:
    function GetNum(){
    //restituisce il numero o false
    }
    function 
    GetData(){
    //valida e prepara la data per il db

    Questi esempi assieme a quelli sopra peccato di un concetto logico fondamentale. Stai facendo tutto questo per passare i dati al database, quindi, sarebbe più opportuno chiamare dei setter anziché dei getter. E per riassumete con un concetto tecnico hai necessità di creare un mapper.

    Parte 3:
    Codice PHP:
    function ShowData(){
    //formatta la data dd/mm/Y

    Per i motivi di cui sopra i vari show dovrebbero invece diventare appunto i tuoi getter.

    Un altra cosa mi raccomando le naming convention.

  3. #3
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    scusa se ti rispondo solo adesso ma grazie alla tua risposta mi sono guadagnato una giornata di ricerce e ho solo iniziato a capire la metà di quello che mi serve....
    Allora premesso che tutto ciò che ho detto era una caxxata.
    Ho affrontato abbastanza approfonditamente il discorso della classe pdo ed effettivamete con la funzione "prepare" e con il bindParam passandogli come argomento il tipo di dati dovrei essere abbastanza sicuro che quello che arriva al db siano dati affidabili.

    Suppongo, correggimi se sbaglio, che quando vafo a fare il bindParam dovrebbe essere tutto all'interno di un try catch per poter gestire l'errore evitando l'interruzione.

    La figata più assurda è la funzione di beginTransaction

    però siccome io mi voglio complicare bene la vità e perchè vorrei iniziare a gestire bene gli errori di connessione esecuzione ecc ho pensato e buttato giu queste righe di codice

    Codice PHP:
    <?php
    class db extends PDO {   
        private 
    $mailerr false;
        private 
    $logfile false;
        private 
    $mailto "indirizzi_mail";
        
        public function 
    __construct $server "loclhost"$username "root"$password "Password1"$dbname "itron" ) {   
            
    $dns = ($dbname) ? "mysql:host={$server};dbname={$dbname}"mysql:host={$server}";      
            try{    
                
    parent::__construct($dns$username$password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));   
            }catch (
    PDOException $e) {
                
    $this->getErr("Errore di Connessione!");
            }
        }
        
        private function 
    getErr($error ""){
            
    // se bisogna mandare la mail
            
    if(!$this->mailerr){
                
    $testo "Si è verificato un errore: ".$error." \r\n \r\n Indirizzo del file chiamato: ".$_SERVER['REQUEST_URI'];
                
    $subject "db extends Pdo: Error.";
                    
    //$headers  = "From: $to\r\n";
                    //$headers .= "Reply-To: $to\r\n";
                    //$headers .= "Return-Path: $to\r\n";
                
    if(!mail($to$subject$testo$headers))
                    die(
    "Errore durante l'invio della Segnalazione!");
            }

            if(
    this->logfile){
                
    $fp = @fopen($this->logfile"a");
                @
    fwrite($fp$tipo date("d/m/Y H:i:s")." - Si è verificato un errore: $error\r\n");
                @
    fclose($fp);
            }

            if(
    $this->dieerror){
                die(
    "Oops! Si e' verificato un errore interno.
    "
    .$error."
    Stiamo lavorando per risolverlo."
    );
            }
        }    
    }  
    ?>
    La classe ti dico che ha già dei problemi pero l'idea sarebbe quella.....

    Inoltre vorrei integrare una ulteriore classe

    Codice PHP:
        class myPDOStatement extends PDOStatement {   
       
        } 
    Dove vado a integrare i metodi di costruzione delle query per avere un accesso comune e la gestione degli errori analoga a come lo è sopra...

    Pensi che ci siamo in questo modo?
    Una cosa che proprio non ho capito è il suggerimento che mi hai dato per quanto riguarda il
    "mapper"

    Io ti ringrazio infinitamente per le risposte, non hai idea di che aiuto mi stai dando spiegandomi queste cose..
    Che mestiere difficile.....essere da soli ancora di più

  4. #4
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Originariamente inviato da Fractals87
    Suppongo, correggimi se sbaglio, che quando vafo a fare il bindParam dovrebbe essere tutto all'interno di un try catch per poter gestire l'errore evitando l'interruzione.
    Sbagli, se controlli la documentazione ti accorgerai che bindParam non solleva exception di conseguenza il try/catch non può catchare
    BindParam torna semplicemente true/false
    La figata più assurda è la funzione di beginTransaction
    PHP in generale è pieno di figate, basta conoscerle e avere voglia di studiare. Programmare necessita di enorme passione e dedizione.
    Pensi che ci siamo in questo modo?
    C'è pulizia e refactoring da fare ma concettualmente direi che è un buon punto di partenza.
    Una cosa che proprio non ho capito è il suggerimento che mi hai dato per quanto riguarda il
    "mapper"
    Un mapper è un oggetto che si occupa in modo trasparente di relazionare un oggetto con la rispettiva controparte nel database e mettere a disposizione metodi per il loro salvataggio e recupero.

    Ecco un definizione: http://martinfowler.com/eaaCatalog/dataMapper.html

    Ed un esempio tratto dal quickstart di Zend Framework giusto per darti un idea pratica del concetto
    Codice PHP:
    // application/models/GuestbookMapper.php
     
    class Application_Model_GuestbookMapper
    {
        protected 
    $_dbTable;
     
        public function 
    setDbTable($dbTable)
        {
            if (
    is_string($dbTable)) {
                
    $dbTable = new $dbTable();
            }
            if (!
    $dbTable instanceof Zend_Db_Table_Abstract) {
                throw new 
    Exception('Invalid table data gateway provided');
            }
            
    $this->_dbTable $dbTable;
            return 
    $this;
        }
     
        public function 
    getDbTable()
        {
            if (
    null === $this->_dbTable) {
                
    $this->setDbTable('Application_Model_DbTable_Guestbook');
            }
            return 
    $this->_dbTable;
        }
     
        public function 
    save(Application_Model_Guestbook $guestbook)
        {
            
    $data = array(
                
    'email'   => $guestbook->getEmail(),
                
    'comment' => $guestbook->getComment(),
                
    'created' => date('Y-m-d H:i:s'),
            );
     
            if (
    null === ($id $guestbook->getId())) {
                unset(
    $data['id']);
                
    $this->getDbTable()->insert($data);
            } else {
                
    $this->getDbTable()->update($data, array('id = ?' => $id));
            }
        }
     
        public function 
    find($idApplication_Model_Guestbook $guestbook)
        {
            
    $result $this->getDbTable()->find($id);
            if (
    == count($result)) {
                return;
            }
            
    $row $result->current();
            
    $guestbook->setId($row->id)
                      ->
    setEmail($row->email)
                      ->
    setComment($row->comment)
                      ->
    setCreated($row->created);
        }
     
        public function 
    fetchAll()
        {
            
    $resultSet $this->getDbTable()->fetchAll();
            
    $entries   = array();
            foreach (
    $resultSet as $row) {
                
    $entry = new Application_Model_Guestbook();
                
    $entry->setId($row->id)
                      ->
    setEmail($row->email)
                      ->
    setComment($row->comment)
                      ->
    setCreated($row->created);
                
    $entries[] = $entry;
            }
            return 
    $entries;
        }

    Io ti ringrazio infinitamente per le risposte, non hai idea di che aiuto mi stai dando spiegandomi queste cose..
    E tu non hai idea di che gioia mi dai per aver recepito piuttosto bene i miei input senza bisogno di spintarelle o pezzi di codice già fatti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.