[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регистрация на ООП
realgleb
Всем привет! Только ознакомился с теоретическим материалом по ООП и решил перейти к практике! Решил написать систему регистрации на ООП и возник вопрос:
}
class registration{
function a(){
if(isset($_POST['login']) && isset($_POST['password'])){
$login = $_POST['login'];
$password = $_POST['password'];
}
if(empty($login) || empty($password)){
exit("Вы ввели не всю информацию!");
}
$login = trim(htmlspecialchars(stripslashes($login)));
$password = trim(htmlspecialchars(stripslashes($password)));
$this->checkUsers();

}
function checkUsers(){
$result = mysql_query("SELECT id FROM `users` WHERE login='$login'");
$myrow = mysql_fetch_array($result);
if(!empty($myrow['id'])){
exit("Такой логин уже зарегистрирован");
}
$this->insertUsers();
}
function insertUsers(){
$result2 = mysql_query("INSERT INTO `users` (login, password) VALUES ('$login', '$password')");
if($result2 == true){
echo "Вы зарегистрированны! <a href='index.php'>На главную</a>";
}else{
echo "Вы не зарегистрированны!";
}

}
}

<?php
include "class.php";
$database = new db();
$database->connect();
$reg = new registration();
$reg->a();
?>
Почему в базу добаляются пустые поля! Я так понимаю что методе insertUsers он не видит переменные $login и $password? Тогда почему не видит, я же в методе A Ловлю информацию которую ввел пользователь и записываю их туда? Подскажите где ошибка! спасибо за внимание!



Спустя 2 минуты, 40 секунд (29.01.2012 - 21:52) inpost написал(а):
Переменные между функциями не видны. Поэтому используют СВОЙСТВА. Переменные, объявленные для класса в целом, а не внутри конкретной функции.
Их лучше инициализировать на уровне __construct

Спустя 2 минуты, 14 секунд (29.01.2012 - 21:54) Winston написал(а):
Свернутый текст
<?
class
registration{
public $login;
public $password;
function a(){
if(isset($_POST['login']) && isset($_POST['password'])){
$this->login = $_POST['login'];
$this->password = $_POST['password'];
}
if(empty($login) || empty($password)){
exit("Вы ввели не всю информацию!");
}
$this->login = trim(htmlspecialchars(stripslashes($this->login)));
$this->password = trim(htmlspecialchars(stripslashes($this->password)));
$this->checkUsers();

}
function checkUsers(){
$result = mysql_query("SELECT id FROM `users` WHERE login='" . mysql_real_escape_string($this->login) . "'");
$myrow = mysql_fetch_array($result);
if(!empty($myrow['id'])){
exit("Такой логин уже зарегистрирован");
}
$this->insertUsers();
}
function insertUsers(){
$result2 = mysql_query("INSERT INTO `users` (login, password) VALUES ('" . mysql_real_escape_string($this->login) . "', '" . mysql_real_escape_string($this->password) . "')");
if($result2 == true){
echo "Вы зарегистрированны! <a href='index.php'>На главную</a>";
}else{
echo "Вы не зарегистрированны!";
}

}
}

<?php
include "class.php";
$database = new db();
$database->connect();
$reg = new registration();
$reg->a();
?>
Цитата (realgleb @ 29.01.2012 - 20:49)
Тогда почему не видит

Потому, что ты везде используешь локальную область видимости.

Спустя 1 минута, 3 секунды (29.01.2012 - 21:55) inpost написал(а):
realgleb
Кроме того обрывать скрипт через exit(); - это кощунство. Ты должен выходить из функции, и выводить на уровне формы сообщение, что такое-то поле не заполнено.

Спустя 1 час, 39 минут, 44 секунды (29.01.2012 - 23:35) m4a1fox написал(а):
Мало ли, вдруг поможет http://phpforum.ru/index.php?showtopic=53014

Спустя 14 минут, 32 секунды (29.01.2012 - 23:50) m4a1fox написал(а):
Ошибка....

