Joomla 1.5 Jdownload одноразовая загрузка

Тема в разделе "Модернизация расширений", создана пользователем NigatiF, 28.01.2011.

  1. Offline

    NigatiF Недавно здесь

    Регистрация:
    28.01.2011
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Здравствуйте.
    Почти закончил сайт, когда появилось такое требование: "каждый пользователь должен иметь возможность загрузить только один файл".
    Я придумал такой способ обеспечить это: добавить оператор IF который будет проверять, есть ли в БД файлы за авторством текущего пользователя.

    Код (PHP):
    1. if ($database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'") == 0)
    2. {
    3.  $can_upload = false;
    4.  $msg = '<div class="jd_div_content"><br />'.JText::_('JLIST_FRONTEND_UPLOAD_FAILD').'<br /><br /></div>';
    5. }
    6. else
    7. {
    8. $can_upload = true;
    9. }


    Этот кусок кода вставляется в файл jdownloads.html.php сразу в след за определением прав доступа к загрузке (после строки 1850).
    И все бы хорошо. Но само условие судя по всему мной выбрано не правильно. Результат сравнения всегда true. Несмотря на то что myphpadmin по тому же запросу выдает нормальные числа.:[
     
  2.  
  3. sergiks
    Offline

    sergiks специалист

    Регистрация:
    10.10.2010
    Сообщения:
    362
    Симпатии:
    36
    Пол:
    Мужской
    Метод setQuery() только подготавливает движок БД к обработке запроса.
    Чтобы выполнить запрос и вернуть результат нужен метод $database->loadResult();
    Примерно так:
    Код (PHP):
    1. $database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'");
    2. if ($database->loadResult() === 0)
    3. { ...

    * loadResult() возвращает null в случае ошибки. Вдруг, например, юзер незалогинен? Поэтому для корректного сравнения лучше проверять идентичность: ===
     
    Последнее редактирование: 28.01.2011
  4. Offline

    NigatiF Недавно здесь

    Регистрация:
    28.01.2011
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Спасибо за вариант.
    Интересно получается:
    при сравнении
    Код (PHP):
    1. if ($database->loadResult() == 0)

    результат - всегда "верно"
    а при
    Код (PHP):
    1. if ($database->loadResult() === 0)

    всегда "не верно"
     
  5. sergiks
    Offline

    sergiks специалист

    Регистрация:
    10.10.2010
    Сообщения:
    362
    Симпатии:
    36
    Пол:
    Мужской
    === сравнивает еще и тип данных каждого из аргументов.
    Можно разок вывести var_dump()'ом обе стороны сравнения, чтобы наверняка знать их типы.
    Весьма может быть, что loadResult возвращает string.
    Код (PHP):
    1. $database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'");
    2. $test = $database->loadResult();
    3. var_dump($test, 0); jexit(); // эту строку потом закомментить
    4. if ($test === 0) { ...
     
    NigatiF нравится это.
  6. Offline

    NigatiF Недавно здесь

    Регистрация:
    28.01.2011
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Вы таки были правы, я и сам это подозревал. Чеж придумать.

    Исправил данную проблему переводом 0 в "стринг"

    Еще я похоже ошибся тут:
    Код (PHP):
    1. WHERE `created_by` = '$my->username'

    $my->username - вот в этой функции.
    Есть другой способ получить имя текущего пользователя?
     
    Последнее редактирование: 29.01.2011
  7. sergiks
    Offline

    sergiks специалист

    Регистрация:
    10.10.2010
    Сообщения:
    362
    Симпатии:
    36
    Пол:
    Мужской
    Сменить тип? (int)$test
    Код (PHP):
    1. $database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'");
    2. $test = $database->loadResult();
    3. if ( (int)$test === 0) { ...


    А.. млин.. Тогда и null станет числом 0.
    Значит, проще — надо отдельно проверять, не null ли?
    Код (PHP):
    1. if(is_null($test) { // фигня, ошибка в запросе - непонятно, сколько раз качал чел
    2. ...
    3. } elseif( $test == 0 ) { // все круто, чел ни разу не скачивал
    4. ...
    5. } else { // скачал более, чем ни разу
    6. ...
    7. }
     
  8. Offline

    NigatiF Недавно здесь

    Регистрация:
    28.01.2011
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    я поступил хитрее. сравниваю со стринговым нулем.
    если равны, значит записей нет и можно качать. если нет, значит запись есть и загрузка запрещена.

    проблема теперь только с именем =(
     
  9. sergiks
    Offline

    sergiks специалист

    Регистрация:
    10.10.2010
    Сообщения:
    362
    Симпатии:
    36
    Пол:
    Мужской
    Зачет. : )

    А что с именем?
     
  10. Offline

    NigatiF Недавно здесь

    Регистрация:
    28.01.2011
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Проблема полностью решена. Благодарю за помощь.
     
    Последнее редактирование: 30.01.2011

Поделиться этой страницей

Загрузка...