0

これは、OO PHP への私の最初のアプローチです。Person クラスを作成しました。データベースにクエリを実行するか、POST 値を使用して Person オブジェクトを作成する必要があります。次に、データを DB に保存する必要があります。

これは私のコードです。正しいアプローチかどうかはわかりません。アドバイスが必要です。

class Persona {
    protected $id=NULL;
    protected $nome;
    protected $cognome;
    protected $cf=NULL;
    protected $indirizzo=NULL;
    protected $civico=NULL;
    protected $citta=NULL;
    protected $cap=NULL;
    protected $provincia=NULL;
    protected $nazione=NULL;
    protected $telefono=NULL;
    protected $fax=NULL;
    protected $cellulare=NULL;
    protected $email;
    protected $data_registrazione;
    protected $tipo_registrazione;


    public function createPersona($postData=NULL,$id=NULL,$email=NULL)
    {
        global $_CONFIG;
        if(is_array($postData) && isset($postData['nome']) && isset($postData['cognome']) && isset($postData['email']) && isset($postData['tipo_registrazione']))
        {
            $record=$postData;
        }elseif(isset($id)){
            $result=mysql_query("SELECT * FROM ".$_CONFIG['tbl_persone']." WHERE id='".escape_string($id)."'");
            if(mysql_num_rows($result)!=1) return false;
            $record = mysql_fetch_assoc($result);
        }elseif(isset($email)){
            $result=mysql_query("SELECT * FROM ".$_CONFIG['tbl_persone']." WHERE email='".strtolower(escape_string($email))."'");
            if(mysql_num_rows($result)!=1) return false;
            $record = mysql_fetch_assoc($result);
        }else{
            return false;
        }

        if(isset($record['cf'])) $record['cf']=strtoupper($record['cf']);
        if(isset($record['cap'])) $record['cap']=strtoupper($record['cap']);
        if(!isset($record['nazione']) && isset($record['prefisso'])) $record['nazione']=$record['prefisso'];
        $record['email']=strtolower($record['email']);
        if(!isset($record['data_registrazione'])) $record['data_registrazione']=date('Y-m-d H:i:s');

        $vars=get_object_vars($this);
        foreach($vars as $key=>$value)
        {
            if(isset($record[$key])){$this->$key=$record[$key];}
        }
        if(!$this->validatePersona())return false;

        return true;        
    }

    protected function validatePersona()
    {   
        if(isset($this->id) && !validateID($this->id)) return false;
        if(isset($this->cf) && !validateCF($this->cf)) return false;
        if(isset($this->cap) && !validateCAP($this->cap)) return false;
        if(isset($this->email) && !validateEmail($this->email)) return false;
        return true;
    }

    public function savePersona()
    {   
        global $_CONFIG;
        $vars=get_object_vars($this);
        foreach($vars as $key=>$value)
        {
            if($key!='id')
            {
                if(isset($this->$key))
                {
                    $columns.=$key.",";
                    $values.="'".escape_string($this->$key)."',";
                }
            }
        }

        if(!mysql_query("INSERT INTO ".$_CONFIG['tbl_persone']." (".substr($columns,0,-1).") VALUES (".substr($values,0,-1).")"))
        {
            return false;
        }else{
            return true;
        }
    }
}

$p=new Persona();
if(!$p->createPersona($_POST)){
    echo 'Si è verificato un errore.<br />Riprova più tardi. [0]';
    exit;
}

if($p->createPersona(NULL,NULL,$_POST['email'])){
    echo 'Indirizzo email già registrato.';
    exit;
}

if(!$p->savePersona()){
    echo 'Si è verificato un errore.<br />Riprova più tardi. [2]';
    exit;
}

2 番目のステップは、DB から人物データを使用して動的 HTML テーブルを作成することです。手続き型言語で DB を取得して配列を作成し、次に foreach コンストラクトを使用してテーブルを出力しますが、OO 言語での方法がわかりません.

皆さん、ありがとうございました

フランチェスコ

4

2 に答える 2

1
  1. データベース クエリの結果をオブジェクトにマップする場合は、PDO代わりに を使用します。mysqlドライバーは廃止されているため、使用しないことを強くお勧めします。また、PDO完全に OOP です。いくつかのチュートリアルをオンラインで読んでください。
  2. protected $id=NULL;開始されていないプロパティに null を明示的に割り当てる必要はありません。また、プロパティが外部から (つまり、オブジェクトを介して) アクセスされることがわかっている場合は、プロパティをpublic:public $id;にするだけで十分です。の目的はprotected、メイン クラス ( = 子クラス) から派生したクラスで一部のプロパティを使用できるようにする場合です。
  3. キーワードは使用しないでくださいglobal。定数を含む構成クラスを使用するか、別のファイルに含める配列から設定を読み取ります。その配列をクラス コンストラクターに渡すことができます。
  4. createPersona が構築の主な方法である場合は、名前を変更して次のようにすることができます__contruct$persona = new Persona($_POST);

nullまた、 の代わりに書いNULLてください。よりクリーンで、わずかに効率的です。

function __construct(Array $postData = array(), $id = null, $email = null) {

}
于 2013-09-03T10:19:20.877 に答える
0

@silkfire @DevZer0 わかりましたので、以前のコードを編集しました。どう思いますか?

class factoryPersona {  
    public function createPersona($origin,$by)  
    {  
        switch($by)  
        {  
            case 'post':  
                // get data from $_POST to $array  
                break;  
            case 'id':  
                // get data from DB to $array  
                break;  
            case 'email':  
                // get data from DB to $array  
                break;  
        }  
        $persona=new Persona($array);  
        if(!$persona->validatePersona())  
        {  
            // validation error  
            exit;  
        }  
        return $persona;  
    }  
}  

class Persona {  
    private $id;  
    private $nome;  
    private $cognome;  
    private $cf;  
    private $indirizzo;  
    private $civico;  
    private $citta;  
    private $cap;  
    private $provincia;  
    private $nazione;  
    private $telefono;  
    private $fax;  
    private $cellulare;  
    private $email;  
    private $data_registrazione;  
    private $tipo_registrazione;  

    public function __construct($array=null)  
    {  
        // assignments  
    }  

    public function validatePersona()  
    {  
        if(isset($this->id) && !validateID($this->id)) return false;  
        if(isset($this->cf) && !validateCF($this->cf)) return false;  
        if(isset($this->cap) && !validateCAP($this->cap)) return false;  
        if(isset($this->email) && !validateEmail($this->email)) return false;  
        return true;  
    }  

    public function savePersona()  
    {  
        // save person to DB  
    }   
}  

$persona=new factoryPersona;  
$persona=$persona->createPersona($_POST,'post');  
$persona->savePersona();
于 2013-09-04T12:02:58.857 に答える