Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ООП авторизация
Форумы портала PHP.SU » » Объектно-ориентированное программирование » ООП авторизация

Страниц (1): [1]
 

1. gephaest - 01 Октября, 2011 - 11:58:41 - перейти к сообщению
Разбираю чужой скрипт и параллельно пытаюсь написать свое.
Есть некий класс для авторизации, где код

PHP:
скопировать код в буфер обмена
  1. public function login($username, $password)
  2.  
  3. {
  4.  
  5. $hashedPassword = md5($password);
  6. $result = mysql_query("SELECT * FROM users WHERE username = '$username' AND
  7. password = '$hashedPassword'");
  8. if(mysql_num_rows($result) == 1)
  9. {
  10. $_SESSION["user"] = serialize(new User(mysql_fetch_assoc($result)));
  11. $_SESSION["login_time"] = time();
  12. $_SESSION["logged_in"] = 1;
  13. return true;
  14. }else{
  15. return false;
  16. }
  17. }

И некий класс методом для работы с профилем и т.п., где конструктор
PHP:
скопировать код в буфер обмена
  1. function __construct($data) {
  2. $this->id = (isset($data['id'])) ? $data['id'] : "";
  3. $this->username = (isset($data['username'])) ? $data['username'] : "";
  4. $this->hashedPassword = (isset($data['password'])) ? $data['password'] : "";
  5. $this->email = (isset($data['email'])) ? $data['email'] : "";
  6. $this->joinDate = (isset($data['join_date'])) ? $data['join_date'] : "";
  7. }


Насколько грамотно использовать такой подход?

Так-же я не понимаю, где правильно создавать объекты. У автора скрипта создается некий global.inc.php, где он подключат все классы с помощью require_once и создает там объекты. Только какой в этом смысл, если существует функция __autoload?
2. Мелкий - 01 Октября, 2011 - 13:09:50 - перейти к сообщению
Не видно экранирования $username. Если используются магические кавычки - плохо. Если не используются - это дыра.

В остальном - криминала не вижу.

gephaest пишет:
Только какой в этом смысл, если существует функция __autoload?

Никакого. Видимо, автор не знал от __autoload.
3. gephaest - 01 Октября, 2011 - 14:51:23 - перейти к сообщению
__autoload() также можно использовать в файлах классов?

К примеру
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. function __autoload($class_name) {
  4.  
  5.       require_once '/classes/' . $class_name .  '.class.php';
  6.   }
  7. class User {

Для файлов типа имя.class.php



UPDATE 16:41
Так, начал всё свое отлаживать, ничего не работает...
Все папки лежать в /classes/, название файлов имя_класса.class.php
в корне index.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function __autoload($class_name) {
  4.  
  5.       require_once '/classes/' . $class_name . '.class.php';
  6.   }
  7. $db= new db();
  8. $db->connect(); // тест БД
  9. $login= new logc();
  10. ?>


/classes/logc.class.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. function __autoload($class_name) {
  4.  
  5.       require_once $class_name . '.class.php';
  6.   }
  7.  
  8. class logc {
  9.         $db = new db();
  10. // какой-то страшный индусский код
  11. }


Ругается
Цитата:
Fatal error: Cannot redeclare __autoload() (previously declared in Z:\home\phg\www\index.php:2) in Z:\home\phg\www\classes\logc.class.php on line 6

Как я понял он не может переопределить __autoload(), как с этим бороться?
4. caballero - 01 Октября, 2011 - 16:32:16 - перейти к сообщению
Цитата:
Как я понял он не может переопределить __autoload(), как с этим бороться?

Дать функции другое имя и зарегистрировть ее как автолоад
5. gephaest - 01 Октября, 2011 - 17:00:55 - перейти к сообщению
А можно поподробнее?
6. caballero - 01 Октября, 2011 - 17:26:38 - перейти к сообщению
function myautoload($className)
{

}

spl_autoload_register('myautoload');
7. Мелкий - 01 Октября, 2011 - 17:55:52 - перейти к сообщению
__autoload должен быть только один.
Главное его преимущество - придётся строго соблюдать соответствие путей, имён файлов и имён классов, содержащихся в этих файлах.

gephaest пишет:
Все папки лежать в /classes/

Странная идея, размещать веб-проект в корне файловой системы. Однако

caballero пишет:
Дать функции другое имя и зарегистрировть ее как автолоад

Костыль. autoload всё равно только один будет.
8. caballero - 01 Октября, 2011 - 19:05:55 - перейти к сообщению
Цитата:
Главное его преимущество - придётся строго соблюдать соответствие путей, имён файлов и имён классов, содержащихся в этих файлах.


Это к чему. какой способ расположения задашь такой и будет

Цитата:
Странная идея, размещать веб-проект в корне файловой системы.

это корень сайта

Цитата:
Костыль. autoload всё равно только один будет.


что значит один? сколько будет зарегистрировано функций столько и вызовется
нормальная практика при создании модульного сайта
каждый модуль регистрит свою функцию и грузит классы как считает нужным
9. Мелкий - 01 Октября, 2011 - 23:28:53 - перейти к сообщению
caballero пишет:
это корень сайта

include и компания работают с файловыми путями. /classes/ - директория classes в корне ФС, а не в DOCUMENT_ROOT.

caballero пишет:
что значит один? сколько будет зарегистрировано функций столько и вызовется

Хм, и правда.
10. gephaest - 02 Октября, 2011 - 09:52:46 - перейти к сообщению
Это корень сайта, наверно лишний слеш в начале. Пути /www/index.php, /www/classes/ и т.п.

Спасибо за spl_autoload_register, интересная вещь.
Сейчас у меня в файле index.php стоит автозагрузка функции для БД, все отлично работает. Но есть еще один класс, который тоже требует класс БД. При подключении его к основному файлу опять начинается ругань. Что, для таких случаев регестрировать по несколько функций?
11. caballero - 02 Октября, 2011 - 11:28:57 - перейти к сообщению
Регистрить функцию для каждого класса конечно смысла нет
нужно классы сгруппировать по папкам а в функции делать проверку на существование файла если есть тогда инклудишь если нет -возврат и тогда пойдет вызыватся
12. gephaest - 03 Октября, 2011 - 09:51:28 - перейти к сообщению
Провозился с методо туеву кучу времени
PHP:
скопировать код в буфер обмена
  1.  
  2.         public function getId($b) {
  3.         $db=new db();
  4.         $db->connect();
  5. $sql="SELECT id FROM account WHERE name='$b'";
  6. $query=mysql_query($sql);
  7.  
  8. if(mysql_num_rows($query)) {
  9.         while($d=mysql_fetch_assoc($query)) {
  10.         $name=$d['name'];
  11.                 return $name;
  12.         }
  13. }
  14.  
  15.         }

я нифига не понимаю...
13. gephaest - 03 Октября, 2011 - 16:46:03 - перейти к сообщению
емаё, все разобрался. Это была моя глупость.

 

Powered by ExBB FM 1.0 RC1