Jump to content
  • 0

регистрация


crautcher
 Share

Question

майскул класс :

class SQL
{
public $server= '*****' ,$user='******',$password='******',$database='****',
$connected , $count;

function SetBase($base)
{
$this->database = trim($base);
}


function connect()
{
if ($this->connected)
mysql_close();
$curent = mysql_connect ($this->server, $this->user, $this->password);
if (!$curent)
{
$this->connected = false;
die("some error : ".mysql_error() );
}else
$this -> connected = true ;
$this -> CreateBase( $this->database );
mysql_select_db ($this->database) or die("some problem with database : ". mysql_error() );
$this->connected = true;
}

function CreateBase($name)
{
$this -> run ("CREATE DATABASE IF NOT EXISTS `".trim($name)."` ");
}

function query($query,$type='array')
{
if (!$this->connected)
$this->connect();
$result = $this->run($query);
if (!$result)
return(mysql_error());
$this->count = mysql_num_rows($result);
if (!$this->count)
return 0;
$d = array ();

if ($type == 'object')
while ($row = mysqli_fetch_object($result))
$d[] = $row;

if ($type == 'row')
while ($row = mysqli_fetch_row($result))
$d[] = $row;

if ($type == 'assoc')
while ($row = mysql_fetch_assoc($result))
$d[] = $row;
else
while ($row = mysql_fetch_array($result))
$d[] = $row;
return $d;
}

function run($query)
{
if (!$this->connected)
$this->connect();
$query = trim($query);
$result = mysql_query($query);
return $result;
}

}

далее идет класс регистрации:

class Register extends SQL
{
public $login , $password , $password_r , $email , $error , $errortext ;

function __construct()
{
$this -> count = 0;
$this -> connected = false;
$this -> error =false;
$this -> errortext = '<p>При регистрации на сайте произошли следующие ошибки:</p><ul>';
}

function install()
{
$this -> run ("CREATE TABLE IF NOT EXISTS `users` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`login` VARCHAR( 12 ) NOT NULL ,
`pass` TEXT NOT NULL ,
`email` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
)");
}

function AddError($error)
{
$this->error = true;
$this->errortext .= '<li>'.trim($error).'</li>';
}

function SetData($login,$pw1,$pw2,$email)
{
$this->login = trim($login);
$this->password = trim($pw1);
$this->password_r = trim($pw2);
$this->email = trim($email);
$this->CheckLogin( $this->login );
$this->CheckPassword( $this->password );
$this->CheckPassword( $this->password_r );
if ($this->password != $this->password_r)
$this->AddError('Поле Пароль и его Подтверждение не совпадают!');
$this->CheckEmail( $this-> email );
}

function CheckLogin($login)
{
if (empty($login))
$this->AddError('Вы не заполнели поле Имя пользователя!');
elseif (!preg_match('/^[a-z0-9]{4,12}$/i',$login))
$this->AddError('Убедитесь что Логин содержит от 4 до 12 символов, и состоит из латинских символов и цифр');
else
$this->query("select `id` from `users` where `login` = '".addslashes($login)."' limit 1 ");
if ($this->count > 0)
{
$this->AddError('Такое имя существует !');
$this->count = 0 ;
}
}

function CheckPassword($password)
{
if (empty($password))
$this->AddError('Вы не заполнили поле Пароль!');
elseif (!preg_match('/^[a-z0-9]{6,20}$/i',$password))
$this->AddError('Убедитесь что Пароль содержит от 6 до 20 символов, и состоит из латинских символов и цифр');
}

function CheckEmail($email)
{
if (empty($email))
$this->AddError('Вы не заполнили поле E-Mail!');
elseif (!preg_match('/^[-0-9a-z_\.]+@[-0-9a-z^\.]+\.[a-z]{2,4}$/i',$email))
$this->AddError('Не правильно заполнено поле E-Mail. E-mail должен иметь вид user@somehost.com !');
else
$this->query("select `id` from `users` where `email` = '".addslashes($email)."' limit 1 ");
if ($this->count > 0)
{
$this->AddError('Такой эмаил существует !');
$this->count = 0 ;
}
}

function ShowErrors()
{
if ($this->IsError())
echo $this->errortext . '</ul>';
}

function IsError()
{
return $this->error;
}

function AddToBase();
{
$result = $this->run("INSERT INTO `users` (`login`, `pass`,`email`) VALUES('".addslashes($this->login)."', '".md5 ($this-> password)."', '".addslashes($email)."' ");
if ($result)
return true;
return false;
}

}

непосдредственно сама страница рега

