Перейти к контенту

Создание темы путем правки базы


Рекомендуемые сообщения

Версия 2.1.x

 

Хочу научиться создавать тему на форуме, не заходя на сам форум. Путем правки базы.

Написал скриптик

 

<?php
////////подключаем конфиг
//и базу
require_once ("./conf_global.php");
$pref = $INFO['sql_tbl_prefix'];
$db = mysql_pconnect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']);
mysql_select_db($INFO['sql_database']);
//////////


//////параметры
$date = date("U");
//$post = addslashes($_POST['text_topic']);
//$title = addslashes($_POST['title_topic']);
//$descr = addslashes($_POST['desc_topic']);

$post = addslashes('POST text');
$title = addslashes('TOPIC TITLE');
$descr = addslashes('.......');

$autorid = 1;  //id пользователя
$autorname = "admin"; //имя пользователя от которого будет тема
$forumid =4;   // id форума  в котором будет тема
///////////////////

//начнем с поста
$q = "INSERT INTO ".$pref."posts VALUES (NULL, 0, NULL, $autorid, '$autorname', '1', '1', '88.88.88.88', $date, 0, '$post', 0, '', '$title', 0, NULL, 0, 0, 0)";
$r = mysql_query($q);

//вытягиваем id поста и записываем в топик
$post_id = mysql_insert_id();
$q = "INSERT INTO ".$pref."topics VALUES (NULL, '$title', '$descr', 'open', 1, '$autorid', '$date', '$autorid', '$date', 1, '$autorname', '$autorname', 0, 0, 1, $forumid, 1, 1, 0, NULL, 0, 0, $post_id, '', '', '', '', '')";
$r = mysql_query($q);

//теперь берем id топика и заносим в пост
$topic_id = mysql_insert_id();
$q = "update ".$pref."posts set topic_id='$topic_id' where pid=".$post_id;
$r = mysql_query($q);

//ну а теперь обновим таблицу forums
$q = "update ".$pref."forums set topics=topics+1, posts=posts+1, last_post='$date', last_poster_id='$autorid', last_poster_name='$autorname', last_title='$title', last_id='$topic_id'  where id='$forumid'";
$r = mysql_query($q);
////////////////////////////
?>

Вот такой вот скриптик. Кидаем его в каталог форума.

 

Тема создается! И все бы хорошо, да вот...

 

1. bbcode отключен! Хотя все в таблице posts выставил правильно. Самое интересное, что я открываю пост для редактирования и сразу жму "Отредактировать сообщение" не внося каких либо изменений. bbcode после этого включается для поста!!!

 

2. не обновляется статистика форума! Вот этот кусок

	//ну а теперь обновим таблицу forums
$q = "update ".$pref."forums set topics=topics+1, posts=posts+1, last_post='$date', last_poster_id='$autorid', last_poster_name='$autorname', last_title='$title', last_id='$topic_id'  where id='$forumid'";
$r = mysql_query($q);

обновляет в базе и общее количество постов и тем и тему в выбраном форуме. Но эти изменения не отображаются при просмотре списка форумов! Нечего не меняется пока не нажать на ссылку "Пересчетать все в форуме".

 

Вот такие вот дела. Может я еще какую-то таблицу пропустил?

Ссылка на комментарий
Поделиться на других сайтах

там же целая премудрость с кешами.

надо ещё кеш обновить.

Ссылка на комментарий
Поделиться на других сайтах

по идее ж можно вызвать функцию, которая кеш обновит! вот только что-то я ее пока не нашел.. продолжаю поиски
Ссылка на комментарий
Поделиться на других сайтах

Помницца мне надо было сделать постинг путём правки БД - если дёргать всё по-порядку, анализировать и нужное втыкать - то там тебе и парсинги, там тебе кэши, там всё, что надо, такая работа занимает не более получаса.

 

Мод был приватным - не могу показать сорц, тем, более, что сорц дома, а я не совсем дома.

Ссылка на комментарий
Поделиться на других сайтах

Да весь мод мне не нужен. Но надеюсь сейчас дадите полезный совет!

 

Функция которая обновляет кеш форума находится в /sources/lib/func_mod.php

Функция - forum_recount($fid)

 

Теперь только осталось ее запустить :D Сам PHP я знаю вполне неплохо, но вот классы не юзал!

 

Как правильно подключить класс из этого файла и вызвать функцию?

Я пытался в лоб

require_once ("./sources/lib/func_mod.php");
$cach = new func_mod();
$cach -> forum_recount($forumid);

 

но у меня ясное дело нечего не вышло ;)

Fatal error: Call to a member function on a non-object in /home/script/1/sources/lib/func_mod.php on line 840

 

Прошу помочь!

Ссылка на комментарий
Поделиться на других сайтах

Ну дык что-то не то вызываете, посмотрите как инициализируется сия функция и какие классы ей сразу прописываются.
Ссылка на комментарий
Поделиться на других сайтах

Вот функция

	//-----------------------------------------
// @forum_recount: Recount topic & posts in a forum
// -----------
// Accepts: forum_id
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------

function forum_recount($fid="")
{
	$fid = intval($fid);

	if ( ! $fid )
	{
		if ( $this->forum['id'] )
		{
			$fid = $this->forum['id'];
		}
		else
		{
			return FALSE;
		}
	}

	//-----------------------------------------
	// Get the topics..
	//-----------------------------------------

	$topics = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'COUNT(*) as count',
															 'from'   => 'topics',
															 'where'  => "approved=1 and forum_id=$fid" ) );

	//-----------------------------------------
	// Get the QUEUED topics..
	//-----------------------------------------

	$queued_topics = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'COUNT(*) as count',
																	'from'   => 'topics',
																	'where'  => "approved=0 and forum_id=$fid" ) );

	//-----------------------------------------
	// Get the posts..
	//-----------------------------------------

	$posts = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'SUM(posts) as replies',
															'from'   => 'topics',
															'where'  => "approved=1 and forum_id=$fid" ) );

	//-----------------------------------------
	// Get the QUEUED posts..
	//-----------------------------------------

	$queued_posts = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'SUM(topic_queuedposts) as replies',
												   				   'from'   => 'topics',
												   				   'where'  => "forum_id=$fid" ) );

	//-----------------------------------------
	// Get the forum last poster..
	//-----------------------------------------

	$this->ipsclass->DB->simple_construct( array( 'select' => 'tid, title, last_poster_id, last_poster_name, last_post',
								 				  'from'   => 'topics',
													'where'  => "approved=1 and forum_id=$fid",
													'order'  => 'last_post DESC',
													'limit'  => array( 0,1 ) ) );

	$this->ipsclass->DB->simple_exec();

	$last_post = $this->ipsclass->DB->fetch_row();

	//-----------------------------------------
	// Reset this forums stats
	//-----------------------------------------

	$dbs = array(
				  'last_poster_id'   => $last_post['last_poster_id'],
				  'last_poster_name' => $last_post['last_poster_name'],
				  'last_post'		=> $last_post['last_post'],
				  'last_title'	   => $last_post['title'],
				  'last_id'		  => $last_post['tid'],
				  'topics'		   => intval($topics['count']),
				  'posts'			=> intval($posts['replies']),
				  'queued_topics'	=> intval($queued_topics['count']),
				  'queued_posts'	 => intval($queued_posts['replies']),
				);

	if ( $this->ipsclass->forums->forum_by_id[ $fid ]['_update_deletion'] )
	{
		$dbs['forum_last_deletion'] = time();
	}

	$this->ipsclass->DB->do_update( 'forums', $dbs, "id=".$fid );

	//-----------------------------------------
	// Update forum cache
	//-----------------------------------------

	foreach( $dbs as $k => $v )
	{
		$this->ipsclass->cache['forum_cache'][ $fid ][ $k ] = $v;
	}

	$this->ipsclass->update_cache( array( 'name' => 'forum_cache', 'array' => 1, 'deletefirst' => 0 ) );

	return TRUE;
}

 

Функция пренадлежит вот такому классу

 

class func_mod
{
//-----------------------------------------
// @modfunctions: constructor
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE)
//-----------------------------------------

var $topic = "";
var $forum = "";
var $error = "";

var $auto_update = FALSE;

var $stm   = "";
var $upload_dir = "";

var $moderator  = "";

function func_mod()
{
	$this->error = "";

	$this->upload_dir = $this->ipsclass->vars['upload_dir'];

	return TRUE;
}

 

А какой последовательности и вообще КАК правильно подключить все нужные классы?

Ссылка на комментарий
Поделиться на других сайтах

$this->ipsclass

 

Ну-ну, ipsclass следует назначить. Врубай поиск по сорцам, ищи:

new func_mod

Найдёшь - смотри какие классы для него назначаются, смотри инициализацию "суперглобального класса" - ipsclass.

Ссылка на комментарий
Поделиться на других сайтах

Вот все мучаюсь. Чего только не подключал. В конце получилось вот так

define( 'IPB_THIS_SCRIPT', 'public' );
define( 'IPB_LOAD_SQL'   , 'queries' );
require_once( './init.php' );
$INFO = array();
require_once ROOT_PATH   . "sources/ipsclass.php";
require_once ROOT_PATH   . "sources/classes/class_display.php";
require_once ROOT_PATH   . "sources/classes/class_session.php";
require_once ROOT_PATH   . "sources/classes/class_forums.php";
require_once KERNEL_PATH . "class_converge.php";
require ROOT_PATH   . "conf_global.php";

require_once( ROOT_PATH.'sources/lib/func_mod.php');
require_once( ROOT_PATH.'sources/api/api_topics_and_posts.php');

# Initiate super-class
$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;	

$ipsclass->init_db_connection();

$ipsclass->cach = new func_mod();
$ipsclass->cach->ipsclass =& $ipsclass;
$ipsclass->cach -> forum_recount($forumid);  // вот это вызов нужной функции

 

теперь ошибок не пишет.. вообще нечего не пишет. И нечего не делает :D

ПРОШУ помогите, у меня уже нет вариантов

Ссылка на комментарий
Поделиться на других сайтах

кто то не очень хорошо понимает что он делает.

 

Мишка2, единственная умная мысль найденная у Вас в коде:

 

require_once( ROOT_PATH.'sources/api/api_topics_and_posts.php');

 

Откройте этот файл и почитайте комментарии вверху как пользоваться. Многое прояснит... Если ни все.

Ссылка на комментарий
Поделиться на других сайтах

кто то не очень хорошо понимает что он делает.

правда! Я ж с самого начала говорил, что плаваю в классах (но всетаки немного понимаю).

 

Значит так, в api_topics_and_posts.php и правда есть комментарии )

Вот что там написано

 

/**
* API: Topics & Posts
*
* IMPORTANT: This API DOESN'T check permissions, etc
* So, it's entirely possible to add replies to closed topics
* and to post new topics where the user doesn't normally have
* permission.
* EXAMPLE USAGE
* <code>
* $api = new api_topics_and_posts();
* // ADD POST REPLY
* $api->set_author_by_name('matt');
* $api->set_post_content("<b>Hello World!</b> :D");
* $api->set_topic_id( 100 );
* # Default for show_signature is 1, added here for completeness
* $api->post_settings['show_signature'] = 1;
* # Optionally turn off rebuild to not rebuild topic, forum and stats
* # $api->delay_rebuild = 1;
* $api->create_new_reply();
* // ADD NEW TOPIC
* $api->set_author_by_name('matt');
* $api->set_post_content("<b>Hello World!</b> :D");
* $api->set_forum_id( 10 );
* $api->set_topic_title('Hello World');
* $api->set_topic_description('I am the description');
* $api->set_topic_state('open');
* $api->create_new_topic();
* </code>
*
* @package		InvisionPowerBoard
* @subpackage	APIs
* @author		Matt Mecham
* @copyright	Invision Power Services, Inc.
* @version		2.1
*/

 

По идее все просто. Поставил значит свои параметры. получилось:

 

<?php
define( 'IPB_THIS_SCRIPT', 'public' );
define( 'IPB_LOAD_SQL'   , 'queries' );
require "conf_global.php";
require_once( './init.php' );
$INFO = array();
require_once "sources/ipsclass.php";
require_once( 'sources/api/api_topics_and_posts.php');
$api = new api_topics_and_posts();
// ADD POST REPLY
$api->set_author_by_name('matt');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_topic_id( 137 );
# Default for show_signature is 1, added here for completeness
$api->post_settings['show_signature'] = 1;
# Optionally turn off rebuild to not rebuild topic, forum and stats
$api->delay_rebuild = 1;
$api->create_new_reply();
// ADD NEW TOPIC
$api->set_author_by_name('matt');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_forum_id( 4 );
$api->set_topic_title('Hello World');
$api->set_topic_description('I am the description');
$api->set_topic_state('open');
$api->create_new_topic();
?>

 

Но опять ошибка

 

Fatal error: Call to a member function on a non-object in /home/script/1/sources/api/api_topics_and_posts.php on line 521

 

Ошибка вот в этой стороке

 

$this->author = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*',
					  'from'   => 'members',
					  'where'  => "LOWER(name) = '".$this->ipsclass->DB->add_slashes(strtolower($user_name))."'",
					  'limit'  => array( 0, 1 ) ) );

 

Как я понял, я опять не подключил какой-то класс

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Привожу тебе пример своего скрипта add_topic.php, просто помести его в корень форума, всё отлично работает! :D

 

<?php
require_once "sources/api/api_topics_and_posts.php";
$api = new api_topics_and_posts();
$api->ipsclass =& $this->ipsclass;
$api->api_init();
// ADD POST REPLY
$api->set_author_by_name('matt');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_topic_id( 137 );
# Default for show_signature is 1, added here for completeness
$api->post_settings['show_signature'] = 1;
# Optionally turn off rebuild to not rebuild topic, forum and stats
$api->delay_rebuild = 1;
$api->create_new_reply();
// ADD NEW TOPIC
$api->set_author_by_name('matt');
$api->set_post_content("<b>Hello World!</b> :D");
$api->set_forum_id( 2 );
$api->set_topic_title('Hello World');
$api->set_topic_description('I am the description');
$api->set_topic_state('open');
$api->create_new_topic();
?>

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.