Спустя 20 минут, 8 секунд (30.01.2012 - 00:10) neadekvat написал(а):
realgleb
1. Методам (ака функциям - для тех, кто только начинает в ООП) необходимо присваивать модификаторы доступа, в соответствии с задуманной логикой.
public function some()


2. Работать в классе с суперглобальными массивами, если это не класс для работы с оными - моветон. Значения, с которыми работает класс, надо четко передавать и принимать.

3. exit()/die() в большинстве случаев - табу. Данная ситуация не является исключением.
Чтобы обработать ошибки, для начала, предлагаю ввести public свойство array $errors, в которое будут складываться ошибки. Т.е. не
exit('Мудак, введи логин');

а
$errors[] = 'Будь добр, введи логин.';
return false;


4. Обрабатывать входящие данные мы еще не научились, мда:
trim(htmlspecialchars(stripslashes($login)))

Код прошлого десятилетия. Сейчас stripslashes не актуален. Это раз. htmlspecialchars используется при выводе. Это два. И три. При подстановке в запрос данные надо обрабатывать функцией mysql_real_escape_string (если работаем с mysql и соединение уже установлено).

5. Методы следует называть так, чтобы названия сами за себя говорили о том, что делает этот метод.
Ни a(), ни checkUsers() таковыми не являются.

6. Работаем над логикой.
Нам неинтересен id пользователя, которому пренадлежит введенный логин (в данном случаи). Меняем запрос:
SELECT COUNT(*) WHERE login = $login


7. Каждому классу - свой файл, который будет называться также, как класс (нужно для автозагрузки классов в скрипт, т.е. чтобы include писать не приходилось - но об этом позже).

m4a1fox, не фантан настолько, что я бы такой код вообще не показывал.

Спустя 20 минут, 13 секунд (30.01.2012 - 00:30) m4a1fox написал(а):
neadekvat
ДА ладно....... на скорую накидал.....

Спустя 2 минуты, 58 секунд (30.01.2012 - 00:33) neadekvat написал(а):
Цитата (m4a1fox @ 30.01.2012 - 01:30)
ДА ладно....... на скорую накидал.....

А нахрена? Каков сокральный смысл для автора в твоем коде? В нем даже модификаторы доступа не проставлены - это то, что первым делом в глаза бросается. Я бы на твоем месте удалил (отредактировать, если не можешь удалить) пост. Я бы удалил свои замечания по этому поводу.

Спустя 7 часов, 1 минута, 23 секунды (30.01.2012 - 07:34) realgleb написал(а):
Всем большое спасибо за помощь!

Спустя 1 час, 10 минут, 5 секунд (30.01.2012 - 08:44) inpost написал(а):
SELECT `id` WHERE login = $login LIMIT 1, куда лучше, чем count smile.gif

Спустя 4 часа, 6 минут, 33 секунды (30.01.2012 - 12:51) neadekvat написал(а):
Цитата (inpost @ 30.01.2012 - 09:44)
куда лучше, чем count

Пруфлинк?

Спустя 15 минут, 25 секунд (30.01.2012 - 13:06) inpost написал(а):
neadekvat
Запусти и проверь.
Представь записей 2млн. В первом случае ты находишь нужную запись в самом начале и из-за лимит1 у тебя будет обрываться поиск, всё готово. А во втором случае будет искаться остальные совпадения, что будет по своей механике дольше.
Если мы говорим об индексах, то ссылка на 1 элемент будет быстрее, чем на все элементы, потому что мускулу необходимо будет выполнить лишнее действие - посчитать количество найденных совпадений.

Спустя 32 минуты, 44 секунды (30.01.2012 - 13:39) neadekvat написал(а):
inpost, ага, разница более чем в 10 порядков.
В то время, как ..LIMIT 1 достает 1000 записей за 3 секунды (из двух миллионов), COUNT(*) достает за это же время только 10.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.