ServerNC 0 Опубликовано: 16 августа 2009 Рассказать Опубликовано: 16 августа 2009 Дошло наконец-то до меня проверить какой идет запрос на SQL. Обнулять мне нужно было не только $news, но и $fav_list, иначе при каждой новой итерации $list вбирал в себя все предыдущие значения и на основании этого делал выборку... Код получился следующий: while ( $row = $db->get_row( $a ) ) { /* Всякая служебная фигня */ $list = explode( ",", $row['Order'] ); foreach ( $list as $daten ) { $fav_list[] = "'" . $daten . "'"; } $list = implode( ",", $fav_list ); $fav_list = ''; // То самое обнуление $favorites = "(" . $list . ")"; $sql = "SELECT id, title FROM " . PREFIX . "_post where id in $favorites"; $sql_result = $db->query( $sql ); while ( $rows = $db->get_row( $sql_result ) ) { $news .= '"'.$rows['title'].'+'.$rows['id'].'" '; } $tpl->set('{order}', $news); $tpl->compile( 'content' ); $news = ''; } Спасибо за помощь, более менее разобрался, буду дальше делать потихоньку) Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 16 августа 2009 Рассказать Опубликовано: 16 августа 2009 $list = explode( ",", $row['Order'] ); foreach ( $list as $daten ) { $fav_list[] = "'" . $daten . "'"; } $list = implode( ",", $fav_list ); $fav_list = ''; // То самое обнуление $favorites = "(" . $list . ")"; а зачем всё это? в одну строку же пишется: $sql = "SELECT id, title FROM " . PREFIX . "_post where id in ({$row['Order']})"; При условии, что $row['Order'] всегда заполнено. Плюс.... не буду утверждать наверняка, но может это можно и через один запроса сделать. Нужно почитать по mysql, может там сразу можно разделить $row['Order'] и там же отправить её как параметр на объединение. ПО крайней мере на 5 наверняка можно. Цитата Ссылка на сообщение Поделиться на других сайтах
ServerNC 0 Опубликовано: 16 августа 2009 Рассказать Опубликовано: 16 августа 2009 Такой код пошел когда было 3 часа ночи и я не знал, что сделать... посмотрю, наверное переработаю... Цитата Ссылка на сообщение Поделиться на других сайтах
Chrono-xXx 0 Опубликовано: 19 августа 2009 Рассказать Опубликовано: 19 августа 2009 (изменено) Вопрос по разработке модов с подключением через шаблон. Имеем мод, который использует функции API. При подключении в шаблоне дважды мы имеем следующее: Fatal error: Call to a member function load_from_cache() on a non-object in ...site.ru\www\engine\modules\modul_name.php on line 44 Что делать? Предполагается, что модуль выполняет различные действия в зависимости от параметров и может/должен быть подключен несколько раз... Изменено 19 августа 2009 пользователем Chrono-xXx Цитата Ссылка на сообщение Поделиться на других сайтах
TopSoft 2 Опубликовано: 19 августа 2009 Рассказать Опубликовано: 19 августа 2009 Вопрос по разработке модов с подключением через шаблон. Имеем мод, который использует функции API. При подключении в шаблоне дважды мы имеем следующее: Fatal error: Call to a member function load_from_cache() on a non-object in ...site.ru\www\engine\modules\modul_name.php on line 44 Что делать? Предполагается, что модуль выполняет различные действия в зависимости от параметров и может/должен быть подключен несколько раз... http://forum.dle-news.ru/index.php?showtopic=47173 Цитата Ссылка на сообщение Поделиться на других сайтах
Chrono-xXx 0 Опубликовано: 19 августа 2009 Рассказать Опубликовано: 19 августа 2009 спасибо, но include я тоже пробовал - не работает, при том что мод по структуре аналогичен твоему Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 19 августа 2009 Рассказать Опубликовано: 19 августа 2009 Автор Класс API скачайте изменённый с сайта Цитата Ссылка на сообщение Поделиться на других сайтах
Chrono-xXx 0 Опубликовано: 22 августа 2009 Рассказать Опубликовано: 22 августа 2009 (изменено) Благодарю, теперь другое предложение по API Допустим мне надо собственный парсер, который обработает текст как нужно моду. Чтобы не трогать файлы движка была бы удобна такая конструкция {include file="engine/modules/mymod.php?text={full-story}"} Естественно вывод будет вместо {full-story} результат работы самого мода. На текущий момент выводится результат работы до и после, но сам текст остается необработанным. Т.е. в модуле если echo "<hr>".$text."<hr>" - то выводятся две линии до и после, но если пытатся применять форматирование к самому содержимому $text - то оно игнорируется. Такое можно реализовать? Изменено 22 августа 2009 пользователем Chrono-xXx Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 093 Опубликовано: 22 августа 2009 Рассказать Опубликовано: 22 августа 2009 Благодарю, теперь другое предложение по API Допустим мне надо собственный парсер, который обработает текст как нужно моду. Чтобы не трогать файлы движка была бы удобна такая конструкция {include file="engine/modules/mymod.php?text={full-story}"} Такое можно реализовать? это вопрос не API, это в пожелания к новым версиям скрипта, и должно быть реализовано на уровне скрипта Цитата Ссылка на сообщение Поделиться на других сайтах
Chrono-xXx 0 Опубликовано: 22 августа 2009 Рассказать Опубликовано: 22 августа 2009 ну да, я извиняюсь, но было бы просто супер Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 093 Опубликовано: 22 августа 2009 Рассказать Опубликовано: 22 августа 2009 Chrono-xXx, Наврядли это технически реализуемо потому что URL требует особого формата и ряда ограничений, mymod.php?text= это полный аналог URL и параметра GET, и соответственно вы можете например передать туда число, или простейший текст, но передать текст содержащий HTML форматирование и все прочее вы не сможете через GET, как например не можете это сделать в URL браузера. Но все это можно сделать и не правя кода скрипта, просто берете в своем модуле из супер глобальной переменной $_GET id новости и считываете текст новости из БД. Нагрузка правда будет немного больше чем править файлы скрипта. Цитата Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 23 августа 2009 Рассказать Опубликовано: 23 августа 2009 это реализуемо причем получить можно любую шаблонную переменную как простой текст так и форматированный со спец и др символами причем для этого не нужны вызовы вида {include file="engine/modules/mymod.php?text={full-story}"} все шаблонные переменные(определенные на момент вызова модуля) доступны модулю по умолчанию в виде {author} => $this->data['{author}'] и тд как сделать написано тут http://forum.4dle.ru/topic10673.html Цитата Ссылка на сообщение Поделиться на других сайтах
Chrono-xXx 0 Опубликовано: 23 августа 2009 Рассказать Опубликовано: 23 августа 2009 Благодарю, только это опять-таки требует изменения файлов скрипта, в частности templates.class.php, а мое пожелание было чтобы была такая возможность не трогая ни один из файлов движка. Все равно большое спасибо, пока будем значит так. Цитата Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 23 августа 2009 Рассказать Опубликовано: 23 августа 2009 (изменено) Благодарю, только это опять-таки требует изменения файлов скрипта, в частности templates.class.php, а мое пожелание было чтобы была такая возможность не трогая ни один из файлов движка. Все равно большое спасибо, пока будем значит так. celsoft вам уже дал верный ответ это вопрос не API, это в пожелания к новым версиям скрипта, и должно быть реализовано на уровне скрипта а потому без правки движка здесь не обойтись хотя я назвал бы это доработка которая после тестирования должна бы быть включена в дистрибутив ни какими другими способами сделать это неполучится Изменено 23 августа 2009 пользователем dlehack Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 28 августа 2009 Рассказать Опубликовано: 28 августа 2009 (изменено) Автор Добавлено две новые фичи. 1) Добавлен метод update_user ($user_id, $vars = Array()) /** * Изменение пользователя * @param $user_id int - ID пользователя * @param $vars array - Массив вида ключ->значение. Все ключи будут заменены на значения. * @return null */ Позволяет реализовывать пополнение баланса или обновление любого другого поля. 2) В метод change_user_group($user_id, $new_group, $timelimit = 0) добавлен необязательный параметр $timelimit /** * Изменение группы пользователя * @param $user_id int - ID пользователя * @param $new_group int - ID новой группы пользователя * @param $timelimit int - Время присутствия в группе * @return bool - true в случае успеха и false если указан ID несуществующей группы */ Поправлена функция смены группу. Добавлен параметр prolong. /** * Изменение группы пользователя * @param $user_id int - ID пользователя * @param $new_group int - ID новой группы пользователя * @param $timelimit int - Время присутствия в группе * @param $prolong bool - Продлить время в группе * @return bool - true в случае успеха и false если указан ID несуществующей группы */ Итак. Если: change_user_group($user_id, $new_group, 3600); На час кидает user_id в группу нужную. Если: change_user_group($user_id, $new_group, 3600, true); На час продлит пользователю его членство в группе Версия обновлена до 0.09 Также добавлено текущее время с коррекцией в $dle_api->_TIME Изменено 28 августа 2009 пользователем IT-Security Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 28 августа 2009 Рассказать Опубликовано: 28 августа 2009 $dle_api->_TIME ИМХО - константами это надо делать. и ИП тоже Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 1 сентября 2009 Рассказать Опубликовано: 1 сентября 2009 Автор Обновил первый пост 1 Цитата Ссылка на сообщение Поделиться на других сайтах
kaliostro_den 2 Опубликовано: 5 сентября 2009 Рассказать Опубликовано: 5 сентября 2009 Вот нашел на одном из форумов, сам еще не смотрел, но у кого есть желание и т.д. можете проверить Уязвимость позволяет удаленному пользователю выполнить произвольный PHP сценарий на целевой системе. Уязвимость существует из-за недостаточной обработки входных данных в параметре «dle_config_api» сценарием api.class.php. Удаленный пользователь может выполнить произвольный PHP сценарий на целевой системе с привилегиями Web сервера. Эксплоит: www.site/path /engine/api/api.class.php?dle_config_api=[shell.txt?] Источник: _http://www.xakep.ru/post/49351/default.asp п.с. надо попробовать, отпишитесь если у кого вышло как на локалке так и на удаленных. Целсофт превед, публикуй фикс Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 093 Опубликовано: 5 сентября 2009 Рассказать Опубликовано: 5 сентября 2009 kaliostro, читайте форум http://forum.dle-news.ru/index.php?showtopic=47514 Цитата Ссылка на сообщение Поделиться на других сайтах
Kvazar 0 Опубликовано: 5 сентября 2009 Рассказать Опубликовано: 5 сентября 2009 (изменено) kaliostro, Спокойствие, только спокойствие Что то я также не понял, и причем здесь переменная dle_config_api, ее вообще нет в этом файле. Ха, увидел где используется dle_config_api, в нелегальных копиях скрипта, ну и ладно нехай их ломают, если подобная уязвимость есть, я даже тестировать ее не буду. Все легальные пользователи могут спать спокойно, у них ничего подобного нет. Изменено 5 сентября 2009 пользователем Kvazar Цитата Ссылка на сообщение Поделиться на других сайтах
Sogorukuhn 0 Опубликовано: 7 сентября 2009 Рассказать Опубликовано: 7 сентября 2009 Вообще я могу бесконечно расширять API, но мне нужны люди, которым это нужно =) Кроме меня и Владимира конечно =) Вот хороший пример отличной API: http://wiki.modxcms.com/index.php/Category:API Юзаем эту CMS на работе, и меня система Снипетов и АПИ очень обрадовала. Комбинируя можно зделать что угодно и на любой вкус. При этом хочю обратить внимание на такие функции как: getDocumentи getDocuments. Самое интерестное в них, это переменные которые передаются данным функциям. array getDocument(int $id[, string $fields[, int $published[, int $deleted]]]) array getDocument(array $ids[, int $published[, int $deleted[, string $fields[, string $where[, string $sort[, string $dir[, string $limit]]]); Тоесть когда вынимаем документы (в случае DLE новости) из БД, то у нас есть множиство параметров настройки какие именно данные, в каком полядке и каком виде нам выдаются. Это только небольшой пример. Цитата Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 7 сентября 2009 Рассказать Опубликовано: 7 сентября 2009 присоединяюсь modx одна из лучших CMF уже писал http://www.modx-cms.ru/modx-api.html здесь список API CMS MODx вполне подойдет как источник идей. Вот например regClientScript - подключает js файлы удобство в том что е сли на сайте используются несколько разных модулей которые при этом подключают одни и теже js файлы ну например jquery.js то функция сама подключит нужные файлы при подключении первого модуля и проигнорирует остальные подключения таким образом разработчику нет необходимости думать над тем подключен ли нужный js можно смело подключать нужный js и точно знать что не будет лишних подключений одинаковых файлов.(надеюсь понятно написал) Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 7 сентября 2009 Рассказать Опубликовано: 7 сентября 2009 Автор Подумаю что можно сделать. Была идея сделать getStaticPage(); так как это часто бывает нужно чтобы вывести у себя в модулях информацию, которая может меняться. Причём сделать полную обработку всех тэгов стат. страницы (Вырезать {PAGEBREAK} наверное только). Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 8 сентября 2009 Рассказать Опубликовано: 8 сентября 2009 IT-Security, пожалуй так повелось, что мне пока АПИ применять необходимости нет. Однако я вижу, что ты делаешь не малую работу, поэтому решил просмотреть файл и возможно какие-то мои рекомендации тебе покажутся полезными. Всё это конечно ИМХО и все мои критически замечания - на самом деле всего лишь форма изложения. 1. change_user_name где обработка $new_name? От АПИ будет реальная польза не только когда оно будет делать простые инсерты в БД, но и когда оно будет выполнять всё то, что делает движок. В противном случае - толковый разраб будет вынужден городить все эти проверки за пределами АПИ (придётся каждую версию отслеживать изменения в движке и менять свой код), а не толковый - будет пихать в базу всё без проверки (и АПИ для него не даст никакой пользы). Не обязательно, чтобы модуль возвращал текст ошибок, он может возвращать только их номера или клычи массива языкового файла. 2. change_user_password - тоже самое для пароля. 3. change_user_email - тоже самое для email 4. external_auth - а где контроль бана по ип и по нику? Опять придётся всё делать за пределами АПИ. А если не делать - АПИ выдаст разрешение аутентификации для стороннего модуля, хотя реально пользователь забанен, и ведь даже не передаст никаких флагов, уведомляющих об этом сторонний модуль. Тут потребуется либо новый запрос, либо писать свой модуль проверки авторизации. 5. external_auth - тоже самое, что и для пунктов 1-3 для полей пароля и ника. Ну хотя бы ! preg_match( "/[\||\'|\<|\>|\"|\!|\?|\$|\@|\/|\\\|\&\~\*\+]/", $_POST['login_name'] ) 6. external_register - тоже самое про проверки валидности входных параметров 7. send_pm_to_user - ...... 8. load_from_cache. В этой функции я затрудняюсь что-либо утверждать, т.к. не владею полной информацией, но мне кажется, что делать три обращения к файлу кэша смысла нет. Зачем проверять сначала его существование, потом таймаут (а если он на 0 - сразу возвращаем ложь, или бесконечный [очень большой] - нет смысла проверять). 9. edit_config - мне кажется необходимо внести запрет на изменение некоторых ключевых параметров скрипта. Той же самой версии, отключение кэша и т.п. (надо смотреть конфиг и искать там критические параметры, которые нельзя разрешать менять сторонним модулям)...Номер версии точно, т.к. он может потом доставить проблем при апгрейде (Только не спрашивай меня - кто захочет его изменить - у нас много умельцев ). Относительно кэша. Что больше всего заставляет парится при работе с ним в дле?))) Мало опций это ещё пол беды. Вторая половина - куча входных параметров, которые нужно много где прописать. Мне кажется лучще бы было сделать следующим образом (взято из собственных разработок и сейчас вполне доволен). Допустим, мне надо получить кэш. Если его нет - выйти, создать и сохранить. Инициализируем кэш: $c_id = $this->sc_filename('all_posts', '-1', false, md5($sql['where']. (string)$this->request['page']), true, 0); (можно без $c_id, это опциональный элемент. У меня прописаны везде this, т.к. я его использую как extends) Получаем $this->sc_get($c_id); Если его нет - ставим флаг сохранения. $this->sc_saveact(true, $c_id); Если вдруг передумали сохранять - $this->sc_saveact(false, $c_id); Почему ставим флаг сохранения, а не сохраняем: потому что кэш может работать и с многомерными массвами. Допустим: array('users', 'tags'), и в ходе работы надо проверить существование всех из них - если кого-то нет - сохранить весь файл. И не нужно прописывать бесконечные if (users - нету || tags - нету || и т.п.), ведь задача - облегчить работу программисту, чтобы было меньше ошибок и написание шло быстрее. Ну и где-то в конце вызвать $this->sc_save(); независимо от того - надо сохранять или нет. Лично у меня это вообще сделано так: function __destruct(){ $this->sc_save(); } (только на 4 пхп не прокатит)Преимущество такого подхода в том, что: - параметры прописаны только один раз - нет необходимсоти таскать данные вне пределах кэша. Иногда у меня в классе установка параметра кэша прописана в одном методе, получение в другом - сохранение в третьем. И мне не нужно таскать всюду эти данные кэша. $c_id в данном случае должен иметь доступ для его ручного назначения. - к одному файлу кэша никогда не обратятся дважды. Название файла сохраняется в мд5 и проверяется при инициализации. Если уже есть - выдаётся только идентификатор.Есть правда и недостаток у такого подхода. Иногда получаются конструкции типа $this->CACHE[$c_id] .= $tpl->result['navigation']; или $tpl->result['navigation'] = $this->CACHE[$c_id]; Дело в том, что нельзя потом делать так unset($this->CACHE[$c_id]), т.к. потом кэш нужно сохранить. Но если подумать - это можно обойти, разрешив сохранение данных сразу в шаблонизаторе. Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 8 сентября 2009 Рассказать Опубликовано: 8 сентября 2009 Автор Учту замечания и посмотрим что сможем сделать. Хочу ещё сделать версию под PHP5 попозже. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.