Начал учить ООП php и вроде написал код который работает, но на 100% уверен что с ним что-то не так, но что именно не пойму. Это мини система авторизации и регистрации.
Класс регистрации
class Registeret{
private $serverhost;
private $servername;
private $serverpass;
private $serverdb;
private $name;
private $pass;
public $submit;
private $error;
private $errorIsNan;
function __construct($name,$pass,$submit)
{
$this->name = $name;
$this->pass = $pass;
$this->submit = $submit;
}
function getInfoPersion()
{
$this->serverhost = 'localhost';
$this->servername = 'root';
$this->serverpass = '';
$this->serverdb = 'marlincraft';
$this->error = "Такой пользователь уже найден, поменяйте свой логин!";
$this->errorIsNan = "Введите данные в поле!";
$this->newLogin();
}
function newLogin()
{
if (isset($this->submit)){
if ((strlen($this->name) < 5 || strlen($this->pass) < 8) || (strlen($this->name) < 5 & strlen($this->pass) < 8))
{
$_SESSION['error'] = $this->errorIsNan;
}
else
{
$this->checkingname();
}
}
}
function checkingname()
{
$connect = new mysqli("$this->serverhost", "$this->servername", "$this->serverpass", "$this->serverdb");
$result = $connect->query("SELECT login FROM users WHERE login = '$this->name'");
$user = $result->fetch_assoc();
if (count($user) == 0){
$this->verefySend();
}
$_SESSION['error'] = $this->error;
}
function verefySend()
{
$connect = new mysqli("$this->serverhost", "$this->servername", "$this->serverpass", "$this->serverdb");
if ($connect->query("INSERT INTO `users` (login,password,email,age) VALUE ('$this->name','$this->pass','asdsd','42')"))
{
header("Location: /");
}
}
}
А вот код авторизации
class SignIn{
private $login;
private $password;
private $submit;
private $errorIsNan;
function __construct($login,$password,$submit)
{
$this->login = $login;
$this->password = $password;
$this->submit = $submit;
}
function getInfoPersionSign()
{
$this->serverhost = 'localhost';
$this->servername = 'root';
$this->serverpass = '';
$this->serverdb = 'marlincraft';
$this->errors = "Такой пользователь не найден!";
$this->errorIsNan = "Введите данные в поле!";
$this->verefyInfoSign();
}
function verefyInfoSign()
{
if (isset($this->submit)) {
if ($this->login == "" || $this->password == "") {
$_SESSION['errors'] = $this->errorIsNan;
}
}
$this->signIntoSystem();
}
function signIntoSystem()
{
if (isset($this->submit)) {
$connect = new mysqli("$this->serverhost", "$this->servername", "$this->serverpass", "$this->serverdb");
$result = $connect->query( "SELECT * FROM `users` WHERE login = '$this->login' AND password = '$this->password'");
if ($result->num_rows == 1){
$row_auth = $result->fetch_assoc();
$_SESSION['persen'] = array($row_auth['id'], $row_auth['login'], $row_auth['password'], $row_auth['email'],$row_auth['age']);
header("location: /");
}
$_SESSION['errors'] = $this->errors;
}
}
}
и создание экземпляров
$conect = new Registeret($_POST['name'],$_POST['pass'],$_POST['sign-in']);
$conect->getInfoPersion();
$signIn = new SignIn($_POST['login'],$_POST['password'],$_POST['submit']);
$signIn->getInfoPersionSign();
Ну. Хорошо что атрибуты объявлены как private, но почему public $submit ? :)
Главная Ваша ошибка в том что Вы по-прежнему думаете в терминах действий, поэтому даже класс назвали SignIn, например, что является действием, а не объектом. У классов должны быть названия существительные. Например, User. Как с вещами в реальном мире, стол, стул, кружка, кнопка и т.п.
Вот я немного набросал более ООП кода. Я не PHP-программист, мог где-то ошибиться в чисто PHP-шных вещах
class User {
private $connection;
private $login;
private $row;
function __construct($c, $login, $row) {
$this->connection = $c;
$this->login = $login;
$this->row = $row;
}
function attrs() {
if (!isset($this->attrs)) {
$result = $this->connection->query( "SELECT * FROM `users` WHERE login = '$this->login'");
if ($result->num_rows == 0)
throw new UserNotFound($this->login);
$this->row = $result->fetch_assoc();
}
return array($this->row['id'], $this->row['login'], $this->row['password'], $this->row['email'],$this->row['age'])
}
}
class UsersStorage {
private $connection;
function __construct($c) {
$this->connection = $c;
}
function user($login) {
$result = $this->connection->query( "SELECT * FROM `users` WHERE login = '$login'");
if ($result->num_rows == 0)
return array();
return array(new User(#this->connection, $login, $result->fetch_assoc()));
}
function add($login, $attrs) {
$this->connection->query("INSERT INTO `users` (login,password,email,age) VALUE ('$login','$attrs[2]','$attrs[3]','$attrs[4]')");
}
}
// login handler
$c = new mysqli("localhost", "root", "", "db");
$storage = new UsersStorage($c);
$user = $storage.user($_POST['login'])
if (count($user) == 0) {
// user not found, register first
}
else {
$_SESSION['person'] = $user->attrs();
}
// register handler
$c = new mysqli("localhost", "root", "", "db");
$storage = new UsersStorage($c);
$user = $storage.user($_POST['login'])
if (count($user) == 0) {
$storage->add($_POST['login'], array($_POST['login'], $_POST['password'], $_POST['email'], $_POST['age']))
$_SESSION['person'] = $storage->user($_POST['login']);
}
else {
// already exists case, choose another login
}
Все плохо... Дублирование, смешивание, инъекции...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Имеется страница авторизации и база данных с таблицей пользователей и таблицей ролей этих пользователейТаблицы связаны внешним ключом
Есть система диалогов пользователей (картинка 1) и в ней список диалогов переобновляется каждую сек AjaxомДело в том что при наведении на блок...
Есть база данных db_cars Запрос к базе данных должен выводить марку и модель автомобиля, свойства которого укажет пользовательЕсли запрос забить...