Добавление сообщений в тему напрямую через базу.

Автор iaroslav, 16 января 2014, 21:35:59

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

iaroslav

Собственно сам способ добавления сообщений в базу кажется относительно простым и я им относительно давно пользуюсь. Но вот незадача - сообщения созданные таким способом висят в непрочитанных у всех пользователей аккурат до тех пор, пока через админку не выполню "пересчитать все форумы и статистику".
Для добавления я использую следующий набор запросов.

$answ1="id_topic,id_board,poster_time,id_member,subject,poster_name,poster_email,poster_ip,modified_name,body,approved";
$answ2="'".$topic."','".$board."','".time()."','0','Re:Вопросы и предложения гостей.','".$_POST['name']."','mail[at]mail.com','".$HTTP_X_REAL_IP."','','".$question."',".$Approve_text."'";
$answer="INSERT INTO smf_messages (".$answ1.") VALUES (".$answ2.")";
mysql_query($answer);
$msg_num_answer = mysql_query("SELECT id_msg FROM smf_messages WHERE id_topic = ".$topic." ORDER BY id_msg DESC LIMIT 0,1");
while( $msg_number = mysql_fetch_assoc($msg_num_answer))
{
mysql_query("UPDATE smf_topics SET num_replies= num_replies + 1 , id_last_msg = ".$msg_number['id_msg']." WHERE id_topic = ".$topic);
mysql_query("UPDATE smf_boards SET num_posts = num_posts + 1 , id_last_msg = ".$msg_number['id_msg']." WHERE id_board = ".$board);
}
mysql_free_result($msg_num_answer);

Люди добрые, подскажите где я ошибся, а?
P.S. Через встроенные функции форума делать не хочется так как в текущем виде оно аджаксовое и при использовании функций форума, боюсь, будет чрезмерно грузить хостинг. На котором и так что-то последнее время с оперативкой не здорово.

kak2z

так немного удобнее будет) http://support.simplemachines.org/function_db/index.php?action=view_function;id=323

я у себя такую функцию сделал

$body,  - текст сообщения
$subject, - название темы
$board, - ИД раздела
$poster - ИД автора



function addTopic ($body, $subject, $board, $poster) {
$msgOptions = array(
"body" => ''.$body.'',
"subject" => ''.$subject.'',
);
$topicOptions = array(
"board" => $board,
"mark_as_read" => TRUE,
);
$posterOptions = array(
"id" => $poster,
"update_post_count" => 'always',
);
createPost ($msgOptions, $topicOptions, $posterOptions);
}


только еще в начале файла надо сделать вызов
require_once($sourcedir . '/Subs-Post.php');


UPD2:
и еще забыл)) в конце файла надо вызвать функцию MaintainCleanCache ();
но предварительно надо вначале еще добавить вызов файла с этой функцией)
require_once($sourcedir . '/ManageMaintenance.php');
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

iaroslav

Ну, это уже то самое использование функций форума, которое
Цитата: iaroslav от 16 января 2014, 21:35:59
боюсь, будет чрезмерно грузить хостинг. На котором и так что-то последнее время с оперативкой не здорово.
Ибо способом упомянутым вами зело дофига всякого подгружается  :(
А напрямую через базу оно почти ничего не ест.

kak2z

Цитата: iaroslav от 17 января 2014, 09:27:21
Ну, это уже то самое использование функций форума, котороеИбо способом упомянутым вами зело дофига всякого подгружается  :(
А напрямую через базу оно почти ничего не ест.
ну тогда просто попробуйте выполнить MaintainCleanCache... а в базу запись добавить так как я добавлял..
хотя какая разница, пост создает пользователь с помощью createPost , или Ваш скрипт с помощью createPost.
Вы же не собираетесь каждую секунду по посту добавлять и перегружать хостинг)))
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

iaroslav

