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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ООП авторизация

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
gephaest
Отправлено: 01 Октября, 2011 - 11:58:41
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Разбираю чужой скрипт и параллельно пытаюсь написать свое.
Есть некий класс для авторизации, где код

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?
 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2011 - 13:09:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Не видно экранирования $username. Если используются магические кавычки - плохо. Если не используются - это дыра.

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

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

Никакого. Видимо, автор не знал от __autoload.


-----
PostgreSQL DBA
 
 Top
gephaest
Отправлено: 01 Октября, 2011 - 14:51:23
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




__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(), как с этим бороться?

(Отредактировано автором: 01 Октября, 2011 - 15:41:55)

 
 Top
caballero
Отправлено: 01 Октября, 2011 - 16:32:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Как я понял он не может переопределить __autoload(), как с этим бороться?

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
gephaest
Отправлено: 01 Октября, 2011 - 17:00:55
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




А можно поподробнее?
 
 Top
caballero
Отправлено: 01 Октября, 2011 - 17:26:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




function myautoload($className)
{

}

spl_autoload_register('myautoload');


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2011 - 17:55:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




__autoload должен быть только один.
Главное его преимущество - придётся строго соблюдать соответствие путей, имён файлов и имён классов, содержащихся в этих файлах.

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

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

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

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


-----
PostgreSQL DBA
 
 Top
caballero
Отправлено: 01 Октября, 2011 - 19:05:55
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Главное его преимущество - придётся строго соблюдать соответствие путей, имён файлов и имён классов, содержащихся в этих файлах.


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

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

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

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


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

(Отредактировано автором: 01 Октября, 2011 - 19:11:01)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 01 Октября, 2011 - 23:28:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




caballero пишет:
это корень сайта

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

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

Хм, и правда.


-----
PostgreSQL DBA
 
 Top
gephaest
Отправлено: 02 Октября, 2011 - 09:52:46
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Это корень сайта, наверно лишний слеш в начале. Пути /www/index.php, /www/classes/ и т.п.

Спасибо за spl_autoload_register, интересная вещь.
Сейчас у меня в файле index.php стоит автозагрузка функции для БД, все отлично работает. Но есть еще один класс, который тоже требует класс БД. При подключении его к основному файлу опять начинается ругань. Что, для таких случаев регестрировать по несколько функций?

(Отредактировано автором: 02 Октября, 2011 - 10:23:36)

 
 Top
caballero
Отправлено: 02 Октября, 2011 - 11:28:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Регистрить функцию для каждого класса конечно смысла нет
нужно классы сгруппировать по папкам а в функции делать проверку на существование файла если есть тогда инклудишь если нет -возврат и тогда пойдет вызыватся


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
gephaest
Отправлено: 03 Октября, 2011 - 09:51:28
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Провозился с методо туеву кучу времени
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.         }

я нифига не понимаю...
 
 Top
gephaest
Отправлено: 03 Октября, 2011 - 16:46:03
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




емаё, все разобрался. Это была моя глупость.

(Отредактировано автором: 03 Октября, 2011 - 16:50:51)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB