2man Опубликовано 30 Октября 2005 Жалоба Поделиться Опубликовано 30 Октября 2005 Суть заключается в том, что запусакется программа, которая следит за обновлениями постов на форуме и выдает информацию о них (дата, автор, форум, тема и т.д.). Программа является очень удобной потому, как экономит траффик и не надо постоянно сидеть на форуме и обновлять главную страницу, а можно просто свернуть в трей программу и выставить интервал проверки новых сообщений.Итак, как стало понятно уже модификация состоит из двух частей: программы, написанной на Delphi и скрипта, который будет делать запрос к базе и выводить необходимую информацию в файл txt. Необходима квалифицированная помощь специалистовВ базе интересует лишь одна таблица, которая отвечает за информация о постах.Надо получить файл скажем totals.txt в таком виде:строка 1:ссылка на постстрока 2: название темыстрока 3:дата постастрока 4:автор постаЯ беру данные из таблицы ibf_posts и меня интересуют следующие поля:ссылка на пост: llast_postдата: очевидно start_date но я не уверенавтор поста: last_poster_nameНазвание темы: title Как я понимаю сам запрос выглядит примерно так:SELECT * INTO OUTFILE "/path/to/file" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\n" FROM table_name;А вот более конкретно я уже ничего сам сделать не могу, так как не силен во взаимодействии PHP с базами данных. Требуется помощь! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 30 Октября 2005 Жалоба Поделиться Опубликовано 30 Октября 2005 2man Есть же уже один охотник, написанный на яве ?Я чего-то не пойму зачем велосипед изобретать ?\ А если по сути вопроса, то OUTFILE не подойдёт.Т.к. он делает выброс в какую-либо директорию хостинга.А ты что будешь единственным пользователем этого охотника ? Здесь нужно серверную часть делать на php скрипте, который будет подключаться к базе принимать нужную информацию и отсылать обратно клиенту. строка 1:ссылка на постсам сформируешь в клиенте. Для этого тебе нужно знать id топика и id поста. Остальное это так: SELECT t.tid, p.pid, t.title, t.description, t.start_date, t.last_post, t.starter_id, t.last_poster_id, t.starter_name, t.last_poster_name, p.new_topic, p.author_id, p.author_name, p.post_date, p.post FROM ibf_topics t, ibf_posts p WHERE p.topic_id=t.tid ORDER BY t.tid, p.pid t.tid - id топика;p.pid - id поста;t.title, t.description - название/описание топика;t.start_date, t.last_post - время начала топика/последнего поста;t.starter_id, t.last_poster_id, - id автора топика / id последнего ответившего в топик;t.starter_name, t.last_poster_name - ник автора топика / ник последнего ответившего в топик;p.new_topic - признак является ли текущий пост постом начала топика tid;p.author_id, p.author_name - id/ник юзера каждого поста;p.post_date - время каждого поста;p.post - текст поста. Этот запрос общего порядка и очень тормозной и напряжный.Поэтому в секцию WHERE тебе ещё нужно подставлять условия из какого форума или топика брать инфу. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 30 Октября 2005 Автор Жалоба Поделиться Опубликовано 30 Октября 2005 Спасибо. Но я пишу себе такой же охотник, как на Винграде, не Винграде не глядя на него. Посмотрю что получиться[1130683236:1130702799]Так теперь надо сгенерить строки.Получается мой скрипт для импорта будет состоять из n-числа таких запросов, где n - количество строк.Сделать запрос к базе n-раз я смогу, а вот как быть с импортом информации в файл, если не Outfile то как? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 30 Октября 2005 Жалоба Поделиться Опубликовано 30 Октября 2005 олучается мой скрипт для импорта будет состоять из n-числа таких запросов, где n - количество строк. ты php знаешь ? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 1 Ноября 2005 Автор Жалоба Поделиться Опубликовано 1 Ноября 2005 А что я не правильно сказал? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 1 Ноября 2005 Жалоба Поделиться Опубликовано 1 Ноября 2005 зачем n если можно вытащить всё одним запросом оттуда где нужно ? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 1 Ноября 2005 Автор Жалоба Поделиться Опубликовано 1 Ноября 2005 Слушай, зачем изобретать велосипед. Я же могу просто взять кусок кода из "новые сообщения" под шапкой форума, вынести в отдельный файл и скрипт готов. Останется только программерская часть.Можешь его выложить сюда? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Ноября 2005 Жалоба Поделиться Опубликовано 4 Ноября 2005 Дык это я не его изобретаю, а ты Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 4 Ноября 2005 Автор Жалоба Поделиться Опубликовано 4 Ноября 2005 Все я понял, мне коннект к базе не нуден вообще, потому как новые сообщения надо брать из кукисов каждого пользователя. Таблицу новых сообщений я буду брать из "мой помощник". Все что нужно на данный момент, это код авторизации на форум, чтобы взаимодействовать его в делфях[1131146229:1131148525]function do_log_in() { //----------------------------------------- // INIT //----------------------------------------- $url = ""; $member = array(); //----------------------------------------- // Load handler... //----------------------------------------- require_once( ROOT_PATH.'sources/handlers/han_login.php' ); $this->han_login = new han_login(); $this->han_login->ipsclass =& $this->ipsclass; $this->han_login->init(); //----------------------------------------- // Make sure the username and password were entered //----------------------------------------- if ( $_POST['UserName'] == "" ) { $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_username' ) ); } if ( $_POST['PassWord'] == "" ) { $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'pass_blank' ) ); } //----------------------------------------- // Check for input length //----------------------------------------- if ( $this->ipsclass->vars['converge_login_method'] == 'username' ) { if ( $this->ipsclass->txt_mb_strlen( $_POST['UserName'] ) > 32 ) { $this->ipsclass->Error( array( LEVEL => 1, MSG => 'username_long' ) ); } $username = strtolower(str_replace( '|', '|', $this->ipsclass->input['UserName']) ); } else { $username = strtolower( trim( $this->ipsclass->input['UserName'] ) ); } if ( $this->ipsclass->txt_mb_strlen( $_POST['PassWord'] ) > 32) { $this->ipsclass->Error( array( LEVEL => 1, MSG => 'pass_too_long' ) ); } $password = md5( $this->ipsclass->input['PassWord'] ); //----------------------------------------- // Check auth //----------------------------------------- $this->han_login->login_authenticate( $username, $this->ipsclass->input['PassWord'] ); //----------------------------------------- // Check return code... //----------------------------------------- $member = $this->han_login->member; if ( ( ! $member['id'] ) or ( $this->han_login->return_code == 'NO_USER' ) ) { $this->log_in_form( 'wrong_name' ); } if ( $this->han_login->return_code != 'SUCCESS' ) { $this->log_in_form( 'wrong_auth' ); } //----------------------------------------- // Is this a partial member? // Not completed their sign in? //----------------------------------------- if ( $member['members_created_remote'] ) { $pmember = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*', 'from' => 'members_partial', 'where' => "partial_member_id={$member['id']}" ) ); if ( $pmember['partial_member_id'] ) { $this->ipsclass->print->redirect_screen( $this->ipsclass->lang['partial_login'], 'act=reg&CODE=complete_login&mid='.$member['id'].'&key='.$pmember['partial_date'] ); exit(); } } //----------------------------------------- // We in a validating group? // still need this? //----------------------------------------- if ($member['mgroup'] == $this->ipsclass->vars['auth_group']) { //$this->log_in_form( 'need_validation' ); } //----------------------------------------- // Generate a new log in key //----------------------------------------- if ( $this->ipsclass->vars['login_change_key'] OR ! $member['member_login_key'] ) { $member['member_login_key'] = $this->ipsclass->converge->generate_auto_log_in_key(); $this->ipsclass->DB->do_update( 'members', array( 'member_login_key' => $member['member_login_key'] ), 'id='.$member['id'] ); } //----------------------------------------- // Cookie me softly? //----------------------------------------- if ($this->ipsclass->input['CookieDate']) { $this->ipsclass->my_setcookie("member_id" , $member['id'] , 1); $this->ipsclass->my_setcookie("pass_hash" , $member['member_login_key'], 1); } //----------------------------------------- // Remove any COPPA cookies previously set //----------------------------------------- $this->ipsclass->my_setcookie("coppa", '0', 0); //----------------------------------------- // Update profile if IP addr missing //----------------------------------------- if ( $member['ip_address'] == "" OR $member['ip_address'] == '127.0.0.1' ) { $this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "ip_address='{$this->ipsclass->ip_address}'", 'where' => "id={$member['id']}" ) ); $this->ipsclass->DB->simple_exec(); } //----------------------------------------- // Create / Update session //----------------------------------------- $poss_session_id = ""; if ( $cookie_id = $this->ipsclass->my_getcookie('session_id') ) { $poss_session_id = $this->ipsclass->my_getcookie('session_id'); } else if ( $this->ipsclass->input['s'] ) { $poss_session_id = $this->ipsclass->input['s']; } //----------------------------------------- // Clean... //----------------------------------------- $poss_session_id = preg_replace("/([^a-zA-Z0-9])/", "", $poss_session_id); if ($poss_session_id) { $session_id = $poss_session_id; //----------------------------------------- // Delete any old sessions with this users IP // addy that doesn't match our session ID. //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'delete' => 'sessions', 'where' => "ip_address='".$this->ipsclass->ip_address."' AND id <> '$session_id'" ) ); $this->ipsclass->DB->simple_shutdown_exec(); $this->ipsclass->DB->do_shutdown_update( 'sessions', array ( 'member_name' => $member['members_display_name'], 'member_id' => $member['id'], 'running_time' => time(), 'member_group' => $member['mgroup'], 'login_type' => $this->ipsclass->input['Privacy'] ? 1 : 0 ), "id='".$session_id."'" ); } else { $session_id = md5( uniqid(microtime()) ); //----------------------------------------- // Delete any old sessions with this users IP addy. //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'delete' => 'sessions', 'where' => "ip_address='".$this->ipsclass->ip_address."'" ) ); $this->ipsclass->DB->simple_shutdown_exec(); $this->ipsclass->DB->do_shutdown_insert( 'sessions', array ( 'id' => $session_id, 'member_name' => $member['members_display_name'], 'member_id' => $member['id'], 'running_time' => time(), 'member_group' => $member['mgroup'], 'ip_address' => $this->ipsclass->ip_address, 'browser' => substr($this->ipsclass->clean_value($_SERVER['HTTP_USER_AGENT']), 0, 50), 'login_type' => $this->ipsclass->input['Privacy'] ? 1 : 0 ) ); } $this->ipsclass->member = $member; $this->ipsclass->session_id = $session_id; if ($this->ipsclass->input['referer'] && ($this->ipsclass->input['act'] != 'Reg')) { $url = str_replace( '&', '&', $this->ipsclass->input['referer'] ); $url = str_replace( "{$this->ipsclass->vars['board_url']}/index.{$this->ipsclass->vars['php_ext']}", "", $url ); $url = preg_replace( "!^\?!" , "" , $url ); $url = preg_replace( "!s=(\w){32}!", "" , $url ); $url = preg_replace( "!act=(login|reg|lostpass)!i", "", $url ); } //----------------------------------------- // set our privacy status //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "login_anonymous='".intval($this->ipsclass->input['Privacy'])."&1'", 'where' => "id={$member['id']}" ) ); $this->ipsclass->DB->simple_shutdown_exec(); //----------------------------------------- // Clear out any passy change stuff //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'delete' => 'validating', 'where' => "member_id={$this->ipsclass->member['id']} AND lost_pass=1" ) ); $this->ipsclass->DB->simple_shutdown_exec(); //----------------------------------------- // Redirect them to either the board // index, or where they came from //----------------------------------------- $this->ipsclass->my_setcookie("session_id", $this->ipsclass->session_id, -1); $this->logged_in = 1; if ( USE_MODULES == 1 ) { $this->modules->register_class(&$this); $this->modules->on_login($member); } if ( $this->ipsclass->input['return'] != "" ) { $return = urldecode($this->ipsclass->input['return']); if ( preg_match( "#^http://#", $return ) ) { $this->ipsclass->boink_it($return); } } //----------------------------------------- // Check for dupemail //----------------------------------------- $member_extra = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'bio', 'from' => 'member_extra', 'where' => 'id='.$member['id'] ) ); if ( $member_extra['bio'] == 'dupemail' ) { $this->ipsclass->print->redirect_screen( "{$this->ipsclass->lang[thanks_for_login]} {$this->ipsclass->member['members_display_name']}", 'act=usercp' ); } else { $this->ipsclass->print->redirect_screen( "{$this->ipsclass->lang[thanks_for_login]} {$this->ipsclass->member['members_display_name']}", $url ); } }вот это кажись он, там рядом и форма авторизации есть, но она пока не нужна. Song, так что мне тут можно обрезать, чтобы оставить только нужное: чтобы в проге юзер вводит логин и пароль, и когда запускает прогу программа производила авторизацию на форуме и выдавала инфу о постах. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 8 Ноября 2005 Автор Жалоба Поделиться Опубликовано 8 Ноября 2005 Song? понимаешь нужна ссылка, по которой я кликну и попаду на форум под профилем пользователя, т.е. мне нужно знать как шифруется логин, пароль и кукисы, чтобы вставить эту ссылку в адресную строку Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 8 Ноября 2005 Жалоба Поделиться Опубликовано 8 Ноября 2005 Там не всё так просто.Такой ссылки просто-напросто не существует. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 8 Ноября 2005 Автор Жалоба Поделиться Опубликовано 8 Ноября 2005 Как найти тогда компромисс, чтобы форму авторизации в программе настроить под форму авторизации на форуме? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 9 Ноября 2005 Жалоба Поделиться Опубликовано 9 Ноября 2005 Сделай на сайте такую же форму входа как на форуме. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 9 Ноября 2005 Автор Жалоба Поделиться Опубликовано 9 Ноября 2005 Ты не совсем понял. Надо чтобы в программе вести логин и пароль, нажать ок -> программа конектится к форуму по этому логину и паролю, смотрит новые сообщения в помощнике для этого юзера -> отсылает обратно в программу таблицу с новыми сообщениями Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
2man Опубликовано 28 Ноября 2005 Автор Жалоба Поделиться Опубликовано 28 Ноября 2005 Song, так. С запросом я разобрался. Мне надо впихнуть этот запрос в отдельный файл потому как программа скрипт не поймет. Мне как лучше сделать? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.