Проверка поля Имя пользователя и показывать капчу


Я новичок в кодировании, а особенно в ООП на PHP. Я буду очень признателен, если вы опытные программисты могут рассмотреть следующий код и дайте мне Ваше мнение, чтобы сделать его лучше. Также, как вы видите этот код, это слишком ужасно и некрасиво?

<?php
include_once("config.inc.php");

class user{

    var $mysqli;
    var $username;
    var $userid;

     function __construct($mysqli) {
         session_start(); 
         $this->mysqli = $mysqli;
    }

    function valid_length($input){
        if ((strlen($input) > 4 ) AND (strlen ($input) < 16) ){
            return true;    
        } else {
            return false;
        }   
    }

    function valid_email($email){
        if (preg_match("/^[0-9a-z]+(([\.\-_])[0-9a-z]+)*@[0-9a-z]+(([\.\-])[0-9a-z-]+)*\.[a-z]{2,4}$/i" , $email)) {
            return true;
        } else {
            return false;
        }
    }

    function alpha_numeric($input){
        if (eregi("^([0-9a-z])+$", $input)){
            return true;        
        }else{
            return false;       
        }   
    }

    function username_exists($username){

        if ($stmt = $this->mysqli->prepare("SELECT username FROM users WHERE username=?")) {
            $stmt->bind_param("s", $username);
            $stmt->execute();
            $stmt->store_result();
            $count=$stmt->num_rows;
            $stmt->close();
        }
        return ($count > 0 ? true : false);
    }

    function signup($username, $password, $email, $capt_error){

    //validate username.
    if(!$this->valid_length($username)){
            $this->signup_error = "Username should be 5 - 15 characters. <br />";   
    }else if(!$this->alpha_numeric($username)){ 
            $this -> signup_error ="Only letters, numbers";     
    } else if($this->username_unallowed($username)){ 
            $this -> signup_error ="Not allowed.";
    } else if ($this->username_exists($username)){
            $this -> signup_error ="Username already exists. <br />";
    }

    //validate password.
   if (!$this->valid_length($password) ){   
            $this -> signup_error .="Password should be 5 - 15 characters. <br />";
        }

    //validate email.
    if (!$this->valid_email($email) ){  
            $this -> signup_error .="Invalid email.";
    }else if($this->email_exists($email)) {
            $this -> signup_error .="Email exists.<br />";  
        }

    //captcha error
    if($capt_error == 1){
    $this -> signup_error .="Invalid captcha. <br />";  
    }

    //no any error, proceed.
    if ($this->signup_error == ""){
        $hashed_password = $this->hash_password($password);
        if ($this->insert_new_user($username, $enc_password, $email)){
        $_SESSION['username']=$username;    
        header("Location: welcome.php");
        }else {
        $this->signup_error = "Unknown error. <br />";
        }       
    }

  }


}
?>


529
5
задан 26 мая 2011 в 11:05 Источник Поделиться
Комментарии
2 ответа

У меня есть несколько предложений, но в целом этот код далеко не ужасные и уродливые.

Ты с помощью PHP 4-стиль учащихся (ВАР $в mysqli), когда вы могли бы с помощью PHP 5 членов с системой контроля доступа (общественная, частная и т. д.) То же самое касается методов, которые должны быть определены с помощью публичных или частных , чтобы указать, кто должен иметь доступ к ним.

В общем, вы должны делать все данные-члены класса частной , если есть действительно хорошая причина для них, чтобы быть открытым. В $mysqli как ручка, например, чисто реализацию деталь и клиентского класса должны иметь доступ к нему.

В $id_пользователя - члены, кажется, не будет использоваться на все, что я вижу. Я предполагаю, что это неполная реализация.

Самая большая проблема-это не для меня ясно, что пользователь класса. Стремимся дать каждому классу небольшой, четко определенный набор обязанностей. На данный момент класс представляется коллекция всех код, который используется для работы с пользователями, является ли или нет он не имеет ничего общего с понятием пользователей как таковой. Например, alpha_numeric функция является полностью универсальной концепции, которые вы, возможно, захотите использовать в другом месте, поэтому он не относится на пользователей класса. Не valid_email. В valid_length метод, вероятно, должен быть отдельный.

При проектировании класса, он может быть полезным начать с описания общего интерфейса. Решите, что вы хотите, чтобы люди могли делать с экземплярами класса. Стремиться к тому, что может быть описано просто и будут очевидны для других лиц, работающих с кодом. Никакой функциональности, не вписывается в этот интерфейс, должны быть в отдельном классе. Писать документацию и / или модульных тестов к этому интерфейсу, и вы увидите, есть ли смысл для пользователя. Как только вы получили общедоступный интерфейс исправлена, вы можете добавить любой частной методики необходимо, чтобы сделать эту работу, но удержаться от соблазна изменить общий интерфейс, если вы обнаружили что-то действительно важное, что вы раньше не задумывались.

Еще одна маленькая деталь заключается в том, что ваш отступ-это очень непоследовательно. Я не знаю, если это артефакт копировать и вставлять на сайт.

7
ответ дан 26 мая 2011 в 12:05 Источник Поделиться

Почему не использовать встроенный в PHP электронной почты проверки?

filter_var($email, FILTER_VALIDATE_EMAIL)

Почему

if (lol())
return true;
else
return false;

когда вы можете сделать

return lol();

Же лол() ? правда : ложь , который вы тоже.

Кроме того, signup_error вещи-это некрасиво. Я предлагаю исключений. По крайней мере, сделать signup_error в массив вместо, а просто добавить новые элементы, когда вы получите сообщение об ошибке. Вы можете присоединиться() массив при выводе.

Кроме того, вы рискуете $рассчитывать не определен, если $stmt задано не.

7
ответ дан 26 мая 2011 в 11:05 Источник Поделиться