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

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


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

Версия 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();
?>

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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