Здравствуйте. Почти закончил сайт, когда появилось такое требование: "каждый пользователь должен иметь возможность загрузить только один файл". Я придумал такой способ обеспечить это: добавить оператор IF который будет проверять, есть ли в БД файлы за авторством текущего пользователя. Код (PHP): if ($database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'") == 0) { $can_upload = false; $msg = '<div class="jd_div_content"><br />'.JText::_('JLIST_FRONTEND_UPLOAD_FAILD').'<br /><br /></div>'; } else { $can_upload = true; } Этот кусок кода вставляется в файл jdownloads.html.php сразу в след за определением прав доступа к загрузке (после строки 1850). И все бы хорошо. Но само условие судя по всему мной выбрано не правильно. Результат сравнения всегда true. Несмотря на то что myphpadmin по тому же запросу выдает нормальные числа.
Метод setQuery() только подготавливает движок БД к обработке запроса. Чтобы выполнить запрос и вернуть результат нужен метод $database->loadResult(); Примерно так: Код (PHP): $database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'"); if ($database->loadResult() === 0) { ... * loadResult() возвращает null в случае ошибки. Вдруг, например, юзер незалогинен? Поэтому для корректного сравнения лучше проверять идентичность: ===
Спасибо за вариант. Интересно получается: при сравнении Код (PHP): if ($database->loadResult() == 0) результат - всегда "верно" а при Код (PHP): if ($database->loadResult() === 0) всегда "не верно"
=== сравнивает еще и тип данных каждого из аргументов. Можно разок вывести var_dump()'ом обе стороны сравнения, чтобы наверняка знать их типы. Весьма может быть, что loadResult возвращает string. Код (PHP): $database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'"); $test = $database->loadResult(); var_dump($test, 0); jexit(); // эту строку потом закомментить if ($test === 0) { ...
Вы таки были правы, я и сам это подозревал. Чеж придумать. Исправил данную проблему переводом 0 в "стринг" Еще я похоже ошибся тут: Код (PHP): WHERE `created_by` = '$my->username' $my->username - вот в этой функции. Есть другой способ получить имя текущего пользователя?
Сменить тип? (int)$test Код (PHP): $database->setQuery("SELECT COUNT( * ) FROM `#___jdownloads_files` WHERE `created_by` = $my->username'"); $test = $database->loadResult(); if ( (int)$test === 0) { ... А.. млин.. Тогда и null станет числом 0. Значит, проще — надо отдельно проверять, не null ли? Код (PHP): if(is_null($test) { // фигня, ошибка в запросе - непонятно, сколько раз качал чел ... } elseif( $test == 0 ) { // все круто, чел ни разу не скачивал ... } else { // скачал более, чем ни разу ... }
я поступил хитрее. сравниваю со стринговым нулем. если равны, значит записей нет и можно качать. если нет, значит запись есть и загрузка запрещена. проблема теперь только с именем =(