<?php
if ($_POST)
{
include_once "clases/class.sql.register.php";
$reg = new Register;
$reg -> SetData($_POST['rlogin'] , $_POST['rpass'] , $_POST['rpassr'] , isset($_POST['email']);
if ($reg->IsError)
$reg -> ShowErrors();
else
{
$reg->connect();
$reg->install();
if ($reg -> AddToBase())
echo('<p>Вы успешно зарегистрированы на сайте!</p>');
else
echo('<p>Не удалось !</p>');
}

}
?>

<form id="register_form" name="register_form" method="post" action="">
<table width="508" height="231" border="1" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="251" align="right">Login:</td>
<td width="251" align="center">
<input type="text" name="rlogin" id="rlogin"
<?php
if ($_POST && $reg->error && isset($_POST['rlogin']))
echo('value="'.$_POST['rlogin'].'" ');
?>/>
</td>
</tr>
<tr>
<td align="right">Password:</td>
<td align="center"><input type="password" name="rpass" id="rpass"
<?php
if ($_POST && $reg->error && isset($_POST['rpass']))
echo(‘value="’.$_POST['rpass'].’" ‘); ?>/></td>
</tr>
<tr>
<td align="right">Repeat Password:</td>
<td align="center"><input type="password" name="rpass_r" id="rpass_r"
<?php
if ($_POST && $reg->error && isset($_POST['rpass_r']))
echo('value="'.$_POST['rpass_r'].'" '); ?>/></td>
</tr>
<tr>
<td align="right">E-Mail:</td>
<td align="center"><input type="text" name="email" id="email"
<?php
if ($_POST && $reg->error && isset($_POST['email']))
echo('value="'.$_POST['email'].'" '); ?>/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="reg_button" id="reg_button" value=" Register " />
</td>
</tr>
</table>
</form>

Edited by crautcher
Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Ой, много чего можно сказать по поводу представленного кода. Тут видно, что автор страдает заболеванием «ООП головного мозга» (без обид, ага?). Видно, что нет никакого понимания для чего нужны классы, объекты и как их правильно использовать. Я сам таким раньше страдал из-за незнания синтаксиса PHP. В первую очередь непонятно зачем было создавать класс для работы с MySQL — для этого уже есть mysqli (от использования которого я уже тоже отказался) и PDO. Само собой, если нужен какой-то дополнительный функционал, то можно всегда сделать

class SQL extends PDO

и уже там наворачивать. Вот этот кусок кода

public  $server= '*****', $user='******', $password='******', $database='****'

тоже не выдежривает никакой критики — классы нужны для абстракций и интерфейсов и указывать параметры соединения с БД прямо в классе — нелепо. Может же возникнуть ситуация, когда надо в одном скрипте работать с двумя БД, а то и вообще с двумя серверами. Правильно делать так:

function __construct($server, $user, $password, $database)
{
// Тут подключаемся к БД
}

Ну и, само собой, заводить данные при создании объекта. Короче, весь класс SQL надо переделать.

Теперь класс для регистрации пользователей. Зачем он наследует класс SQL? Если вам надо делать запросы к БД, то я бы это решил так

$DB=new SQL($server, $name, $password, $database);
class Register
{
function __construct()
{
global $DB;
$this->db=$DB;
}
}

И теперь вы можете делать запросы типа так:

$this->db->query('SELECT * FROM `teablename` LIMIT 0, 10');

Ну и несколько вопросов на дом:

1. Зачем в тексте ошибок есть элементы разметки?

2. Почему пароль должен содержать от 6 до 20 букв или цифр? Спецсимволы повышают стойкость пароля. Ну и, если ограничение «снизу» как-то ещё можно объяснить, то зачем стоит органичение в 20 символов? Если нужна разумность, то ставьте 255, например — столько символов в пароле маловероятно, а больше 20 — вполне.

3. Регулярка на проверку email, по-моему, не идеальна — адрес «-@-.qq» сматчится, но не будет являться хоть сколь-нибудь валидным адресом, а, например, «username@domainname.travel» не сматчится.

4. Зачем делать addslashes? Мало того, что у вас логин и так не может содержать ничего такого, что бы надо было экранировать, так ещё и вообще не понятно зачем это делать в наш атомный век, когда есть prepared statements.

5. Зачем нужен метод install? Если вы заранее знаете какую структуру будет иметь у вас табличка, то не будет ли правильным её создать один раз, а не хранить постоянно бесполезную информацию в коде?

6. Для чего у вас один метод проверяет, а второй добавляет? Не будет ли правильнее написать один метод для добавления, который бы заодно и проверял всё, что надо? А если что-то не так, что бросал бы исключение или бы возвращал код ошибки? Типа такого:

 try {$reg -> add($_POST['rlogin'] , $_POST['rpass'] , $_POST['rpassr'] , isset($_POST['email']);}
catch (Exception $ex)
{
$error=$ex->getMessage();
}

ну или как-то так, например

if (!$reg -> add($_POST['rlogin'] , $_POST['rpass'] , $_POST['rpassr'] , isset($_POST['email']))
$error=$reg->error();

Вот краткий список того, на что следует обратить внимание в первую очередь. Ждём следующую версию.

  • Like 2
Link to comment
Share on other sites

  • 0

Veseloff, отличная речь.. С одним не соглашусь. Класс для работы с базой должен быть.. :) много чего не хватает в стандартных функциях, хотя бы даже дополнительных проверок. И легче править один файл (класс) чем искать по проекту в целом.. Просто пример с CMS Joostina, переход с MySQL на MySQLi сказался простой заменой одного файла. Ну в общем примеров много.. Просто нужно что-то универсальное, не зависящее от версий PHP

Link to comment
Share on other sites

  • 0

а каким вы видите класс работы с базой данных ? сделал конструктор:

class SQL
{
private $server , $user , $password , $database ;
public $connected , $count;

function __construct($server,$user,$password,$base)
{
$this -> count = 0;
$this -> connected = false;
$this -> server = $server;
$this -> user = $user;
$this -> password = $password;
$this -> SetBase($base);
$this -> connect();
}

...

}

include_once "class.sql.php";
class Register
{
private $sql;
public $login , $password , $email , $error , $errors ;

function __construct($login,$pw1,$pw2,$email) // че тянуть резину , если можно сразу в конструкторе падать данные
{global $sql;
$this -> error =false;
$this -> errors= array();
$this -> SetData($login,$pw1,$pw2,$email);
$this -> sql = $sql;
}

function AddError($error) //избавились от хтмл оформления внутри класа
{
$this->error = true;
$this->errors [] = trim($error) ;
}

function SetData($login,$pw1,$pw2,$email)
{
$this->login = trim($login);
$this->password = trim($pw1);
$pw2= trim($pw2);
$this->email = trim($email);
$this->CheckLogin( $this->login );
$this->CheckPassword( $this->password );
$this->CheckPassword( $pw2 );
if ($this->password != $this->$pw2)
$this->AddError('Поле Пароль и его Подтверждение не совпадают!');
$this->CheckEmail( $this-> email );
}

function CheckLogin($login)
{
if (empty($login))
$this->AddError('Вы не заполнели поле Имя пользователя!');
elseif (!preg_match('/^[a-z0-9]{4,25}$/i', $login))
$this->AddError('Убедитесь что Логин содержит от 4 до 12 символов, и состоит из латинских символов и цифр');
else
$this-> sql ->query("select `id` from `users` where `login` = '". $login ."' limit 1 ");
if ($this->count > 0)
{
$this->AddError('Такое имя существует !');
$this->count = 0 ;
}
}

function CheckPassword($password)
{
if (empty($password))
$this->AddError('Вы не заполнили поле Пароль!');
elseif (!preg_match('/^[a-z0-9]{6,255}$/i', $password ))
$this->AddError('Убедитесь что Пароль содержит от 6 символов, и состоит из латинских символов и цифр');
}

function CheckEmail($email)
{
if (empty($email))
$this->AddError('Вы не заполнили поле E-Mail!');
elseif (!preg_match('/^[a-z][a-z0-9_\.\-]{1,24}@([a-z][a-z0-9\-]{1,24}\.){1,3}[a-z]{2,7}$/i',$email))
$this->AddError('Не правильно заполнено поле E-Mail. E-mail должен иметь вид user@somehost.com !');
else
$this -> sql -> query("select `id` from `users` where `email` = '". $email ."' limit 1 ");
if ($this->count > 0)
{
$this->AddError('Такой эмаил существует !');
$this->count = 0 ;
}
}

function GetErrors()
{
if ($this->IsError())
return $this->errors ;
}

function IsError()
{
return $this->error;
}

function AddToBase();
{
if (!$this -> sql -> connected)
$this -> sql -> connect() ;
$result = $this->sql ->run("INSERT INTO `users` (`login`, `pass`,`email`) VALUES('". $this->login ."', '". md5 ($this-> password) ."', '". $email ."' ");
if ($result)
return true;
return false;
}


}


if ($_POST)
{
include_once "clases/class.sql.php";
include_once "clases/class.register.php";
$sql = new SQL('******','*****','*****','*****');
$reg = new Register($_POST['rlogin'] , $_POST['rpass'] , $_POST['rpassr'] , isset($_POST['email']);
if ( $reg->IsError() )
{
$errors = $reg -> GetErrors();
echo "<p>При регистрации на сайте произошли следующие ошибки:</p><ul>";
foreach ($errors as $er)
echo "<li>".$er."</li>";
echo "</ul>";
}
elseif ($reg -> AddToBase())
echo('<p>Вы успешно зарегистрированы на сайте!</p>');
else
echo('<p>Не удалось !</p>');
}

}

Edited by crautcher
Link to comment
Share on other sites

  • 0
а каким вы видите класс работы с базой данных ? сделал конструктор:

зачем вам ООП-подход? только лишний код. конструктор у вас ничего полезного не делает, просто из пустого в порожнее переливает. зачем?

имхо функция, если уж не возвращает ничего, то должна хоть какое-то действие производить. констракт вызывается при создании объекта, пусть уж подключение тогда делает, это же интерфейс для работы с БД?


private $sql;
....
global $sql;

вы сами не путаетесь?

public $login , $password , $email , $error , $errors ;

тоже, на мой взгляд не удачное решение. А если вам придётся обрабатывать форму, где 20, 30, 50 пользовательских полей? создадите 50 переменных?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy