Gangster Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 Вообще, можно было бы и создать отдельный форум для таких, как я, ну ладно, к вопросу:Структура Invision Power Board, как я понял такова:Сами скрипты и функции лежат в папке Sources в разных файлах типа Profile.php и т.д в них есть "ссылки" на skin-файлы, а в скин-файлах уже есть "ссылки" на lang-файлы У меня кое-что получилось уже сделать более сложное, а вот тут проблемы:Допустим, мне надо, чтобы если описание клана было равно "" (пустое), отображалось "Нет описания", в противном случае писали бы Описание.Скрипт выглядет так (сам написал, поэтому ошибка может быть и тут):if ($theclandescr == "") { print "Нет информации о клане"; } else { print "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; } Прописываю это в skin-файле, мне в результате так весь этот код и выводит, заменяя переменные $theclanname и $theclandescr на те, которые выдрал из базы. Если поставить в начале скрипта <?php и в конце ?>, то код исчезает и ничего вообще не выводится на его месте.Если просто поставить $theclandescr, то всё правильно выводит описание для этого клана, но мне хотелось бы, чтобы если описания нет, былобы не пусто в этой таблице, а было написано, что нет описания.Как это сделать??? Так выглядет у меня вся функция в skin-файле: function Page_header_members($clan_name, $theclanurl, $theclanforumurl, $theclandescr) { global $ibforums; return <<<EOF <br> <table cellpadding='0' cellspacing='0' border='0' width=80% bgcolor='#000000' align='center'> <tr> <td> <table cellpadding='4' cellspacing='1' border='0' width='100%'> <tr> <td align='left' width='30%' class='titlemedium'>Информация о клане <b>"{$clan_name}"</b></td> <tr> <td align='left' width='10%' class='row1'>Адрес клана: <a href="$theclanurl" target="_blank">$theclanurl</a></td> <tr> <td align='left' width='30%' class='row2'>Адрес форума: <a href="$theclanforumurl" target="_blank">$theclanforumurl</a></td> <tr> <td align='left' width='30%' class='row1'>if ($theclandescr == "") { print "Нет информации о клане"; } else { print "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; } </td> </tr> </table></table> <br><br> <table cellpadding='0' cellspacing='0' border='0' width='600' bgcolor='#000000' align='center'> <tr> <td> <table cellpadding='4' cellspacing='1' border='0' width='100%'> <tr> <td align='left' width='30%' class='titlemedium'>Пользователь</td> <td align='left' width='10%' class='titlemedium'>Сообщения</td> <td align='left' width='30%' class='titlemedium'>Деньги</td> </tr> EOF; } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 function Page_header_members($clan_name, $theclanurl, $theclanforumurl, $theclandescr) { global $ibforums; if ($theclandescr == "") $clan_descriprion = "Нет информации о клане"; else $clan_descriprion = "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; return <<<EOF ..... <td align='left' width='30%' class='row2'>Адрес форума: <a href="$theclanforumurl" target="_blank">$theclanforumurl</a></td> <tr> <td align='left' width='30%' class='row1'>$clan_descriprion</td> ...... EOF; } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 4 Января 2004 Автор Жалоба Поделиться Опубликовано 4 Января 2004 Vanish Вау! Спасибо! Получилось! Теперь буду знать, как это делать.Темку не закрывайте, плиз. Если будут вопросы, я буду писать сюда.P.S За что отвечает EOF; и return <<<EOF ??? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 Vanish В скине нельзя писать любой php код (у тебя стоит провера).Он там продержится вплоть до того момента как ты изменишь этот скин из админки. Хотя, конечно, если ты всегда форум редактируешь только по ftp, то это прокатит. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 Song C такой логикой скины лучше вообще не менять. Хотя замечание верное, лучше так не делать. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 Song заметь не я это писал. От меня здесь только поправка уже существующего кода! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
IBResource Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 (изменено) Gangster Структура Invision Power Board, как я понял такова:Сами скрипты и функции лежат в папке Sources в разных файлах типа Profile.php и т.д в них есть "ссылки" на skin-файлы, а в скин-файлах уже есть "ссылки" на lang-файлыЕсли не понял структуру форума, то милости в статейку: Структура и пути в IPBА вообще перед созданием хаков неплохо было бы некоторые статейки отсюда прочитать:Навигатор А вообще эту проблему решил бы еще до передачи делов в skin файл. Перед строкой выдачи скина, а она у вас такая (имена переменных конечно по другому наверняка называются):$this->output .= $this->html->Page_header_members($clan_name, $theclanurl, $theclanforumurl, $theclandescr);Я бы добавил бы запись:Если не предусмотрено наличие нескольких языков, то так:if ($theclandescr == "") { $theclandescr = "Нет информации о клане"; }Если предусмотрено несколько языков на форуме, то такую:if ($theclandescr == "") { $theclandescr = $ibforums->lang['not_clan_information']; }Естесственно в lang-files после строки $lang = array () для обоих языков для этого хака добавив запись на русском и других языках... на русском такую:'not_clan_information' => "Нет информации о клане",И не было бы проблем со скинами. Не люблю я этот PHP в скинах IMHO, в /sources/ - PHP, в /Skin/ - HTML. Изменено 4 Января 2004 пользователем Oska Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 (изменено) Делать лучше так:1) в функцию скина вводим новый параметр: function some_function(старые_параметры, $new) { Здесь что-то делаем с $new или если применительно к этому примеру просто выводим его: {$new} } 2) находим исходник где some_function вызывается и вписываем туда: if ($theclandescr == "") { $clan_description = "Нет информации о клане"; } else { $clan_description = "<center>Информация о клане <b>$clan_name</b></center><br>$theclandescr"; } $this->html->some_function(старые_передаваемые_параметры, $clan_descriprion); 3) рассинхронизируем скин, чтобы параметр $new в скине попал в базу. Всё. 4) Enjoy! Изменено 4 Января 2004 пользователем Song Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Января 2004 Жалоба Поделиться Опубликовано 4 Января 2004 P.S. Убавьте плиз размер шрифта в теге CODE, потому что мало инфы умещается, строки переносятся, плохо выглядит. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 5 Января 2004 Автор Жалоба Поделиться Опубликовано 5 Января 2004 Спасибо, сейчас переделаю. Php-код будет в sources в clans.php, а HTML - в skinLang-файлы нет необходимости модифицировать, т.к у меня включён только русский язык.Song А чем твоя версия отличается от версии Oska, кроме рессинхронизации скина? Во, ещё вопрос:Как удалить и переименовать столбец clanmoder1, если я его создавал такой командой? alter table `ibf_clans` add clanmoder1 INT NOT NULL Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 Gangster тем что Oska добавил это позже =)))Это сообщение отредактировал Oska - 4 Янв 2004, 21:57ну и решение более правильное с точки зрения построения форума. ALTER TABLE table1 RENAME table2; - Переименование таблицы table1 в table2 ALTER TABLE table2 ADD new_attr varchar(20); - Добавление в таблицу table2 нового аттрибута new_attr с типом varchar длиной в 20 символов. ALTER TABLE table2 CHANGE new_attr varchar(60); - изменение типа аттрибута new_attr в таблице table2 на varchar длинной в 60 символов. ALTER TABLE table2 DROP new_attr; - удалить аттрибут new_attr и таблицы table2 Вроде так. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 5 Января 2004 Автор Жалоба Поделиться Опубликовано 5 Января 2004 Vanish Да, спасибо. Получается. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 5 Января 2004 Автор Жалоба Поделиться Опубликовано 5 Января 2004 Что делает fetch_row()???Пример запроса: $DB->query("SELECT clanid FROM ibf_members WHERE id='$clanmoder1idnew'"); { $r = $DB->fetch_row(); $thismemberclanid = $r['clanid']; }Вопрос очень важет, так как в моём коде есть важная проверка на равенство переменных, и всё получается, но при некоторых случаях она проскакивает. Мне кажется, что в этом виноват fetch_row()Можно узнать, что делает этот fetch_row()??? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 Что делает fetch_row()???Это форумный аналог функции PHP mysql_fetch_array. Если $DB->query делает запрос к базе, то $DB->fetch_row выдёргивает все результаты этого запроса. Если запрос не дал результатов (вернул 0 строк), то $r (в твоём примере) получит пустое значение.Если запрос вернул один результат, то $r будет массивом, к элементам которого можно обращаться по именам ячеек в таблице, для которых ты делал SELECT.Поясняю - если сделать так:$DB->query("SELECT id, name, location, last_visit FROM ibf_members WHERE name = 'Vasya Pupkin'"); $r = $DB->fetch_row();то значения $r['id'], $r['name'], $r['location'] будут хранить информацию про Васю Пупкина.Если запрос вернул несколько результатов, то вызов $DB->fetch_row() нужно запихать в циклwhile ($r = $DB->fetch_row()) { что делать; }и выполнять в цикле обработку каждой строки запроса. Если запрос вернул несколько результатов, а ты вызываешь $DB->fetch_row() не в цикле (как в твоём примере), то значения $r будут взяты из самого первого результата запроса. Пример:$DB->query("SELECT * FROM ibf_members ORDER BY join_date ASC"); $r = $DB->fetch_row();$r['name'] сейчас будет хранить имя того пользователя, который зарегистрировался самым первым (у которого дата join_date самая маленькая). Так понятно?.. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 5 Января 2004 Автор Жалоба Поделиться Опубликовано 5 Января 2004 Понятно, но вчитывался 3 раза.Значит, если я пущю запросSELECT name, last_visit FROM ibf_members WHERE id=2то мне можно это не пихать в цикл, а если пущю запросSELECT name, last_visit FROM ibf_members WHERE id>2то тут нужно пихать в цикл, так как id>2 это 3, 4, 5.....и значений будет много???? Что делает $DB->get_num_rows()???я так понял, что она сообщает о том, что нет такой записи.Допустим, вот такой код $DB->query("SELECT clanid, clanname FROM ibf_members WHERE id=". $ibforums->member['id'] .""); if ( !$DB->get_num_rows() ) { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_such_user' ) ); } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 Что делает $DB->get_num_rows()???она отвечает на вопрос:и значений будет много???? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Остап Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 (изменено) Gangster function get_num_rows() { return mysql_num_rows($this->query_id); } Сколько строчек ( rows ) вернул данный запрос в базу if ( !$DB->get_num_rows() )Заходим в if, только, если по данному запросу ничего в БД не найдено ... ЗЫ Пойди по ссылке ( в коде ПХП mysql_num_rows отображена как ссылка - там дополнят картину профессонально ) ... ЗЫЫ Если задаёшься подобными вопросами - полезно будет рассмотреть класс и методы классаclass db_driver что в файле sources/Drivers/mySQL.php ... Изменено 5 Января 2004 пользователем Остап Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 и значений будет много????Много или нет - качественная категория, а $DB->get_num_rows() возвращает число рядов. Сколько строчек ( rows ) вернул данный запрос в базуТогда уж "к базе" или "из базы"... Запросы SELECT ничего не возвращают "в базу". Заходим в if, только, если по данному запросу ничего в БД не найдено ...Наоборот - если хоть что-то найдено. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Остап Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 Наоборот - если хоть что-то найдено.theIggs Не прав - смотри внимательнее - if ( !$DB->get_num_rows() ), или проще if ( $DB->get_num_rows() == 0 ) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 Тьфу, блин, протупил. Остап Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Остап Опубликовано 5 Января 2004 Жалоба Поделиться Опубликовано 5 Января 2004 Хех ... Ясен перец Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 6 Января 2004 Автор Жалоба Поделиться Опубликовано 6 Января 2004 Спасибо, теперь понял.Самое интересно, у меня есть проверка на равенство переменныхif ($thisclanid == "$thismemberclanid") { ................ } else { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'not_in_your_clan' ) ); }Так вот, если в проверке стоит ==, то она прекрасно работает, и не вычисляет в TRUE, ни при каких условиях, если переменные не равны, а если поставить только один знак =, то она будет вычислять в TRUE в одном случае, если (вообщем долго объяснять), но при этом переменные будут не равны, но всёже в большенстве случаях она проходит.Неужели такая большая разница в том, что я поставил = или ==??? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
IBResource Опубликовано 6 Января 2004 Жалоба Поделиться Опубликовано 6 Января 2004 Gangster, разница, конечно, есть. = оператор присваивания. То есть след. запись присвоит переменной $a значение переменной $b:$a = $b== оператор сравнения. Здесь собственно идет проверка на равенство...if ($a == $Вот ссылочка по теме:http://www.php.net/manual/ru/language.oper....comparison.php Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Gangster Опубликовано 6 Января 2004 Автор Жалоба Поделиться Опубликовано 6 Января 2004 Понятно, спасибо.У меня ещё вопрос:Можно ли в разных функциях называть переменные одинаково?Например, в function do_clan_add_join() { global $ibforums, $DB, $std; $clan = "Клан"; } function clan_add_join() { global $ibforums, $DB, $std; $clan = "Ха-ха-ха"; } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 6 Января 2004 Жалоба Поделиться Опубликовано 6 Января 2004 Если они не глобальные то можно =)))) А вообще RTFM. Создается впечатление что хочется написать, да не могу так как основ не знаю. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.