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.
Форумы портала PHP.SU » » Вопросы новичков » Нужна помощь по PHP.

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

1. event - 06 Декабря, 2011 - 08:27:27 - перейти к сообщению
Добрый день.
Есть форум, хочу запретить доступ простым пользователям в некоторые Форумы, собственно
написал такой код
PHP:
скопировать код в буфер обмена
  1. if($forumid == 2 && get_user_class() < UC_MODERATOR)
  2. {
  3. stderr("Ошибка", "У вас нет доступа");
  4. }
  5.  

Проверил работает, такс теперь мне еще нужно запрететить доступ к одному форуму делаю так:
PHP:
скопировать код в буфер обмена
  1. if($forumid == 2 && 3 && get_user_class() < UC_MODERATOR)
  2. {
  3. stderr("Ошибка", "У вас нет доступа");
  4. }

Проверил, закрывает только один форум, второй открыт, попробовал так:
PHP:
скопировать код в буфер обмена
  1. if($forumid == 2 || 3 && get_user_class() < UC_MODERATOR)
  2. {
  3. stderr("Ошибка", "У вас нет доступа");
  4. }

Закрыло вообще доступы ко всем форумам, ну вот ребят как тут быть?, спасибо заранее.
2. EuGen - 06 Декабря, 2011 - 08:29:12 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $rgPrivateForums=array(2,3);
  2. if(in_array($forumid, $rgPrivateForums)  && get_user_class() < UC_MODERATORS)
  3. {
  4.    //...
  5. }

- потом добавляйте id форума в массив, так гораздо удобнее.
3. event - 06 Декабря, 2011 - 08:32:48 - перейти к сообщению
EuGen
Спасибо то что надо работает, тыкнул спасибо.
4. Самогонщик - 06 Декабря, 2011 - 08:36:11 - перейти к сообщению
Для полноты картины: $forumid == 2 || 3 рассматривается как ($forumid == 2) || (3), а 3 всегда истинно, поэтому перекрыло всем.

PHP:
скопировать код в буфер обмена
  1. if(($forumid == 2 || $forumid == 3) && get_user_class() < UC_MODERATOR)
  2. {
  3. stderr("Ошибка", "У вас нет доступа");
  4. }
5. event - 06 Декабря, 2011 - 08:38:45 - перейти к сообщению
Хммм, смотри переделал на такой вариант, мне так удобней:
PHP:
скопировать код в буфер обмена
  1. $accessforum['sysop'] = array(2,3);
  2. $accessforum['administrator'] = array(4,5);
  3. $accessforum['moderator'] = array(6,7);
  4.  
  5. function accessforum(){
  6. global $accessforum;
  7.  
  8.   if(in_array($forumid, $accessforum['sysop']) && get_user_class() < UC_MODERATORS)
  9.   {
  10.   stderr("Ошибка", "У вас нет доступа");
  11.   }
  12.  
  13. }


Но перестало работать почему-то
6. Самогонщик - 06 Декабря, 2011 - 08:43:01 - перейти к сообщению
сделай отладочный вывод с помощью dump_var для

in_array($forumid, $accessforum['sysop']) && get_user_class() < UC_MODERATORS
in_array($forumid, $accessforum['sysop'])
get_user_class() < UC_MODERATORS
$forumid
$accessforum['sysop']
get_user_class()
UC_MODERATORS

Короче, нужно понять где и что идёт не так
7. EuGen - 06 Декабря, 2011 - 08:43:25 - перейти к сообщению
event
Ваша функция ничего не подозревает о переменной $forumid
Самогонщик пишет:
dump_var для

И опять наоборот. Таки var_dump
8. event - 06 Декабря, 2011 - 08:45:55 - перейти к сообщению
EuGen
Спасибо помогло, global в функции сделал еще на $forumid.
9. EuGen - 06 Декабря, 2011 - 08:49:03 - перейти к сообщению
event
Я бы советовал убрать все global из функции и заменить их на параметры. Примерно так:
PHP:
скопировать код в буфер обмена
  1. function accessforum(&$rgAccess, $sRole, $iForumId)
  2. {
  3.   if(in_array($iForumId, $rgAccess[$sRole]) && get_user_class() < UC_MODERATORS)
  4.   {
  5.      stderr("Ошибка", "У вас нет доступа");
  6.   }
  7. }
10. Самогонщик - 06 Декабря, 2011 - 08:51:06 - перейти к сообщению
EuGen, испортил часы отладки и переписки..

EuGen пишет:
И опять наоборот. Таки var_dump
Ага, нужно впредь быть внимательнее.
11. event - 06 Декабря, 2011 - 08:53:12 - перейти к сообщению
EuGen
А чем global плох?, я его много где использую, скажи пожалуйста.
12. EuGen - 06 Декабря, 2011 - 08:57:17 - перейти к сообщению
event
Тем, что порождает зависимости и неожиданное поведение функций/методов. Вот есть у Вас функция, как Вы написали. И есть код, который ее вызывает. В Вашем варианте - без параметров. Вот и подумайте:
0. Глядя на вызов функции, можно ли догадаться о том, по каким данным она строит результат?
1. Если Вам нужно перенести код в другой проект, сможете ли Вы это сделать, не изменяя функции?
2. Если у Вас меняются глобальные переменные, сможете ли Вы спрогнозировать, как изменится поведение функций, использующих их? (Или хотя бы понять, на какие функции это изменение повлияет)
3. Если с ответами на вопросы 0.-2. сейчас трудностей нет (или Вы согласны с ними мириться), представьте, что на них нужно ответить спустя полгода-год после того, как Вы написали код.
13. Самогонщик - 06 Декабря, 2011 - 08:59:05 - перейти к сообщению
Он прибивает ваш код гвоздями к глобальным переменным. Через некоторое время проект вырастает, глобальных переменных разводится много и становится совершенно не понятно за что они отвечают и где аукнется любое их изменение.

Усложняют поддержку короче.

 

Powered by ExBB FM 1.0 RC1