Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    implementazione della mia prima classe!!!

    Ciao ragazzi! Sto studiando PHP OOP, e sto provando a riscrivere il mio sito web utilizzando le classi, ora ho scritto la mia prima classe, e mi sembra tutto strano, ancora non riesco quando dichiarare la visibilità(scope) delle proprietà, se utilizzare gli scope anche dentro la classe. Cmq essendo la mia prima classe è normale che ho i primi problemi di principiante e le prime insicurezze. Passo al problema:

    Ho la pagina di iscrizione dove si inseriscono tutti i dati. Per il controllo dei dati inseriti ho creato un file a parte con una classe al'interno(per piacere mi consigliate anche se gli scope vanno dichiarati in questo modo?). Il file l'ho chiamato check_registation_class.php ed il codice (scritto male) è il seguente:


    Codice PHP:
    <?php
        
    class Checkdata
        
    {
           
    define("ERRORE1""ERRORE: Devi completare tutti i campi obbligatori.");
           
    define("ERRORE2""ERRORE: Username dev'essere di almeno 3 caratteri e inferiore a 30 caratteri.");
           
    define("ERRORE3""ERRORE: La password dev'essere di almeno 5 caratteri.");
           
    define("ERRORE4""ERRORE: Il campo password dev'essere uguale al campo di conferma password.");
           
    define("ERRORE5""ERRORE: L'email inserita non è corretta, inserire una email valida.");    
           
    define("ERRORE6""ERRORE: Il campo email dev'essere uguale al campo di conferma email.");
           
    define("ERRORE7""ATTENZIONE: Username inserito è già stato utilizzato da un altro utente, per piacere inserisci un altro Username.");    

           public 
    $numberr 0;
        
           public 
    $code_error  "<table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse; padding-left: 20px;'>";
           public 
    $code_error .= "<tr>";
           public 
    $code_error .= "<td width='5%' valign='center'>";
           public 
    $code_error .= "[img]../immagini/error.jpg[/img]";
           public 
    $code_error .= "</td>";
           public 
    $code_error .= "<td width='95%'>";
           public 
    $code_error .= "[b]<font face='Verdana, Arial, Helvetica, sans-serif' color='#990000' style='font-size: 11px'>";
           public 
    $code_error .= ERRORE.$this->numberr;
           public 
    $code_error .="</font>[/b]";
           public 
    $code_error .="</td>";
           public 
    $code_error .="</tr>";
           public 
    $code_error .="</table>";
        
           private 
    $username$email$cemail$password$cpassword;

            public function 
    checknow($username$email$cemail$password$cpassword)
            {
              if(
    $this->username == "" || $this->email == "" || $this->cemail == "" || $this->password == "" || $this->cpassword == "")
              {
                 
    $this->numberr 1;
                 return 
    $this->code_error;
              }  

              if(
    strlen($this->username) < || ($this->username) > 30)
              {
                 
    $this->numberr 2;
                 return 
    $this->code_error;
              }


              if(
    strlen($this->password) < 5)
              {
                 
    $this->numberr 3;
                 return 
    $this->code_error;
              }

              if(
    strcmp($this->password,$this->cpassword) != 0)
              {
                 
    $this->numberr 4;
                 return 
    $this->code_error;
              }

              if(!
    eregi("^[a-z0-9][_\\.a-z0-9-]+@([a-z0-9][0-9a-z-]+\\.)+([a-z]{2,4})"$this->email))
              {
                 
    $this->numberr 5;
                 return 
    $this->code_error;
              }

              if(
    strcmp($this->email,$this->cemail) != 0)
              {
                 
    $this->numberr 6;
                 return 
    $this->code_error;
              }
              require_once(
    "mysql_class.php");
              
    $dbmysql = new DbMysql();
              
    $dbmysql->usock();

              private 
    $query "SELECT user_username FROM user WHERE user_username='".mysql_real_escape_string ($this->username)."' ";
              private 
    $result mysql_query($this->query) or die(mysql_error());

              private 
    $num_res mysql_num_rows($result);

              if(
    $this->num_res == 1)
              {
               
    $this->numberr 7;
               return 
    $this->code_error;
              }
            }
        }
        
    $checkdata = new Checkdata(); //Questa non so se posso dichiararla direttamente nel file dove includo la classe
    ?>

    Quando apro la pagina ricevo il seguente errore:

    Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /web/htdocs/www.nomesito.it/home/class/check_registation_class.php on line 4


    Per piacere mi fate capire dove sbaglio? Grazie

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Cosa intendi con "quando apro la pagina"?
    I file php contenenti le classi vanno incluse nei file in cui servono tali classi, non vanno aperti dal browser.

    Consiglio: non usare eregi, usa preg_match, la funzione eregi è deprecata.

  3. #3
    si ero a conoscenza del fatto che eregi è deprecata ma per adesso voglio prima farmi entrare in testa come scrivere bene questa classe.
    Per il resto, intendevo che quando apro la pagina iscriviti.php, che contiene il corpo del form di iscrizione, dove ho incluso la classe con require_once("../class/check_registation_class.php");
    in modo da utilizzarla per un controllo dei dati inseriti, mi da questo errore:

    Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /web/htdocs/www.grandicuochi.it/home/class/check_registation_class.php on line 4

  4. #4
    per ora ho cambiato la dichiarazione delle proprietà in questo modo anche se non è cambiato niente, l'errore c'è sempre:

    Codice PHP:
    <?php
        
    class Checkdata
        
    {
           
    define("ERRORE1""ERRORE: Devi completare tutti i campi obbligatori.");
           
    define("ERRORE2""ERRORE: Username dev'essere di almeno 3 caratteri e inferiore a 30 caratteri.");
           
    define("ERRORE3""ERRORE: La password dev'essere di almeno 5 caratteri.");
           
    define("ERRORE4""ERRORE: Il campo password dev'essere uguale al campo di conferma password.");
           
    define("ERRORE5""ERRORE: L'email inserita non è corretta, inserire una email valida.");    
           
    define("ERRORE6""ERRORE: Il campo email dev'essere uguale al campo di conferma email.");
           
    define("ERRORE7""ATTENZIONE: Username inserito è già stato utilizzato da un altro utente, per piacere inserisci un altro Username.");    

           public 
    $numberr 0;
        
           public 
    $code_error  "<table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse; padding-left: 20px;'>";
           public 
    $code_error .= "<tr>";
           public 
    $code_error .= "<td width='5%' valign='center'>";
           public 
    $code_error .= "[img]../immagini/error.jpg[/img]";
           public 
    $code_error .= "</td>";
           public 
    $code_error .= "<td width='95%'>";
           public 
    $code_error .= "[b]<font face='Verdana, Arial, Helvetica, sans-serif' color='#990000' style='font-size: 11px'>";
           public 
    $code_error .= ERRORE.$this->numberr;
           public 
    $code_error .="</font>[/b]";
           public 
    $code_error .="</td>";
           public 
    $code_error .="</tr>";
           public 
    $code_error .="</table>";
        
           private 
    $username$email$cemail$password$cpassword;
           private 
    $query$result;
           private 
    $num_res;

            public function 
    checknow($username$email$cemail$password$cpassword)
            {
              if(
    $this->username == "" || $this->email == "" || $this->cemail == "" || $this->password == "" || $this->cpassword == "")
              {
                 
    $this->numberr 1;
                 return 
    $this->code_error;
              }  

              if(
    strlen($this->username) < || ($this->username) > 30)
              {
                 
    $this->numberr 2;
                 return 
    $this->code_error;
              }


              if(
    strlen($this->password) < 5)
              {
                 
    $this->numberr 3;
                 return 
    $this->code_error;
              }

              if(
    strcmp($this->password,$this->cpassword) != 0)
              {
                 
    $this->numberr 4;
                 return 
    $this->code_error;
              }

              if(!
    eregi("^[a-z0-9][_\\.a-z0-9-]+@([a-z0-9][0-9a-z-]+\\.)+([a-z]{2,4})"$this->email))
              {
                 
    $this->numberr 5;
                 return 
    $this->code_error;
              }

              if(
    strcmp($this->email,$this->cemail) != 0)
              {
                 
    $this->numberr 6;
                 return 
    $this->code_error;
              }
              require_once(
    "mysql_class.php");
              
    $dbmysql = new DbMysql();
              
    $dbmysql->usock();

              
    $this->query "SELECT user_username FROM user WHERE user_username='".mysql_real_escape_string ($this->username)."' ";
              
    $this->result mysql_query($this->query) or die(mysql_error());

              
    $this->num_res mysql_num_rows($result);

              if(
    $this->num_res == 1)
              {
               
    $this->numberr 7;
               return 
    $this->code_error;
              }
            }
        }
        
    $checkdata = new Checkdata();
    ?>

    aiuto!!!

  5. #5
    Guarda, e' praticamente tutto sbagliato.

    1) le costanti in una classe non si definiscono con define() ma con constant: http://php.net/manual/en/language.oop5.constants.php -- inoltre una serie di costanti non e' certo il sistema corretto per la gestione dei messaggi di errore

    2) non puoi definire piu' volte una proprieta', tutto questo blocco
    Codice PHP:
           public $code_error  "<table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse; padding-left: 20px;'>";
           public 
    $code_error .= "<tr>";
           public 
    $code_error .= "<td width='5%' valign='center'>";
           public 
    $code_error .= "[img]../immagini/error.jpg[/img]";
           public 
    $code_error .= "</td>";
           public 
    $code_error .= "<td width='95%'>";
           public 
    $code_error .= "[b]<font face='Verdana, Arial, Helvetica, sans-serif' color='#990000' style='font-size: 11px'>";
           public 
    $code_error .= ERRORE.$this->numberr;
           public 
    $code_error .="</font>[/b]";
           public 
    $code_error .="</td>";
           public 
    $code_error .="</tr>";
           public 
    $code_error .="</table>"
    e' sintatticamente errato oltre che privo di senso (e poi la costante "ERRORE" da dove viene?): un pezzo di HTML (pessimo tra l'altro) di certo non ha ragione di stare nella dichiarazione di proprieta' di classe

    3) nel metodo checknow() accetti dei parametri, ma esegui i controlli sulle proprieta' che pero' non definisci da nessuna parte: non e' che gli argomenti di un metodo vengono automaticamente registrati in proprieta' con lo stesso nome, $username e $this->username sono due variabili completamente distinte

    4) non devi per forza usare proprieta' di classe, puoi anche usare normali variabili all'interno dei metodi, le proprieta' di classe sono variabili che devono essere accessibili a tutta la classe

    5) NON validare le email tramite regular expressions: http://forum.html.it/forum/showthrea...4#post13284194

    6) non usare eregi_*

    7) cosa significa questo?
    Codice PHP:
    if(strlen($this->username) < || ($this->username) > 30
    "se la lunghezza di $this->username e' minore di 3 oppure $this->username (misteriosamente racchiuso tra parentesi) contiene un numero maggiore di 30?

    8) fai la query al database basandoti solo sull'utente... e la password??

    9) c'e' sicuramente dell'altro, ma gia' cosi' mi pare sufficiente: prenditi un buon libro e comincia con calma dalle basi, stai cercando di costruire una casa senza avere idea di come funzionino i mattoni

  6. #6
    Ciao!
    Allora... grazie per le spiegazioni, in effetti ho un libro dove sto imparando, ma lasciamo perdere questo discorso.
    Ti ringrazio per le spiegazioni che mi hanno "indirizzato" e fatto in modo che io elaborassi le cose che ho imparato, perchè avevo un po' di confusione, quindi grazie davvero. Ora spiego meglio delle cose:

    ti incollo il codice della classe che grazie ai tuoi consigli sono riuscito a modificare con più criterio e correttezza:


    Codice PHP:
    <?php

        
    /* check_registation_class.php   */

        
    class Checkdata
        
    {
           const 
    ERRORE1 "ERRORE: Devi completare tutti i campi obbligatori.";
           const 
    ERRORE2 "ERRORE: Username dev'essere di almeno 3 caratteri e inferiore a 30 caratteri.";
           const 
    ERRORE3 "ERRORE: La password dev'essere di almeno 5 caratteri.";
           const 
    ERRORE4 "ERRORE: Il campo password dev'essere uguale al campo di conferma password.";
           const 
    ERRORE5 "ERRORE: L'email inserita non è corretta, inserire una email valida.";    
           const 
    ERRORE6 "ERRORE: Il campo email dev'essere uguale al campo di conferma email.";
           const 
    ERRORE7 "ATTENZIONE: Username inserito è già stato utilizzato da un altro utente, per piacere inserisci un altro Username.";

           
    //private $username, $email, $cemail, $password, $cpassword;
           
    private $query$result;
           private 
    $num_res;

            public function 
    checknow($username$email$cemail$password$cpassword)
            {
              if(
    $username == "" || $email == "" || $cemail == "" || $password == "" || $cpassword == "")
                 return 
    Checkdata::ERRORE1;

              if(
    strlen($username) < || ($username) > 30)
                 return 
    Checkdata::ERRORE2;

              if(
    strlen($password) < 5)
                  return 
    Checkdata::ERRORE3;
     
              if(
    strcmp($password,$cpassword) != 0)
                  return 
    Checkdata::ERRORE4;

              if(!
    preg_match("/^[a-z0-9][_.a-z0-9-]+@([a-z0-9][0-9a-z-]+.)+([a-z]{2,4})/i"$email))
                 return 
    Checkdata::ERRORE5;

              if(
    strcmp($email,$cemail) != 0)
                 return 
    Checkdata::ERRORE6;
             
              require_once(
    "mysql.class.php");

              
    $dbmysql = new DbMysql();
              
    $dbmysql->usock();

              
    $this->query "SELECT user_username FROM user WHERE user_username='".mysql_real_escape_string ($username)."' ";
              
    $this->result mysql_query($this->query) or die(mysql_error());

              
    $this->num_res mysql_num_rows($this->result);

              if(
    $this->num_res == 1)
               return 
    Checkdata::ERRORE7;

            }
        }
    ?>
    Come vedi il codice è più pulito e gli errori di prima credo di averli risolti.

    Nel file iscriviti.php richiamo la classe in questo modo e passo gli argomenti alla funzione:

    Codice PHP:
    <?php

          
    require_once("../class/check_registation_class.php");
          
          if(isSet(
    $_POST['vai']))
          {   
           
    $checkdata = new Checkdata();
           
    $obtain $checkdata->checknow($_POST['username'], $_POST['email'], $_POST['cemail'], $_POST['password'],$_POST['cpassword']);
              
           
    $code_error  "<table border='1' cellpadding='3' cellspacing='0' style='border-collapse: collapse; padding-left: 20px;' bgcolor='#ffebe8' bordercolor='#dd3c10'>";
           
    $code_error .= "<tr>";
           
    $code_error .= "<td width='5%' valign='center'>";
           
    $code_error .= "[img]../immagini/error.jpg[/img]";
           
    $code_error .= "</td>";
           
    $code_error .= "<td width='95%'>";
           
    $code_error .= "[b]<font face='Verdana, Arial, Helvetica, sans-serif' color='#990000' style='font-size: 11px'>";
           
    $code_error .= $obtain;
           
    $code_error .="</font>[/b]";
           
    $code_error .="</td>";
           
    $code_error .="</tr>";
           
    $code_error .="</table>";

           echo 
    $code_error;
          }
    ?>
    Bene, ora mi spiego meglio su alcuni punti, perchè penso di non essermi spiegato con chiarezza:

    questo è un form di iscrizione, tu mi hai scritto questo:

    8) fai la query al database basandoti solo sull'utente... e la password??

    è naturale che controllo solo il nome utente, visto che quella funzione serve per controllare se il nome utente è già esistente, e in tal caso l'utente dovrà sceglierne un altro, quindi non vedo cosa c'entri la password, sulla password faccio altri controlli.

    Poi hai scritto:
    "se la lunghezza di $this->username e' minore di 3 oppure $this->username (misteriosamente racchiuso tra parentesi) contiene un numero maggiore di 30?

    Ho corretto la variabile, ma le parentesi non sono un mistero, è proprio la sintassi di php che le richiede, quindi resta if(strlen($username) < 3 || ($username) > 30) e serve per controllare la lunghezza del NUOVO nome utente che sceglie il NUOVO iscritto. Ho preferito mettere un controllo. Se non metto le parentesi mi da errore.

    Metterò altri controlli in generale ma per adesso mi serviva solo di elaborare le cose che avevo imparato perchè avevo un po' di confusione, ma grazie a te è più chiaro, poi continuerò a studiare il libro.

    Il pezzo di html l'ho messo in iscriviti.php, si senza dubbio ho fatto una cosa insensata a metterlo nella classe, se è pessimo non saprei farlo meglio, è una semplice tabella con un messaggio di errore all'interno, non saprei proprio come renderla migliore, accetto buoni consigli

    Cmq il codice in locale funziona bene, ma sul server no, mi da sempre quello strano errore, allora ho verificato che la versione di php su quel server aruba è: PHP Version 4.4.9, sono senza parole.... in locale ho la versione: PHP Version 5.3.5 quindi sul server non posso nemmeno applicare il tuo buon consiglio sul controllo dell'email, vista la versione necessaria che di cui parla newbobotime nel post da te indicato. Mah, ho scritto ad aruba per capire perchè c'è quella versione di php.

    Cmq ti ringrazio, le tue indicazioni mi aiutano, e se ne hai delle altre non puoi che farmi un piacere! Imparare è sempre bello, ma imparare bene è una fortuna

    Fammi sapere se il codice è pulito!

    Grazie per il tuo tempo


  7. #7
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    mi intrometto... so che non si può parlar di hosting.. cmq nelle impostazioni del tuo dominio puoi "mi sembra" passare dalla versione 4 alla 5

  8. #8
    grazie torrone controllo subito, se è possibile farlo ti faccio sapere

  9. #9
    hai ragione ho aggiornato la versione proprio dal pannello di controllo! grazie

  10. #10
    Originariamente inviato da jonathanphp
    Poi hai scritto:
    "se la lunghezza di $this->username e' minore di 3 oppure $this->username (misteriosamente racchiuso tra parentesi) contiene un numero maggiore di 30?

    Ho corretto la variabile, ma le parentesi non sono un mistero, è proprio la sintassi di php che le richiede, quindi resta if(strlen($username) < 3 || ($username) > 30) e serve per controllare la lunghezza del NUOVO nome utente che sceglie il NUOVO iscritto. Ho preferito mettere un controllo. Se non metto le parentesi mi da errore.
    E che errore ti da'? Le parentesi non sono assolutamente richieste dalla sintassi. Il punto e' che probabilmente vuoi fare questo:
    Codice PHP:
    if(strlen($username) < || strlen($username) > 30
    nota il secondo strlen(), se non lo usi il controllo viene fatto sul contenuto della variabile e non sulla sua lunghezza.

    Originariamente inviato da jonathanphp
    Il pezzo di html l'ho messo in iscriviti.php, si senza dubbio ho fatto una cosa insensata a metterlo nella classe, se è pessimo non saprei farlo meglio, è una semplice tabella con un messaggio di errore all'interno, non saprei proprio come renderla migliore, accetto buoni consigli
    Prima di tutto l'uso improprio di una tabella per mostrare dati non tabellari, e poi il tag font e' deprecato da quando e' uscita la specifica HTML4 cioe' da almeno 12/13 anni.

    Poi perche' usi strcmp()? Quella funzione si usa quando devi comparare le stringhe per vedere quale e' maggiore tra le due (in ordine alfabetico), se devi solo verificare se sono uguali, perche' non usare semplicemente l'operatore == ?

    In generale comunque una classe deve avere un senso, racchiudere cioe' diverse proprieta' e diversi metodi logicamente correlati per svolgere una serie di funzioni su un oggetto. Se la tua Checkdata non crescera' in qualche modo, allora non ha molto senso che sia una classe visto che non e' altro che una funzione con un nome attaccato, tanto vale usare una semplice funzione (magari integrandola all'interno di un'altra classe piu' ampia).

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 © 2025 vBulletin Solutions, Inc. All rights reserved.