#4
Хех, видать у меня с формулировками проблемы   :'(
Давайте вот так попробую.
  • У меня скрипт добавляет строго определённые сообщений, которые сам и создаёт на основе взаимодействия с пользователем (то есть стандартную систему написание ответов он заменять и не призван). Собственно оттого и аджакс, оттого и запись напрямую в базу. В текущем виде он жрёт минимум памяти.
  • При подключении скриптов форума (что бы использоваться предложенными вами способами) он начнёт жрать в разы больше.
  • Но в текущем виде есть проблема, описанная в первом сообщении.

    Так у меня лучше получилось? Или всё равно непонятно почему я не хочу использовать стандартные функции форума (в частности MaintainCleanCache)?
    P.S. Ну, а на тему частоты добавления... всё-таки у моего аджаксового скрипта система защиты в разы слабее форумной. Соответственно чем меньше он будет жрать, тем больше шансов, что кто-нибудь когда-нибудь с его помощью решит попробовать устроить небольшой но неприятный ДДОС.

iaroslav

#5
Цитата: kak2z от 16 января 2014, 22:00:06так немного удобнее будет) http://support.simplemachines.org/function_db/index.php?action=view_function;id=323

я у себя такую функцию сделал

$body,  - текст сообщения
$subject, - название темы
$board, - ИД раздела
$poster - ИД автора
Решил попробовать оную функцию, но высяснилось что она почему-то не работает.
Даже если использую вот такую вот (то есть функция, в которой используются одни обязательные значения, для пущей наглядности подставленные сразу)

define('SMF', 1);
include_once('/Sources/Subs-Post.php');
    function addPost ($body, $subject, $board, $topic, $mail, $poster, $poster_name, $Approve, $user_ip) {
    $msgOptions_test = array(
    "body" => ""."текст сообщения"."",
    "subject" => ""."заголовок"."",
    );
    $topicOptions_test = array(
    "board" => 23,
"mark_as_read" => TRUE,
    );
$posterOptions_test = array(

);
   createPost ($msgOptions_test, $topicOptions_test, $posterOptions_test);
    }

Всё-равно получаю ошибку

Fatal error: Function name must be a string in /Sources/Subs-Post.php on line 1827

На той строке находится соотвественно функция записи в базу

// Insert the post.
$smcFunc['db_insert']('',
'{db_prefix}messages',
array(
'id_board' => 'int', 'id_topic' => 'int', 'id_member' => 'int', 'subject' => 'string-255', 'body' => (!empty($modSettings['max_messageLength']) && $modSettings['max_messageLength'] > 65534 ? 'string-' . $modSettings['max_messageLength'] : 'string-65534'),
'poster_name' => 'string-255', 'poster_email' => 'string-255', 'poster_time' => 'int', 'poster_ip' => 'string-255',
'smileys_enabled' => 'int', 'modified_name' => 'string', 'icon' => 'string-16', 'approved' => 'int',
),
array(
$topicOptions['board'], $topicOptions['id'], $posterOptions['id'], $msgOptions['subject'], $msgOptions['body'],
$posterOptions['name'], $posterOptions['email'], time(), $posterOptions['ip'],
$msgOptions['smileys_enabled'] ? 1 : 0, '', $msgOptions['icon'], $msgOptions['approved'],
),
array('id_msg')
);

kak2z

я по отрывкам кода не могу сказать.. глаз не наметан настолько))) единственное что сразу бросается в глаза массив posterOptions_test  пустой.. нет ID юзера..
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

digger®

Цитата: kak2z от 11 июня 2014, 21:51:38единственное что сразу бросается в глаза массив posterOptions_test  пустой.. нет ID юзера
Этот массив весь опциональный.

Проблема, наверняка, в том что код вызывается из стороннего скрипта, а не из SMF, тогда недостаточно прицепить Subs-Post.php

iaroslav

Попробовал в тот массив что-то вставлять. Действительно та же самая ошибка.
Можете подсказать что ещё требуется подключить для того, что бы заработало?

kak2z

Цитата: iaroslav от 15 июня 2014, 16:09:37
Попробовал в тот массив что-то вставлять. Действительно та же самая ошибка.
Можете подсказать что ещё требуется подключить для того, что бы заработало?

вот все что у меня подключено, вроде больше ничего нет..

require("/www/SSI.php");
global $sourcedir;
require_once($sourcedir . '/Subs-Post.php');
require_once($sourcedir . '/ManageMaintenance.php');
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)