OOP PHP

Stato
Discussione chiusa ad ulteriori risposte.

vincy6

Utente Silver
27 Giugno 2009
0
0
0
55
Ciao ragazzi mi sto avvicinando alle oop con il php , volevo essere consigliato qualche esercizio qualche cosina....
Qualche guida?
Io ho realizzato un guestbook con le oop tanto per....
ora vi posto il codice e mi dite qualche correzzione?
PHP:
 <?php
/*
 * GusetBook by Vincy6!
 */

/**
 *
 * @author Vincy6
 */
class db{
    var $host="localhost";
    var $name="my_*****";
    var $user="*****";
    var $pass="";
    var $connect;
    function connect(){
        $this->connect=mysql_connect($this->host,$this->user,$this->pass);
        if(!$this->connect){
            echo'<h3>Errore durante la connessione </h3>Controllare i dati';
            exit();
        }else{
            $this->select();
        }
    }
    function select(){
        $select=mysql_select_db($this->name,$this->connect);
        if(!$select){
            echo
'<h3>Ci sono stati problemi durante la selezione del database';
            exit();
        }
    }
}

class guestbook{
    var $nick;
    var $testo;
    var $data;
    var $ora;
    var $cap;
    function read(){
        $query=mysql_query("SELECT * FROM guestbook ORDER BY id DESC");
        while($all=mysql_fetch_array($query)){
            $nick=$this->nick=$all['nick'];
            $nick=htmlentities($nick);
            $testo=$this->testo=$all['testo'];
            $testo=htmlentities($testo);
            $data=$this->data=$all['data'];
            $ora=$this->ora=$all['ora'];
            echo
   '
    <div id="commenti">
       <div id="in_commenti">
            <table border="1" class="table">
                <tr>
                    <td class="nick">'.$nick.'</td>
                </tr>
                <tr>
                    <td class="testo"><div class="in_testo"><p>'.$testo.'</p></div></td>
                </tr>
                <tr>
                    <td class="data">Questo commento e stato scritto da : '.$nick.' alle ore : '.$ora.' il giorno : '.$data.'</td>
                </tr>
            </table>
       </div>
   </div>
   ';
        }
    }
    function write(){

     echo
'
<div id="form">
    <form action="'.$_SERVER['PHP_SELF'].'" method="post">
        Nick :<br />
        <input type="text" name="nick" class="input" />
        <br />
        Testo:<br />
        <textarea name="testo" class="input_text" ></textarea>
        <br /><br /> ';
        require_once('recaptchalib.php');
    $publickey = "6LfWSgcAAAAAAG-4WxY0nfNqknCpA58kBRZtrdN8 ";
    $privatekey = "6LfWSgcAAAAAAMhlzW0cwkzyreXMZWWTod0C6-hI";

    $resp = "Eseguito";
    $error = "Errato,Riprovare.";
    if ($_POST["recaptcha_response_field"]) {
            $resp = recaptcha_check_answer ($privatekey,
                                            $_SERVER["REMOTE_ADDR"],
                                            $_POST["recaptcha_challenge_field"],
                                            $_POST["recaptcha_response_field"]);

            if ($resp->is_valid) {
                    $this->cap=true;
            } else {
                    $this->cap=false;
                    $error = $resp->error;
            }
    }
    echo recaptcha_get_html($publickey, $error);
    echo'
<br /><br />
<input type="submit" value="Invia" name="invia" class="invia" />
        <input type="reset" value="Reset" class="reset" />
</form>
</div>
';
        if(isset($_POST['invia'])){
            if($this->cap==true)
            {
                $this->edit($nick=$this->nick=$_POST['nick'],$testo=$this->testo=$_POST['testo']);
                if(empty($nick) || empty($testo)){
                    echo'Compilare tutti i campi. Commento NON inserito.';
                    $this->read();
                }else{
                    $data=$this->data=date (" d-m-Y ");
                    $ora=$this->ora=date(" H:i ");
                    $query=mysql_query("INSERT INTO guestbook (nick,testo,data,ora)VALUE ('$nick', ' $testo', '$data', '$ora')");
                    if(!$query){
                        echo"Commento non inserito Correttamente";
                    }else{
                        echo'Commento inserito correttamente.Si prega di non aggiornare la pagina se il tuo messaggio non verrà visualizzato.';

                        }
                }

            }else{
        echo
'Inserire correttamente il capctha';
    }
        }
    }
    function edit($nick,$testo){
        $nick=trim($nick);
        $testo=trim($testo);
        $nick=htmlentities($nick);
        $testo=htmlentities($testo);
        $testo=str_replace("&","&amp;");
        $testo=str_replace("\"","&quot;");
    }
}

class login{
    var $user;
    var $pwd;
    var $confirm;
    var $email;
    function registrati(){
        echo
'
<div id="form">
    <form action="'.$_SERVER['PHP_SELF'].'" method="post">
        User :<br />
        <input type="text" name="user" class="input" />
        <br />
        Password :<br />
        <input type="text" name="pwd" class="input" />
        <br />
        Password di Conferma :<br />
        <input type="text" name="confirm" class="input" />
        <br />
        Email :<br />
        <input type="text" name="email" class="input" />
        <br />
        <br /><br />
        <input type="submit" value="Invia" name="invia" class="invia" />
        <input type="reset" value="Reset" class="reset" />
    </form>
</div>
';
        if(isset($_POST['submit'])){
            $user=$_POST['user'];
            $pwd=$_POST['pwd'];
            $confirm=$_POST['confirm'];
            $email=$_POST['email'];
            if(empty($user) || empty($pwd) || empty($confirm) || empty($email)){
                echo 'Compilare tutti i campi obbligatori.';
            }else{
            }
    }
    }
}
 
allora, come esercizio potresti semplicemente provare a riscirvere i tuoi vari script facnedoli ad oggeti.

2 cose:

echo "blabla";
exit();

però, per risparmiare una riga, exit() può avere come parametro una stringa, se ha come parametro una stringa la stampa prima di uscire.
quindi puoi scrivere exit("blabla").

(ah, il tuo messaggio sforma il forum, per favore sistema)

;)
 
kelev ha detto:
Un po tanto incasinato secondo me..

@kelev: sarebbe una cosa buona quando si esprimono questi commenti, motivare, magari mostrando una porzione di codice interessata dal tuo commento. ;) Chiaramente è solo un consiglio, poi fa come vuoi ;) :asd:

@vincy: credo che nn ci siano gli \n o qualcosa di simile. prova a risistemare gli accapo con il tasto invio.
 
Io il guest l'ho fatto come prima cosa, e volevo chiedere se e fatto bene, e incasinato ma non capsico perchè xD
 
vincy6 ha detto:
Io il guest l'ho fatto come prima cosa, e volevo chiedere se e fatto bene, e incasinato ma non capsico perchè xD

allora, una cosa che ti consiglio: gli echo, di tutto quel codice html, nn metterli direttamente. cioè, è un metodo di una classe, quindi casomai, dovresti restituire i valori presi dal database in una qualche forma (ad esempio un array) e far sì che sia poi lo sviluppatore che utilizza la tua classe che decide come formattarlo.
La programmazione OO ha come caratteristica la possibile di riutilizzare il codice in diversi contesti (se ad esempio uno volesse usare il read() per fare un backup del guestbook.. dovrebbe backupparlo in html?); la facilità di modifica: ossia, se domani a te nn piace + la formattazione, non modifichi la classe, ma soltanto il modo di formattazione che utilizzi fuori dalla classe; appunto, gli echo ed i print nn vanno praticamente mai messi all'interno di una classe, i valori vanno restituiti (return) e poi printati; in ogni caso, mettere echo "blabla" è cmq brutto anche, fuori dalla classi, perché se in futuro volessi riutilizzare la stessa stringa, dovresti copiarla, meglio memorizzare in una variabile e dare echo $varConDentroLaStringa; poi, anche gli exit all'interno della classe andrebbero evitati, perché per l'appunto uno che utilizza tale classe dovrebbe poter scegliere il messaggio senza dover modificare la classe: meglio lanciare un errore, poi ci pensi nello script a gestirlo e "sputare" l'exit.

Ecco sommariamente un po' di consigli, nn so se è quello che intendeva kelev, ma quello che ti ho detto io fa parte delle basi della programmazione OO, indipendentemente dal linguaggio.

[ot] c**zo ho scritto un papiro :asd: [/ot]

Enjoy ;)
 
Ok Malex :D

Comunque secondo me dovresti scrivire il codice html (form, textarea e div) fuori dalla classe e da li richiamare i tuoi metodi.

EDIT: Malex mi ha anticipato :)
 
kelev ha detto:
Ok Malex :D

Comunque secondo me dovresti scrivire il codice html (form, textarea e div) fuori dalla classe e da li richiamare i tuoi metodi.

EDIT: Malex mi ha anticipato :)

in effetti è fra le cose che ho notato e segnalato :asd:

cmq apprezzo che sei tornato ed hai risposto in modo costruttivo, non tutti fanno così. +1
 
Un po' troppo PHP4.

Almeno usa PHP5 per favore :(

E se devi fare stringhe lunghe e con a capi usa la sintassi heredoc.
 
stoner ha detto:
Non c'è. Non è obbligatorio fare un costruttore, dipende da come pensi la classe.

sì ok, ma mi sembra scomodo dover modificare i vari campi sia del guest che del database direttamente, secondo me sarebbe + comodo modificarli attraverso un costruttore. A mio parere chiaramente, è solo un consiglio.
 
Ripeto: 'dipende da come pensi la classe'. In linea di massima la classe è scritta male, ovviamente.
Ma non c'entra il fatto che manchi il costruttore.. e poi non è detto che devi per forza passargli dei parametri, anche perchè a me potrebbe servire entrare in lettura, e, quindi, non dover passare niente.
PHP:
class guest {
       private function connect() { /* something */ }
       
       public function __construct() { connect(); }
       public function write($date, $name, $message) { /* something */ }
       public function read() { /* something */ return $something; }
}

$g = new guest();
echo $g->read();
?>
Perchè dovrei metterci dei parametri in questo caso al costruttore?
 
Ringrazio tutti delle risposte e cerco di rispondervi.
1) Volevo chiederti dove noti la differenza tra php 4 e 5?( ehmm io conosco un php ora non so quale sia)xD;
2) Devo rivedere cos'e un costruttore...
3) dcevo studiarmi tutto da capo;
4) grazie dei consigli sugli echo e il papiro mi e servito molto.

ps se avete qulche guida (online o emulabile) potreste dirmela? grazie a tutti
 
http://us3.php.net/manual/en/language.oop.php (questi del php4), questi del php5 http://us3.php.net/manual/en/language.oop5.php
 
Ok grazie, appena torno dalle vacanze seguo la guida di html.it sulle oop php5.
Ah un altra cosa anche se e off otpic vorrei sapere come si chiama la libreria per scrivere nelle immagini, ridimensionare cosi da studiare il tutto per bene:)
....(if is possible) xD
 
meh. ha detto:
Un po' troppo PHP4.

Almeno usa PHP5 per favore :(

E se devi fare stringhe lunghe e con a capi usa la sintassi heredoc.

Quotone.
Come già detto da tutti, non è il top scrivere dentro le stringhe i codici HTML.

Ti consiglio anche di usare, come da PHP5, i permessi/attributi dei metodi o delle variabili. Esempio private, public, protected, così specifichi quale funzioni possono essere lanciate da dentro la classe e quali no.
Per esempio:
PHP:
<?php
class porn
{
    private function scaricaPorno ($daCheSito) { print "Questo script non scarica porno, illuso. Segati altrove"; }
    function __construct ($ilmiositarellobello) { $this->scaricaPorno ($ilmiositarellobello); }
}
/* Ora se l'utente inizializzerà la classe, e richiamerà il metodo scaricaPorno, avrà un errore, perché è private. Quando è private solo all'interno della classe è possibile usarlo! */
?>
Lo so, lo so, il codice esempio che ho fatto non ha molto senso però rende l'idea.

Ah, una cosa che non c'entra, mi sembra un po' uno spreco usare MySQL (se ne è discusso tantissimo, lo so), XML ha tempi più lunghi per l'elaborazione, però è molto più portabile sicuramente.
Buon lavoro ;)
 
Io uso il mysql perchè non riesco a farlo con un txt.
Se in mysql c'e l'attibbuto
Codice:
order by id desc
se prendo da un txt come faccio a mettere gli ultimi risultati per primi? quindi uso il mysql:)
 
Beh, non direttamente. Con l'XML devi sempre caricarti in memoria tutto il file per poterci lavorare e scrivere un numero maggiore di righe per ottenere lo stesso risultato. Sinceramente è pedante farlo con XML, a meno che non sia strettamente necessario per altri motivi. A questo punto, se hai php5, conviene di gran lunga usare SQLite. I dati sono salvati su un file binario nel server, l'accesso però è possibile tramite semplici query in SQL (come se fosse un db, ma senza db).

http://us2.php.net/manual/en/book.sqlite.php
 
Grazie con voi posso solamente che imparare.
Ragazzi visto che ci siamo io conosco poco dell mysql.
So fare molte cose ma mi sono fermato alle (non so se si chiamano cosi) relazioni uno a molti eccc....
Stavo studiando da un liobro ma non lo tengo piu...
Potreste spiegarmi giusto il concetto dei due tipi di relazioni poi le approfondisco....
grazie mille....
a dp
 
Il concetto basilare è semplice. Nelle relazioni uno a uno il record di una tabella può essere messo in relazione al massimo con un recordo di un'atra. In una relazione uno a molti (o molti a uno) il record di una tabella può essere messo in relazione con N record di un'altra. Ad esempio basta pensare alle tabelle classe -> alunni. Questa è una relazione uno a molti. Poichè una classe può avere N numeri di alunni al suo interno, ma, d'altra parte, un alunno appartiene ad una sola classe. Una relazione uno a uno stretta invece può essere data dalle tabelle utente -> dati personali. Ogni utente a dei suo dati personali e questi appartengono ad un solo utente. C'è da dire che le relazioni una ad uno in realtà possono essere anche eliminate creando direttamente una tabella che contiene i campi di entrambe le tabelle di partenza (dipende come si pensa di gestire il db). Questo non è possibile invece con le relazioni uno a molto o molti ad uno.
 
Stato
Discussione chiusa ad ulteriori risposte.