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 :: Версия для печати :: ООП пытаюсь писать [4]
Форумы портала PHP.SU » » Объектно-ориентированное программирование » ООП пытаюсь писать

Страниц (5): « 1 2 3 [4] 5 »
 

46. caballero - 29 Июля, 2013 - 18:04:53 - перейти к сообщению
зачем вам тогда ООП если можно сляпать массив и все туда запихнуть

и шо сие за конструкция?

PHP:
скопировать код в буфер обмена
  1. echo $_SESSION->getUser("name")



по идее должно быть

Цитата:
echo $_SESSION->getUser()->getName();


во т это в конструкторе тоже не годится
Цитата:
$_SESSION = $this;



и чего вы данные с формы в юзера пихаете


PHP:
скопировать код в буфер обмена
  1. $user = User::checkLogin($_POST['name'],  $_POST['password']);
  2.  
  3. if($user  instanceof  User){
  4.    $_SESSION["user"] = $user;
  5. }
  6.  

а дальше где нужно уже как написано выше

PHP:
скопировать код в буфер обмена
  1. echo $_SESSION->getUser()->getName();


если разлогинися

$_SESSION["user"] = null;


еслественно нужны проверки на null;
потму я и написал в соседней ветке что лучше фейковый юзер
47. Hapson - 29 Июля, 2013 - 18:24:35 - перейти к сообщению
caballero пишет:
и шо сие за конструкция?

Ну эта конструкция выводит имя
caballero пишет:
по идее должно быть

Цитата:
echo $_SESSION->getUser()->getName();

Еще один метод?
caballero пишет:
во т это в конструкторе тоже не годится
Цитата:
$_SESSION = $this;

$_SESSION['user'] = $this ?
caballero пишет:
и чего вы данные с формы в юзера пихаете

Не ну это для примера, конечно данные фильтруются, запрос в БД...
И все это конечно не в конструкторе. Просто коротко написал.
Мне не понятно как положить объект в сессию и потом обращаться к его свойствам.
Плюс еще прочитал, что стартовать сессию при таком раскладе нужно после чтения классов. Но у меня почему-то и так заработало.
Я сначала отправлял данные, потом комментировал строки приема данных и объявления нового объекта, и в сессии все равно оставался объект класса Users.
caballero пишет:
если разлогинися

$_SESSION["user"] = null;


еслественно нужны проверки на null;
потму я и написал в соседней ветке что лучше фейковый юзер

В какой ветке? Какой фейковый?

И вообще я что-то не пойму смысла. Свойства приватные и чтобы к ним обратиться, нужно писать метод. В чем смысл?
48. caballero - 29 Июля, 2013 - 20:34:12 - перейти к сообщению
Цитата:
Еще один метод?

да
лишнее написал

echo $_SESSION["user"]->getName();

Цитата:
Мне не понятно как положить объект в сессию и потом обращаться к его свойствам.

я ж писал
$_SESSION["user"] = $user;
...
$_SESSION["user"]->getName();

Цитата:
Плюс еще прочитал, что стартовать сессию при таком раскладе нужно после чтения классов. Но у меня почему-то и так заработало.
если в сессии хранятся екземпяры классов то до старта сесси доджны быть включены инклуды с классами либо подключен автолоад
49. Hapson - 29 Июля, 2013 - 21:23:52 - перейти к сообщению
caballero пишет:
я ж писал
$_SESSION["user"] = $user;
...
$_SESSION["user"]->getName();

Ага понятно. То есть в $_SESSION['user'] кладем авторизованного юзера со всеми нужными свойствами и имеем метод для обращения к этим самым свойствам.
А почему такой метод не подойдет

PHP:
скопировать код в буфер обмена
  1. class Users{
  2.    private $name;
  3.    private $password;
  4.  
  5.    function getUserData($val){
  6.       return $this->$val;
  7.    }
  8. }
  9.  
  10. //и обращаться
  11.  
  12. echo $_SESSION['user']->getUserData("name");


PS

У меня новая катастрофа... отключил куки в браузере и сломалась авторизация. Авторизация проходит, но сбрасывается после первого обновления страницы.
В .htaccess

php_value session.use_trans_sid 1
php_value session.use_cookies 1
php_value session.use_only_cookies 0

PHPSESSID не передается...
50. caballero - 29 Июля, 2013 - 21:39:07 - перейти к сообщению
Цитата:
А почему такой метод не подойдет

подойдет но как то это через одно место

лучше уж слделайте поля класса публичными и обращайтесь напрямую

Цитата:
У меня новая катастрофа... отключил куки в браузере и сломалась авторизация.

ну и зачем их отключать и делать катастрофу на ровном месте?
51. Hapson - 29 Июля, 2013 - 21:44:50 - перейти к сообщению
caballero пишет:
лучше уж слделайте поля класса публичными и обращайтесь напрямую

Ну вот и я о том же - в чем смысл приватности?
caballero пишет:
ну и зачем их отключать и делать катастрофу на ровном месте?

Ну так, если пользователь отключит? phpsessid генерируется при каждом обновлении, но в адресную строку не передается.
Или авторизация без куков невозможна?
52. caballero - 29 Июля, 2013 - 22:02:49 - перейти к сообщению
Цитата:
Ну вот и я о том же - в чем смысл приватности?

в PHP смысла немного а в компилируемых языках там можно реально закрыть доступ к приватным членам.

Цитата:
Ну так, если пользователь отключит?

с какой стати? тем более у него при этом будут проблеммы и с другими сайтами.

Цитата:
Или авторизация без куков невозможна?


авторизаия тут не при чем. просто не работает сессия. Но вообще она должна работать присваивая SESSIONID к URL
53. Hapson - 29 Июля, 2013 - 22:17:15 - перейти к сообщению
caballero пишет:
в PHP смысла немного а в компилируемых языках там можно реально закрыть доступ к приватным членам.

Теперь ясно.
caballero пишет:
с какой стати? тем более у него при этом будут проблеммы и с другими сайтами.

Ну так-то да - кто отключил, это ихние проблемы. Меня с этого форума выкидывает без куков. Просто я думал, что это я что-то не так написал в скрипте. Вроде написано, что phpsessid автоматически подставляется, но что-то не подставляется он.
Сделал такую ссылку:
PHP:
скопировать код в буфер обмена
  1. <a href="http://blog/index.php?<?PHP echo SID ?>">Link</a>

При клике по ней id сессии не меняется и не выкидывает. А если кликнуть на
PHP:
скопировать код в буфер обмена
  1. <a href="http://blog/index.php">Link</a>

то id меняется и сразу выкидывает. id не подставляется автоматом, как пишут.
(Добавление)
PS
Я так понял, чтоб работало у всех, то нужно писать так
PHP:
скопировать код в буфер обмена
  1. session_id(md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']));//и еще что-нибудь...


И в к каждой ссылке приписывать <?php echo SID ?>
И еще формы....
(Добавление)
PPS
В формы вставляется скрытое поле. А вот к ссылкам не добавляется phpsessid
Ну и ладно...
54. Hapson - 06 Августа, 2013 - 23:58:07 - перейти к сообщению
Наставьте меня на путь истинный Огорчение
Пишу модуль управления контентом. Пока в папке mod_articles есть два файла:
articles.php - обрабатывает форму добавления статьи
articles_form.php - форма добавления

В форме есть поля:
category
title
alias (заполняется в ручную или формируется из title, но обязательно соответствует шаблону "a-z0-9-")
article (сама статья)
public (показывать или нет статью)
created (дата создания)
description
keywords
robot ("index, follow", "index, nofollow", "noindex, follow" или "noindex, ofollow")

И есть класс, который по задумке будет сохранять новые статьи, обновлять существующие (редактирование) и выводить статьи.
Пока в классе ничего нет, кроме функции транслитерации для формирования alias.

Проблема в чем: кто должен проверять валидность полей формы - модуль или метод класса?
Сейчас у меня в файле модуля куча if, которые проверяют валидность. После поста проверяются все поля и если где-то есть несоответствие, то сообщение об ошибке пишется в массив $_SESSION['tmp_art']. После сбора всех ошибок, провряется, есть ли этот массив, и если он есть, то происходит редирект на форму и вывод всех найденных ошибок. Введенные данные вставляются в форму.

Так вот, где должна проходить валидация полей - в файле модуля или в методе класса - saveArticle().
Модуль должен передать методу $_POST или он должен его подготовить для вставки?
55. DeepVarvar - 07 Августа, 2013 - 02:10:31 - перейти к сообщению
DelphinPRO пишет:
на этот вопрос нет однозначного ответа. как решите, так и будет. главное, чтобы это было удобно.
пожно подумать в таком направлении: данные нужно валидировать не только в модуле статей, а и в других модулях. значит код валидации следует вынести оттуда, и сделать легко доступным. Например описать несколько функций для валидации рзличных типов данных, или запилить целый класс Validator с набором методов (вероятно, статичных).
И это лишь одно из возможных видений решения задачи.
56. Hapson - 07 Августа, 2013 - 18:03:27 - перейти к сообщению
DeepVarvar
Прошу прощения за дубль. Просто запостил сообщение в старую тему, смотрю - а она не поднялась вверх, думаю ответов уже не дождусь. Поэтому начал новую тему.
DelphinPRO
Все понятно. Мда... дальше будет видно. Думаю лучше оставить валидацию самому модулю, так как процесс специфичный - много нужно проверять. У каждого поля свои особенности.
(Добавление)
PS
А вообще нормальный ли это подход - организовывать сборщик ошибок посредством сессии? Просто не вижу иного способа кроме как задействовать БД. В процессе добавления статьи сессия однозначно будет доступна, так как для данного действа необходимо авторизоваться на сайте.
57. DelphinPRO - 07 Августа, 2013 - 18:48:22 - перейти к сообщению
сессия доступна даже без авторизации Улыбка

подход вполне нормальный.
58. Hapson - 07 Августа, 2013 - 19:40:27 - перейти к сообщению
DelphinPRO пишет:
сессия доступна даже без авторизации Улыбка

подход вполне нормальный.

Доступна... если она стартовала и у пользователя включены куки.
Массив $_SESSION доступен и без session_start(), но это какбы недокументырованная возможность.
Ну а я больше не вижу способа передавать ошибки между перезапросами страниц. Только БД или сессия. Ну я так думаю, те у кого откл куки - идут лесом.
Однако такой способ отлова ошибок жестко обязывает стартовать сессию для каждого. То есть уже не получится выборочный старт сессии только для тех, кто уже заходил на сайт.
59. DelphinPRO - 07 Августа, 2013 - 23:22:35 - перейти к сообщению
Hapson пишет:
и у пользователя включены куки.
неверно
Hapson пишет:
Однако такой способ отлова ошибок жестко обязывает стартовать сессию для каждого.
Пожалуйста - стартуйте только для тех, кто ошибся.
Hapson пишет:
Ну а я больше не вижу способа передавать ошибки между перезапросами страниц.

Сесси как раз и созданы для того, чтобы передавать данные между запросами.
60. caballero - 07 Августа, 2013 - 23:40:18 - перейти к сообщению
Hapson
почему бы вам не почитать какой нибудь учебник.
В том числе как работать с сессиями.

Зачем использовать метод тыка и предположения если есть четкие описания как что работает и для чего применяется.

 

Powered by ExBB FM 1.0 RC1