radimir 0 Опубликовано: 23 февраля 2011 Рассказать Опубликовано: 23 февраля 2011 сайт u4824.netangels.ru делаю свой модуль инклюдю его. использую апи для вытаскиания новостей... модуль срабатывает один раз второй рай ругается на функцию апи... вот текст модуля, чего не то делаю??? <? if(!defined('DATALIFEENGINE')) { die("Hacking attempt!"); } include_once(ENGINE_DIR . '/api/api.class.php'); if ($cat == "2") { $cat_link = '<a href="/books/">книги</a>'; }; if ($cat == "4") { $cat_link = '<a href="/autors/">авторы</a>'; }; //$cat="2"; // данные для выборки $fields = "*"; $start = 0; $limit = 1; $sort = "RAND()"; $data = $dle_api -> take_news ( $cat, $fields, $start, $limit, $sort ); foreach ($data as $str) { $title_link = $str[id] . '-' . $str[alt_name]; echo '<div class="base shortstory">'; echo '<h3 class="btl"><a href=' . $title_link . '.html>' . $str[title] . '</a></h3>'; echo '<div class="maincont">' . $str[short_story] . '</div>'; echo '<br><a href=' . $title_link . '.html>читать дальше...</a>'; echo '<p class="argcat orang small"><b>Все ' . $cat_link . '</b></p>'; echo '</div>'; //print_r($str); }; ?> Цитата Ссылка на сообщение Поделиться на других сайтах
zgr 72 Опубликовано: 24 февраля 2011 Рассказать Опубликовано: 24 февраля 2011 Нужно делать хотя бы элементарные проверки на существование переменных, их тип, заполненность данных и сами данные и т.д. Заменить ваш горе-мод на: if ($cat == "2") $cat_link = '<a href="/books/">книги</a>'; else if ($cat == "4") $cat_link = '<a href="/autors/">авторы</a>'; else $cat_link = ''; //Чё оно такое - фиг знает, раз чё-то тащите из БД, значит, должны знать чё и как. if (isset($cat) && $cat>0) $data = $dle_api -> take_news ( $cat, $fields, $start, $limit, $sort ); if ($data && is_array($data) && $data!=null) { foreach ($data as $str) {...} } [/code] Попробуйте П.С. Не забывайте указывать какие именно ошибки: строка, файл и т.д. и сам текст ошибки цитировать. Цитата Ссылка на сообщение Поделиться на других сайтах
radimir 0 Опубликовано: 1 марта 2011 Рассказать Опубликовано: 1 марта 2011 Автор Спасибо за ответ, но даже после изменения кода как вы сказали <? if(!defined('DATALIFEENGINE')) { die("Hacking attempt!"); } include_once(ENGINE_DIR . '/api/api.class.php'); //начальные данные $fields = "*"; $start = 0; $limit = 1; $sort = "RAND()"; if ($cat == "2") $cat_link = '<a href="/books/">книги</a>'; else if ($cat == "4") $cat_link = '<a href="/autors/">авторы</a>'; else $cat_link = ''; if (isset($cat) && $cat>0) $data = $dle_api -> take_news ( $cat, $fields, $start, $limit, $sort ); if ($data && is_array($data) && $data!=null) { foreach ($data as $str) { $title_link = $str[id] . '-' . $str[alt_name]; echo '<div class="base shortstory">'; echo '<h3 class="btl"><a href=' . $title_link . '.html>' . $str[title] . '</a></h3>'; echo '<div class="maincont">' . $str[short_story] . '</div>'; echo '<br><a href=' . $title_link . '.html>читать дальше...</a>'; echo '<p class="argcat orang small"><b>Все ' . $cat_link . '</b></p>'; echo '</div>'; //print_r($str); //{$cat_info[$category_id]['name']} }; }; //print_r ($cat_info[1]); unset ($data); ?> выдает ошибку - Fatal error: Call to a member function take_news() on a non-object in /home/u4824/u4824.netangels.ru/www/engine/modules/rnd.php on line 16 в шаблоне пишу вот так - <td valign="top"> {include file="engine/modules/rnd.php?cat=4"} {include file="engine/modules/rnd.php?cat=2"} </td>почему то ругается на объект... хотя если писать все в одном файле - а не вызывать два раза функцию - все ок! выводит то что надо... чего он на объект то ругается не пойму. я бы с удовольствием сделал все в одном файле, но в шаблоне код надо вставлять в разных местах и совсем не хочется писать весь html код шаблона в модуле... Цитата Ссылка на сообщение Поделиться на других сайтах
zgr 72 Опубликовано: 1 марта 2011 Рассказать Опубликовано: 1 марта 2011 (изменено) Все версии ДЛЕ до 8.5 лажовые, в них нет каких-либо проверок на переменные, как только что-то писал под ДЛЕ, вываливалась всегда куча ошибок с парсеров и фиг знает чего из ДЛЕ, хотя хаки/моды к этим файлам ДЛЕ никакого отношения не имели. Простой совет: не пользуйтесь тем кривым АПИ, а юзайте просто классы ДЛЕ, это надёжней, только код чуток больше. Выглядит примерно так: $sql = "SELECT * FROM dle_post WHERE aproove='1' ORDER BY RAND() LIMIT 1"; $data = $db->query($sql); Такой код можно хотя бы как-то проконтролировать на ошибки самому. Изменено 2 марта 2011 пользователем zgr Цитата Ссылка на сообщение Поделиться на других сайтах
radimir 0 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 (изменено) Автор Простой совет: не пользуйтесь тем кривым АПИ, а юзайте просто классы ДЛЕ, это надёжней, только код чуток больше. Выглядит примерно так: $sql = "SELECT * FROM dle_post WHERE aproove='1' ORDER BY RAND() LIMIT 1"; $data = $db->query($sql); Такой код можно хотя бы как-то проконтролировать на ошибки самому. прихожу к такому мнению... про approve нашел что это такое, но мне о надо категорию выбрать определенную, а не все новости подряд, хотя все тоже не выводятся.... написал так if (isset($cat) && $cat>0) $sql = "SELECT * FROM dle_post WHERE category='4' & approve='1' ORDER BY RAND() LIMIT 1"; $data = $db->query($sql); результату нету... то есть совсем нету ничего не возвращается похоже. Изменено 2 марта 2011 пользователем radimir Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 082 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 Причем здесь API и прочее, нужно просто писать правильный код своего модуля и проблем тогда не будет, а ошибка у вас в одной строке а именно: include_once(ENGINE_DIR . '/api/api.class.php'); А теперь обратитесь к документации PHP и прочитайте что делает функция include_once. Она подключает файл только один !!! раз, за все время работы скрипта. А подключений у вас в шаблоне несколько, т.е. модулю нужно выполниться несколько раз, и при втором подключении в шаблоне, API попросту не будет работать, т.к. оно не подключиться и соответственно будет ошибка. Нужно заменить эту строчку на include(ENGINE_DIR . '/api/api.class.php'); и все. Тогда ошибки Fatal error: Call to a member function take_news() on a non-object in /home/u4824/u4824.netangels.ru/www/engine/modules/rnd.php не будет. Цитата Ссылка на сообщение Поделиться на других сайтах
radimir 0 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 Автор эппс. я почемуто думал что раз один раз апи проинклюдили, то этого и достаточно... получается надо каждый раз его цеплять? или там разные области действий переменных? Цитата Ссылка на сообщение Поделиться на других сайтах
radimir 0 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 Автор эппс. я почемуто думал что раз один раз апи проинклюдили, то этого и достаточно... получается надо каждый раз его цеплять? или там разные области действий переменных? .... Урра! заработало с include! огромное спасибо, но все равно не понятно почему одного раза подключиться ему мало?вопрос закрыт! Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 082 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 но все равно не понятно почему одного раза подключиться ему мало? потому что подключение {include file="engine/modules/rnd.php?cat=4"} запускает ваш модуль в своей изолированной среде и его переменные умирают и недоступны в после того как он отработал, а подключение include_once распространяется на всю область скрипта и имеет суперглобальную область действия. Можно было бы оставить include_once но тогда нужно было немного сложнее писать сам код модуля, и делать проверку наличия класса DLE_API и переинациализировать его если модуль подключается повторно. Я вам дал лишь самый простейший и быстрый способ устранения ошибки. Цитата Ссылка на сообщение Поделиться на других сайтах
radimir 0 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 Автор но все равно не понятно почему одного раза подключиться ему мало? потому что подключение {include file="engine/modules/rnd.php?cat=4"} запускает ваш модуль в своей изолированной среде и его переменные умирают и недоступны в после того как он отработал, а подключение include_once распространяется на всю область скрипта и имеет суперглобальную область действия. Можно было бы оставить include_once но тогда нужно было немного сложнее писать сам код модуля, и делать проверку наличия класса DLE_API и переинациализировать его если модуль подключается повторно. Я вам дал лишь самый простейший и быстрый способ устранения ошибки. вот теперь стало примерно понятно что происходит. а что значит в своей изолированной среде? в котором файле про это прочитать поподробнее? %) Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 082 Опубликовано: 2 марта 2011 Рассказать Опубликовано: 2 марта 2011 в котором файле про это прочитать поподробнее? %) Это не в файлах скрипта нужно читать, а в документации PHP, или учебниках по PHP, например вот статья описывающая области жизни переменных http://ruseller.com/lessons.php?rub=&id=751 Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.