5) die("old_getMSG_array:error in razdel_number=".$info_razdel); $fptr=fopen("../News/".$info_razdel."/Files/".$msg_id.".htm",'rb'); if ($fptr!==FALSE) { while(($c = fgets($fptr))!==false) { if ($flag_ok!=0) $flag_title=0; //проверки на предмет изменения состояния ДО присвоения текста if ( strpos($c, '') !== FALSE) { $text_title=trim(substr($c,30)); $flag_title=1; } else if ($flag_title==1) $text_title.=" ".trim($c); if ($flag_title==1) { if ( ($pos=strpos($text_title, '')) !== FALSE) { $text_title=substr($text_title,0,$pos); $flag_title=0; } } if (strpos($c, '')!==FALSE) $flag_ok=999; //признак что нашли конец файла if ($flag_ok==2) $text_block.=$c; //проверки на предмет изменения состояния ПОСЛЕ присвоения текста if (strpos($c, '')!==FALSE) $flag_ok=1; //вырезаем из текста служебные символы if ($flag_ok==1) { $pos1=strpos($c, ''); if ($pos1!==FALSE) $text_date=substr($c,31,8); if (strpos($c, '')!==FALSE ) $flag_ok=2; } } fclose($fptr); $text_block=str_replace('
','',$text_block); $foundfile=1; } else $foundfile=0; $text_array=array($msg_id, $text_date, trim($text_title),$text_block, $foundfile); return $text_array; } //определяем название и прочую информацию о группе общения function getGroup_info($workmode, $group_id, $info_razdel=0) { $grouplist=old_getListGroup($workmode, 0, $info_razdel); $grouplist_count=count($grouplist); if ($grouplist_count>0) //если список групп удалось загрузить, то for ($i=0;$i<$grouplist_count;$i++) if ($grouplist[$i][0]==$group_id) return $grouplist[$i]; return array(); } function old_getMSG($msg_id, $info_razdel) { $flag_ok=0; $text_block=''; $text_title=''; $info_razdel=(int)$info_razdel; if ($info_razdel<1 or $info_razdel>5) die("old_getMSG:unsupportedmode"); $fptr=fopen("../News/".$info_razdel."/Files/".$msg_id.".htm",'rb'); if ($fptr!==FALSE) { while(($c = fgets($fptr))!==false) { //проверки на предмет изменения состояния ДО присвоения текста if ( strpos($c, '') !== FALSE) { $text_title=trim(substr($c,30)); if ( ($pos=strpos($text_title, '')) !== FALSE) $text_title=substr($text_title,0,$pos); } if (strpos($c, '')!==FALSE) $flag_ok=0; if ($flag_ok==2) $text_block.=$c; //проверки на предмет изменения состояния ПОСЛЕ присвоения текста if (strpos($c, '')!==FALSE) $flag_ok=1; //вырезаем из текста служебные символы if ($flag_ok==1 && strpos($c, '')!==FALSE ) $flag_ok=2; } fclose($fptr); $text_block=str_replace('
','',$text_block); $text_block="Исходный заголовок:".$text_title."\nИсходный текст\n".$text_block; } return $text_block; } function old_getListGroup($workmode, $selected_group_id, $info_razdel=0) { $info_razdel=(int)$info_razdel; if ($info_razdel==0) { switch ($workmode) { case 1: $razdel=5; break; case 2: $razdel=3; break; default: $razdel=5; break; } } else $razdel=$info_razdel; //сначала читаем файлик со списком новостных групп (в данном случае с группами FAQ) $fptr=fopen("../News/".(int)$razdel."/NewsList.htm",'rb'); $flag_start_scan=0; $flag_stop_scan=0; $myarray=array(); while(($c = fgets($fptr))!==false) { $pos=strpos($c, ''); if ($pos!==FALSE) $flag_start_scan=1; $pos=strpos($c, ''); if ($pos!==FALSE) { $flag_stop_scan=1; //ставим признак что нашли окончание break; } if ($flag_start_scan==1) { $c=str_replace('
','',$c); $pos=strpos($c,' '); if ($pos!==FALSE) { $myindex=(int)substr($c,3,$pos-3); $c=substr($c,$pos+1); } $c=trim($c); if (strlen($c)==0) break; if ($myindex!=9999) { if ($selected_group_id==$myindex) $selected_flag='SELECTED'; else $selected_flag=''; $myarray[]=array($myindex,$selected_flag,$c); } } } if ($flag_stop_scan!=1) die('Внимание! идет обновление сайта. попробуйте через 5 минут'); fclose($fptr); //теперь в массиве у нас должен быть список из групп...второй этап обработки-убирание лишних символов //отрезаем ненужный первый элемент return array_splice($myarray,1); } function old_getListMSG($workmode, $selected_group_id) { if ($selected_group_id=='') die ("не указан номер группы"); switch ($workmode) { case 1: $razdel=5; break; case 2: $razdel=3; break; default: die('old_getListMSG:unsupported mode'); break; } //сначала читаем файлик со списком новостных групп (в данном случае с группами FAQ) $fptr=fopen("../News/".(int)$razdel."/NewsList.htm",'rb'); $flag_start_scan=0; $flag_stop_scan=0; $myarray=array(); $mystring=''; while(($c = fgets($fptr))!==false) { $pos=strpos($c, ''); if ($pos!==FALSE) { $flag_start_scan=1; continue; } $pos=strpos($c, ''); if ($pos!==FALSE) { $flag_stop_scan=1; break; } if ($flag_start_scan==1) { $mystring.=" ".trim($c); if (strpos($c,'
')!==FALSE) { $mystring=trim(str_replace('
','',$mystring)); $this_date=substr($mystring,0,8); $this_textall=substr($mystring,10); $pos=(int)strrpos($this_textall,';'); if ($pos>0) { $this_index=(int)(substr($this_textall,$pos+1)); $this_text=substr($this_textall,0,$pos); } else $this_text=$this_textall; $myarray[]=array($this_index,$this_date,trim($this_text)); $mystring=''; } } } if ($flag_stop_scan!=1) die('Внимание! идет обновление сайта. попробуйте через 5 минут'); fclose($fptr); //теперь в массиве у нас должен быть список из групп...второй этап обработки-убирание лишних символов //отрезаем ненужный первый элемент return $myarray; } function GroupList_GetAll($sqllink, $info_razdel, $group_id, $group_old_id) { $retarray=array(); $sqlwhere=""; //устанавливаем фильтр в зависимости от номера группы if ((int)$group_id!=0) $sqlwhere=" and id_record='".(int)$group_id."'"; else if ($group_old_id!="") $sqlwhere=" and prog_index like '".$group_old_id."'"; //и дополняем фильтр ограничением по номеру раздела if ((int)$info_razdel==0) die("GroupList_GetAll:$info_razdel=0"); $sqlwhere="WHERE bb_number=".$info_razdel.$sqlwhere; //Теперь делаем выборку $result=db_query($sqllink, 'select id_record, prog_index, namerazdel from bb_msg_razdel '.$sqlwhere); //проверяем чтобы нам что нибудь вернулось в результате запроса if (mysql_num_rows($result)>0) while( ($row=mysql_fetch_array($result)) ) $retarray[]=$row; return $retarray; } function GroupList_Get($sqllink, $info_razdel, $group_id, $group_old_id) { $listarray=GroupList_GetAll($sqllink, $info_razdel, $group_id, $group_old_id); if (count($listarray)>0) return $listarray[0]; return array(); } //корректируем новостную группу (если это нужно, конечно) //убрать потом - "deprecated" function GroupList_Update($sqllink, $workmode, $listarray, $paramold) { //проверка - равны ли строки или нет if (strcmp($listarray["namerazdel"],$paramold["namerazdel"])==0 ) return; //проверка не пройдена, строки различаются $sql='update bb_msg_razdel set NameRazdel=\''.addslashes($paramold["namerazdel"]).'\' where id_record='.(int)$paramold["id_record"]; db_query($sqllink, $sql); } //убрать потом - "deprecated" function GroupList_Remove($sqllink, $workmode, $group_id) { //здесь в будущем должен быть программный код для определения наличия //записей в этой группе и если сообщения есть то блокировать удаление //и просто ставить признак "закрытия" группы общения $sql='delete from bb_msg_razdel where id_record='.(int)$group_id; db_query($sqllink, $sql); } //*************************************************************************** //Общие функции************************************************************** //*************************************************************************** //bbmsg_delete - удаляем сообщение целиком //сначала удаляем содержимое, затем заголовок function bbmsg_delete($dblink, $msg_id) { $sql='delete from bb_msg_body where owner_id='.$msg_id; db_query($dblink,$sql); $sql='delete from bb_msg_head where id_record='.$msg_id; db_query($dblink,$sql); } //BBRUBRIKA******************************************************************** //bbrubrika_get_old - Извлекаем из БД старое название группы //функция такая уже существует. эта функция будет "оберткой" для старой функции //и будет приводить результат к новому формату function bbrubrika_get_old($info_razdel, $group_id_old) { //первый параметр убираем, он теперь нам не понадобится $oldlist_array=getGroup_info(0, $group_id_old, $info_razdel); $retarray=array(); if (count($oldlist_array)>0) { $retarray["rubrika_id_old"]=$oldlist_array[0]; $retarray["rubrika_name"]=$oldlist_array[2]; } return $retarray; } //bbrubrika_get_sql_where //подготавливаем условия для извлечения информации из БД function bbrubrika_get_sql_where($info_razdel, $group_id, $group_old_id) { //Сразу определяем фильтр по номеру раздела. и это обязательно! if ((int)$info_razdel==0) die("bbrubrika_get_sql_where:info_razdel=0"); $sqlwhere=" and bb_number=".(int)$info_razdel; if ((int)$group_id!=0) $sqlwhere=$sqlwhere." and id_record='".(int)$group_id."'"; if ($group_old_id!="") $sqlwhere=$sqlwhere." and prog_index like '".$group_old_id."'"; //дополнительная обработочка текстовой переменной if (strlen($sqlwhere)>0) $sqlwhere=" where ".substr($sqlwhere,5); //и возвращаем строчку для использования в качестве WHERE return $sqlwhere; } //bbrubrika_get_sql - из SQL базы извлекаем название рубрики //такая функция уже есть в старых, поэтому делаем "обертку", далее должна быть //перенесена целиком сюда... function bbrubrika_get_sql($sqllink, $info_razdel, $group_id, $group_old_id) { $newlist_array=GroupList_Get($sqllink, $info_razdel, $group_id, $group_old_id); $retarray=array(); if (count($newlist_array)>0) { $retarray["rubrika_id"]=$newlist_array["id_record"]; $retarray["rubrika_id_old"]=$newlist_array["prog_index"]; $retarray["rubrika_name"]=$newlist_array["namerazdel"]; } return $retarray; /* Старая функция.GroupList_Get надо ее обновить и сделать новой //определяем условия отбора $sqlwhere=bbrubrika_get_sql_where($info_razdel, $group_id, $group_old_id); $retarray=array(); $sqlwhere=""; if ((int)$group_id!=0) $sqlwhere=$sqlwhere." and id_record='".(int)$group_id."'"; if ($group_old_id!="") $sqlwhere=$sqlwhere." and prog_index like '".$group_old_id."'"; if ($sqlwhere!="") $sqlwhere=" where ".substr($sqlwhere,5); $result=db_query($sqllink, 'select id_record, prog_index, namerazdel from bb_msg_razdel '.$sqlwhere); //проверяем чтобы нам что нибудь вернулось в результате запроса if (mysql_num_rows($result)>0) while( ($row=mysql_fetch_array($result)) ) $retarray[]=$row; return $retarray; } function GroupList_Get($sqllink, $info_razdel, $group_id, $group_old_id) { $listarray=GroupList_GetAll($sqllink, $info_razdel, $group_id, $group_old_id); if (count($listarray)>0) return $listarray[0]; return array(); } */ } //bbrubrika_add - добавляем в БД еще одну рубрику... function bbrubrika_add($dblink,$info_razdel,$thisvalues) { if ((int)$info_razdel==0) die("bbrubrika_add:info_razdel=0"); $sql="insert into bb_msg_razdel (bb_number, prog_index, NameRazdel) values('".(int)$info_razdel."','".addslashes($thisvalues["rubrika_id_old"])."','".addslashes($thisvalues["rubrika_name"])."')"; db_query($dblink, $sql); return mysql_insert_id($dblink); } //bbrubrika_update - корректируем название рубрики (если это нужно, конечно) //oldvalue - старое значение //newvalue - новое значение, которое и должно быть в БД function bbrubrika_update($dblink, $info_razdel, $oldvalue, $newvalue) { //ДОДЕЛАТЬ! добавить обработку info_razdel!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //проверка - равны ли строки или нет if (strcmp($oldvalue["rubrika_name"],$newvalue["rubrika_name"])==0 ) return; //проверка не пройдена, строки различаются $sql='update bb_msg_razdel set NameRazdel=\''.addslashes($newvalue["rubrika_name"]).'\' where id_record='.(int)$newvalue["rubrika_id"]; db_query($dblink, $sql); } //bbrubrika_remove - удаляем рубрику из БД //(пока есть старая база - причина такая - она была удалена из старой БД) function bbrubrika_remove($sqllink, $info_razdel, $group_id) { //сначала проверяем на наличие чего нибудь в рубрике //проверяем по двум параметрам - номер раздела (razdel_id) и // номер рубрики (раздела общения) $countmsg=(int)bbmsg_head_list_count($sqllink, $info_razdel, $group_id); //здесь в будущем должен быть более сложный программный код для //определения наличия записей в этой группе и если сообщения есть //то блокировать удаление и просто ставить признак "закрытия" группы общения if ($countmsg==0) //пока просто - если нет сообщений, то удаляем иначе пропуск { $sql='delete from bb_msg_razdel where id_record='.(int)$group_id; db_query($sqllink, $sql); return 0; } return -1; //возвращаем что не удалось удалить } //bbrubrika_get извлекаем название рубрики(темы общения) // (по идентификатору рубрики) //передаваемые параметры: // info_razdel - номер конференции /2006-... год :5 - круглый стол/ // info_rubrika function bbrubrika_get($dblink, $info_razdel, $info_rubrika_old) { //считываем из файла название рубрики $oldlist_array=bbrubrika_get_old($info_razdel, $info_rubrika_old); if (count($oldlist_array)==0) $foundgroup_old=0; else $foundgroup_old=1; //теперь надо свериться с SQL базой данных $listarray=bbrubrika_get_sql($dblink, $info_razdel, 0, $info_rubrika_old); //извлекаем из БД только эту группу if (count($listarray)==0) //не нашли записей $foundgroup_new=0; else { $foundgroup_new=1; $oldlist_array["rubrika_id"]=$listarray["rubrika_id"]; } //теперь надо понять что нужно делать! if ($foundgroup_old==0) //такую группу не нашли в БД(старой) { if ($foundgroup_new==1) //но она есть в SQL. тогда удаляем группу из SQL... if (bbrubrika_remove($dblink, $info_razdel, $listarray["rubrika_id"])==-1) return $listarray; //удалить не удалось, проскакиваем дальше... //а если ее и не было в SQL, то не расстраиваемся по данному поводу return array(); //и возвращаем пустой массив } else { if ($foundgroup_new==0) //но ее нет в SQL...значит надо добавить { $newid=bbrubrika_add($dblink,$info_razdel,$oldlist_array); $oldlist_array["rubrika_id"]=$newid; } else //она есть в SQL, значит надо дать команду обновления bbrubrika_update($dblink,$info_razdel,$listarray,$oldlist_array); $returnarray=$oldlist_array; //присвоение, т.к. стопудово информация есть в старых файлах БД } return $returnarray; } //*************************************************************************** //Заголовок****************************************************************** //*************************************************************************** //bbmsg_head_list_sqlfilter - формируем SQL запрос на выборку заголовков сообщений function bbmsg_head_list_sqlfilter($info_razdel, $theme_id) { $sqlfilter=''; //сначала проверка условия на неправильные значения if ((int)$info_razdel==0) die('error:bbmsg_head_list_sqlfilter = info_razdel=0'); else $sqlfilter=$sqlfilter.' and bb_msg_head.razdel_id='.(int)$info_razdel; if ((int)$theme_id==0) die('error:bbmsg_head_list_sqlfilter = theme_id=0'); else if ((int)$theme_id==-1) ; else $sqlfilter=$sqlfilter.' and bb_msg_head.theme_id='.(int)$theme_id; //дообработка if (strlen($sqlfilter)>0) $sqlfilter=substr($sqlfilter,5); //а теперь возвращаем сформированный запрос с условием выборки return $sqlfilter; } //bbmsg_head_list_get - делаем выборку из SQL-а всех сообщений в группе //передаются параметры: //$info_razdel - номер BulletinBoard //$info_rubrika - номер рубрики function bbmsg_head_list_get($dblink, $info_razdel, $info_rubrika, $pagenumber=0) { global $CONFIG; $retarray=array(); //инициализация переменной $limittext=''; $sqlwhere='where '.bbmsg_head_list_sqlfilter($info_razdel, $info_rubrika); if ($pagenumber>0) //Обрабатываем номер страницы if (isset($CONFIG['bb_msg_per_page'])) { $limittext=' LIMIT '.((int)($pagenumber-1)*(int)$CONFIG['bb_msg_per_page']).','.((int)$CONFIG['bb_msg_per_page']); } $sql='select id_record, razdel_id, theme_id, id_newsprog, msg_subject, date_create, date_change, date_lastview, counter_view, post_number from bb_msg_head '.$sqlwhere.' order by date_change desc, id_record '.$limittext; $result=db_query($dblink,$sql); //выполняем запрос и начинаем "парсить" while(($row=mysql_fetch_object($result))) { $thisline["record_id"]=$row->id_record; $thisline["record_id_old"]=$row->id_newsprog; $thisline["razdel_id"]=$row->razdel_id; $thisline["theme_id"]=$row->theme_id; $thisline["msg_subject"]=$row->msg_subject; $thisline["counter_view"]=(int)$row->counter_view; $thisline["post_number"]=(int)$row->post_number; $thisline["date_create_raw"]=strtotime($row->date_create); if ($thisline["date_create_raw"]===-1) //не удалось преобразовать в time-stamp :( $thisline["date_create"]=""; //тогда ничего и не возвращаем else $thisline["date_create"] = date("j.m.Y",$thisline["date_create_raw"]); //должны же вернуть дату создания... $thisline["date_change_raw"]=strtotime($row->date_change); if ($thisline["date_change_raw"]===-1) //не удалось преобразовать в time-stamp :( $thisline["date_change"]=""; //тогда ничего и не возвращаем else $thisline["date_change"] = date("j.m.Y",$thisline["date_change_raw"]); //должны же вернуть дату создания... $thisline["date_lastview_raw"]=strtotime($row->date_lastview); if ($thisline["date_lastview_raw"]===-1) //не удалось преобразовать в time-stamp :( $thisline["date_lastview"]=""; //тогда ничего и не возвращаем else $thisline["date_lastview"] = date("j.m.Y",$thisline["date_lastview_raw"]); //должны же вернуть дату создания... $retarray[]=$thisline; } return $retarray; } //bbmsg_head_list_count - считаем сколько у нас всего сообщений в рубрике function bbmsg_head_list_count($dblink, $info_razdel, $theme_id) { $sqlwhere='where '.bbmsg_head_list_sqlfilter($info_razdel, $theme_id); $sql='select count(*) as count_rec from bb_msg_head '.$sqlwhere; $result=db_query($dblink, $sql); if (mysql_num_rows($result)>0) { $row=mysql_fetch_object($result); return (int)$row->count_rec; } return 0; } //bbmsg_head_add - добавляем в базу заголовок //передаем указатель на соединение с БД //и массив в котором указаны следующие поля: //$headarray["razdel_id"] - Номер BulletinBoard //$headarray["theme_id"] - номер раздела общения //$headarray["id_newsprog"] - номер сообщения по старой проге //$headarray["msg_subject"] - SUBJECT сообщения //$headarray["post_number"] - количество постов в теме function bbmsg_head_add($dblink, $headarray, $flag_increasecounter=1) { //проверяем переданные значения if ((int)$headarray["razdel_id"]==0) die ('bbmsg_head_add:razdel неправильно указан'); if ((int)$headarray["theme_id"]==0) die ('bbmsg_head_add:theme неправильно указан'); if ((int)$headarray["id_newsprog"]==0) die ('bbmsg_head_add:id_newsprog неправильно указан'); if ($headarray["msg_subject"]=="") die ('bbmsg_head_add:msg_subject неправильно указан'); //Если не указано время изменения, то ставим текущее время if ((int)$headarray["date_change_raw"]==0) $date_change_text="NOW()"; else //иначе указываем что ... $date_change_text="'".date("Y-m-j",$headarray["date_change_raw"])."'"; //Смотрим - нужно ли учитывать статистику if ((int)$flag_increasecounter<>0) { $statistic1='date_lastview, counter_view,'; $statistic2='NOW(), 1, '; } else { $statistic1=''; $statistic2=''; } //а теперь добавляем $sql='insert into bb_msg_head (razdel_id, theme_id, id_newsprog, msg_subject, date_create, date_change, '.$statistic1. 'post_number) '. 'values ("'.(int)$headarray["razdel_id"].'","'.(int)$headarray['theme_id'].'" ,"'.(int)$headarray["id_newsprog"].'" , "'.addslashes($headarray["msg_subject"]).'", NOW(), '.$date_change_text.', '.$statistic2. (int)$headarray["post_number"].')'; db_query($dblink,$sql); //функция возвращает идентификатор добавленной записи return mysql_insert_id($dblink); } //bbmsg_head_update - обновление информации о заголовке function bbmsg_head_update($dblink, $headarray_set, $headarray_old, $needupdatestat) { if ((int)$headarray_old["recid"]==0) die('bbmsg_head_update:recid is null'); $sqltextupdate=''; if ($needupdatestat==1) $sqltextupdate.=', counter_view=counter_view+1, date_lastview=NOW()'; //теперь производим проверку на необходимость обновления полей if ($headarray_set["razdel_id"]!=$headarray_old["razdel_id"]) $sqltextupdate.=', razdel_id='.$headarray_set["razdel_id"]; //пока для совместимости оставляем первую часть проверки if ($headarray_set["theme_id"]!="" && $headarray_set["theme_id"]!=$headarray_old["theme_id"]) $sqltextupdate.=', theme_id='.$headarray_set["theme_id"]; if ($headarray_set["msg_subject"]!=$headarray_old["msg_subject"]) $sqltextupdate.=', msg_subject="'.addslashes($headarray_set["msg_subject"]).'"'; if ($headarray_set["date_change_raw"]!=$headarray_old["date_change_raw"]) $sqltextupdate.=', date_change="'.date("Y-m-j",$headarray_set["date_change_raw"]).'"'; if ((int)$headarray_set["post_number"]!=(int)$headarray_old["post_number"]) $sqltextupdate.=', post_number='.(int)$headarray_set["post_number"]; if (strlen($sqltextupdate)>0) //если у нас есть что исправлять, то... { //надо внести изменения в БД $sql='update bb_msg_head set '.substr($sqltextupdate,2).' where id_record='.$headarray_old["recid"]; db_query($dblink,$sql); } } //bbmsg_head_seek - Ищем в базе заголовок //делаем выборку: ищем по: //номеру BulletinBoard ($info_razdel) //идентификатору старой программы($info_msgid) function bbmsg_head_seek($dblink, $info_razdel, $info_msgid) { $retarray=array(); $result=db_query($dblink, 'select id_record, razdel_id, theme_id, msg_subject, date_create, date_change, counter_view, post_number from bb_msg_head where razdel_id='.$info_razdel.' and id_newsprog='.$info_msgid); //смотрим сколько записей вернулось в результате запроса switch (mysql_num_rows($result)) { case 0: //ни одной записи не найдено, break; case 1: //найдена одна запись $row=mysql_fetch_object($result); //заполняем массив для возврата обратно $retarray["recid"]=$row->id_record; $retarray["razdel_id"]=$row->razdel_id; $retarray["theme_id"]=$row->theme_id; $retarray["msg_subject"]=$row->msg_subject; //Выполняем преобразование дат $retarray["date_create_raw"]=strtotime($row->date_create); $retarray["date_create"]=date("j.m.Y",$retarray["date_create_raw"]); $retarray["date_change_raw"]=strtotime($row->date_change); $retarray["date_change"]=date("j.m.Y",$retarray["date_change_raw"]); $retarray["counter_view"]=$row->counter_view; $retarray["post_number"]=(int)$row->post_number; break; default: //если вернулось непонятно сколько записей, то вываливаемся с ошибкой { $row=mysql_fetch_object($result); if ($row->id_record!=0) bbmsg_delete($dblink, $row->id_record); die('При открытии произошла ошибка. попробуйте повторить операцию. bbmsg_head_seek:error in db(razdel='.$info_razdel.',oldmsgid='.$info_msgid.') found '.(int)mysql_num_rows($result).' headers'); } } return $retarray; } //**************************************************************************** //Содержимое***************************************************************** //*************************************************************************** //bbmsg_body_get - извлекаем из БД сообщение как есть //в функцию передается идентификатор заголовка //возвращаем массив function bbmsg_body_get($dblink, $msg_head_id) { $retarray=array(); if ((int)$msg_head_id==0) die('bbmsg_body_get:error не указан msg_head_id'); $result=db_query($dblink, 'select record_id, owner_id, number_in_seq, date_rec, text_msg from bb_msg_body where owner_id='.$msg_head_id.' order by number_in_seq, record_id'); while(($row=mysql_fetch_object($result))) { $thisline["recid"]=$row->record_id; $thisline["owner_id"]=$row->owner_id; $thisline["number_in_seq"]=$row->number_in_seq; $thisline["date_rec_raw"]=strtotime($row->date_rec); if ($thisline["date_rec_raw"]===-1) //не удалось преобразовать в time-stamp :( $thisline["date_rec"]=""; //тогда ничего и не возвращаем else $thisline["date_rec"] = date("j.m.Y",$thisline["date_rec_raw"]); //должны же вернуть дату создания... $thisline["text_msg"]=$row->text_msg; $retarray[]=$thisline; } return $retarray; } //bbmsg_body_addpost - добавляем в БД новый пост... function bbmsg_body_addpost($dblink, $post) { $thisownerid=(int)$post["owner_id"]; $thisseq=(int)$post["number_in_seq"]; if ($thisownerid==0) die('Error:bbmsg_body_addpost ownerid=0'); if ($thisseq==0) die('Error:bbmsg_body_addpost numberseq=0'); $sql="insert into bb_msg_body (owner_id, number_in_seq, date_rec, text_msg) ". "values ('".$thisownerid."','".$thisseq."','".$post["date_rec"]."','".addslashes($post["text_msg"])."')"; db_query($dblink, $sql); } //bbmsg_body_removepost: удаляем "посты" из базы данных по идентификатору //значения в $frompost и $topost указываются "включительно" function bbmsg_body_removepost($dblink,$ownerid, $frompost) { //принудительное приведение переменных $ownerid=(int)$ownerid; $frompost=(int)$frompost; //проверка введенных значений if ($ownerid==0) die('Error bbmsg_body_removepost:ownerid=0'); if ($frompost==0) die('Error bbmsg_body_removepost:frompost=0'); //а теперь запросики пошли... db_query($dblink, 'delete from bb_msg_body where owner_id='.$ownerid.' and number_in_seq>='.$frompost); } //синхронизируем сообщение с SQL-ной базой данных //в $msgbody - то что требуется чтобы было function bbmsg_body_sync_to_sql($dblink, $msg_head_id, $msgbody) { $totcountold=count($msgbody); if ((int)$msg_head_id==0) die('bbmsg_body_sync_to_sql:error не указан msg_head_id.сообщение'.$msgbody); //для этого должны сначала все выбрать из БД и далее уже сравниваться... $msgbody_sql=bbmsg_body_get($dblink, $msg_head_id); $totcount=count($msgbody_sql); for ($i=0;$i<$totcount;$i++) { if ((int)$msgbody_sql[$i]["recid"]==0) //на всякий случай проверка на "гнилые значения" die('bbmsg_body_sync_to_sql:recid=0'); if ($totcountold<$i) //у нас в исходной базе сообщения закончились... { //значит из SQL базы вырезаем "лишние" сообщения начиная с текущего bbmsg_body_removepost($dblink, $msg_head_id, $i); $totcount=$totcountold; } else { $textsqlupdate=""; if ($msgbody_sql[$i]["number_in_seq"]!=$msgbody[$i]["number_in_seq"]) $textsqlupdate=", number_in_seq=".(int)$msgbody[$i]["number_in_seq"]; if ($msgbody_sql[$i]["date_rec_raw"]!=$msgbody[$i]["date_post_raw"]) $textsqlupdate=", date_rec='".date("Y-m-j",$msgbody[$i]["date_post_raw"])."'"; if ($msgbody_sql[$i]["text_msg"]!=$msgbody[$i]["post"]) $textsqlupdate=", text_msg='".addslashes($msgbody[$i]["post"])."'"; if (strlen($textsqlupdate)>0) { //выполняем запрос для модификации базы данных db_query($dblink,"update bb_msg_body set ".substr($textsqlupdate,2)." where record_id=".(int)$msgbody_sql[$i]["recid"]); } } } //теперь если у нас есть еще что-то "лишнее" в старой базе, чего нет в новой, //то надо это "лишнее" добавить туда... (продолжим по счетчику $i) for (;$i<$totcountold;$i++) { $thispost["owner_id"]=$msg_head_id; $thispost["number_in_seq"]=$i+1; $thispost["text_msg"]=$msgbody[$i]["post"]; bbmsg_body_addpost($dblink,$thispost); } } //**************************************************************************** //блок функций относящихся к сообщениям //**************************************************************************** //Извлекаем сообщение из БД //это третья версия процедуры: //1. "парсит" файл //2. отрабатывает заголовок сообщения и синхронизирует его с БД //3. синхронизирует тело сообщения с БД //параметры //$dblink - указатель на соединение //$info_razdel - какая конференция используется //$info_group - тема общения //$info_msgid - старый идентификатор сообщения //$type_order_post - как отсортировать посты внутри сообщения function getMsg_info_sql($dblink, $info_razdel, $info_group, $info_msgid, $type_order_post, $pagenumber, $flag_increasecounter = 1) { global $CONFIG; //проверка для жесткого приведения значения переменной $flag_increasecounter if ((int)$flag_increasecounter==0) $flag_increasecounter=0; else $flag_increasecounter=1; //info_msgid - это старый идентификатор //извлекаем название и "настоящий" идентификатор темы (по старому идентификатору темы) $info_group_array=bbrubrika_get($dblink, $info_razdel, $info_group); if (count($info_group_array)>0) $theme_id=$info_group_array["rubrika_id"]; else $theme_id=0; //определились $retarray=array(); //*************************************************************************** //сначала "по старому" извлекаем информацию из БД $txtarray=old_getMSG_array(0,$info_msgid,$info_razdel); //извлекаем текст сообщения //теперь все "загоняем" в новый формат массива для возврата пользователю $isdate_raw=parse_text_date($txtarray[1]); if ($isdate_raw!==-1) //это у нас дата. ее не должно быть в основном сообщении { $retarray["date_refresh_raw"]=$isdate_raw; $retarray["date_refresh"]=date ("d.m.Y",$retarray["date_refresh_raw"]);; } $retarray["found_flag"]=(int)$txtarray[4]; $retarray["msg_subject"]=$txtarray[2]; $retarray["msg_body_raw"]=old_msgprepare($txtarray[3]); //теперь надо все "разбить" на отдельные сообщения. // для этого построчно сканируем массив $msg_array=explode("\n",$retarray["msg_body_raw"]); $totallines=count($msg_array); $msg_by_post=array(); for ($i=0,$j=0;$i<$totallines;$i++) { //первая часть проверки правильная. вторая - костыль if (strlen($msg_array[$i])==0 || $msg_array[$i][0]=="\r") { //но если в массиве ничегошеньки нет, то не переходим на след.строку if (count($msg_by_post[$j])>0) $j++; } else { if ($msg_array[$i]=="_\r") //если символ _ на строке то нужно "обнулить" строку $msg_array[$i]="\r"; $msg_by_post[$j][] = $msg_array[$i]; } } $retarray["msg_post_count"]=$j;//сразу запоминаем сколько у нас постов $totalposts=$j; //теперь в двумерном массиве имеем всю информацию. //окончательная обработочка... //пробуем выделить из сообщения - дату сообщения... это последняя строка //но если дата не указана, то берем предыдущую дату. а совсем предыдущая дата //это date_refresh $lastdate_raw=$retarray["date_refresh_raw"]; for ($i=0;$i<$totalposts;$i++) { $countline=count($msg_by_post[$i]); $isdate_raw=-1; //сбрасываем флаг if ($countline>1) //у нас это не единственная строка... { $lastline=$msg_by_post[$i][$countline-1]; $isdate_raw=parse_text_date($lastline); if ($isdate_raw!==-1) //это у нас дата. ее не должно быть в основном сообщении unset($msg_by_post[$i][$countline-1]); } //теперь надо объединить все в единый такой массивчик if ($isdate_raw!==-1) //если сумели выделить дату, то должны ее теперь запомнить в нужных нам форматах... { $msg_loaded[$i]["date_post_raw"]=$isdate_raw; $lastdate_raw=$isdate_raw; } else $msg_loaded[$i]["date_post_raw"]=$lastdate_raw; $msg_loaded[$i]["date_post"]=date ("d.m.Y",$msg_loaded[$i]["date_post_raw"]); $msg_loaded[$i]["post"]=implode("\n",$msg_by_post[$i]); $msg_loaded[$i]["numberpost"]=$i+1; } $retarray["msg_body_by_post"]=$msg_loaded; //************************************************************************** //анализируем заголовок //для начала сразу делаем присвоение... $headarray["razdel_id"] = $info_razdel; //передаем в функцию $headarray["theme_id"] = $theme_id; //это мы в начале определились - с идентификатором темы общения $headarray["id_newsprog"] = $info_msgid; //передаем в функцию $headarray["msg_subject"] = $retarray["msg_subject"]; //извлекаем из старой базы $headarray["post_number"] = $retarray["msg_post_count"]; //запоминаем количество "постов" $headarray["date_change_raw"] = parse_text_date($retarray["date_refresh"]); //дата изменения сообщения $headarray["date_change"] = date("j.m.Y",$headarray["date_change_raw"]); //ищем в базе $msg_head=bbmsg_head_seek($dblink, $info_razdel, $info_msgid); //ищем его в SQL //анализируем возвращенное значение switch(count($msg_head)) { case 0: //в SQL базе заголовок не найден... if ($retarray["found_flag"]!=0) { //надо его туда добавить из старой базы $headarray["datecreate_raw"]=time(); $headarray["datecreate"] = date("j.m.Y",$headarray["datecreate_raw"]); //должны же вернуть дату создания... $headarray["recid"]=bbmsg_head_add($dblink, $headarray, $flag_increasecounter); //запускаем процедуру добавления $headarray["counter_view"]=1; //ставим счетчик что есть один просмотр! } else { //и в старой базе нет. на всякий случай освободим переменную unset($msg_head); unset($headarray); //доделать - нужна ли строка??? return array(); } break; default: //нашли заголовок //надо посмотреть - что у нас есть в старой базе if ($retarray["found_flag"]!=0) //сообщение есть и в старой базе { //делаем присвоения $headarray["datecreate"] = $msg_head["date_create"]; //эта информация только в SQL есть $headarray["datecreate_raw"]=$msg_head["date_create_raw"];//эта информация только в SQL есть $headarray["counter_view"] = $msg_head["counter_view"]; //эта информация только в SQL есть $headarray["recid"]=$msg_head["recid"]; //эта информация только в SQL есть //передаем в функцию - новые значения, старое значение и признак чтобы обновить статистику bbmsg_head_update($dblink,$headarray,$msg_head,$flag_increasecounter); } else {//в старой базе сообщение уже отстутствует. надо будет теперь тогда и из SQL удалять bbmsg_delete($dblink, $msg_head["recid"]); unset($msg_head); unset($headarray); //доделать - нужна ли строка??? return array(); } break; } $retarray["header"]=$headarray; //запоминаем в переменной информацию о заголовке //Теперь мы все загрузили и проанализировали из файла. //теперь работаем с SQL***************************************************** //надо синхронизировать загруженное сообщение с БД.... if ($retarray["header"]["recid"]==0) { die('getMsg_info_sql:идентификатор сообщения=0.'.$info_razdel.'/'.$info_group.'/'.$info_msgid); } bbmsg_body_sync_to_sql($dblink, $retarray["header"]["recid"], $retarray["msg_body_by_post"]); //теперь окончательные дообработки if ((int)$type_order_post==1) $retarray["msg_body_by_post"]=array_reverse($retarray["msg_body_by_post"],TRUE); //теперь надо отобрать сообщения для №ой страницы //$pagenumber, $CONFIG['bb_post_per_page'] //сначала номер страницы проверим на соответствие минимальным требованиям: if ($pagenumber<=0) $pagenumber=1; //теперь подсчитаем сколько у нас вообще страниц получается $totpages=util_calulate_count_page(count($retarray["msg_body_by_post"]), $CONFIG['bb_post_per_page']); //теперь проверим чтобы номер нужной страницы был меньше чем вообще количество страниц if ($totpages>$pagenumber) $totpages=$pagenumber; //теперь надо извлечь страницу... $retarray["msg_body_by_post"]=array_slice($retarray["msg_body_by_post"],(($pagenumber-1)*$CONFIG['bb_post_per_page']), $CONFIG['bb_post_per_page']); return $retarray; } //bbmsg_list_seek_id - ищем нужную запись в массиве function bbmsg_list_seek_id($seekin_array,$idrec, $indexname) { $countrec=count($seekin_array); for ( $i=0 ; $i<$countrec ; $i++ ) { if ($seekin_array[$i][$indexname]==$idrec) return $i; } return -1; } //bbmsg_list - извлекаем из базы список сообщений //$info_rubrika_old - старый идентификатор рубрики //$info_rubrika_id - новый идентификатор рубрики function bbmsg_list($dblink, $info_razdel, $info_rubrika_old, $info_rubrika_id, $pagenumber=0) { global $CONFIG; $temparray=array(); $temparray2=array(); //Сначала получаем из старой базы полный список сообщений switch((int)$info_razdel) { case 3: $workmode=2; //пока жесткое присвоение break; case 5: $workmode=1; //пока жесткое присвоение break; default: die('bbmsg_list:unsupported mode'); } if ((int)$info_rubrika_old==0) die('bbmsg_list:info_rubrika_old неправильная переменная'); if ((int)$info_rubrika_id==0) die('bbmsg_list:info_rubrika_id неправильная переменная'); $msglist=old_getListMSG($workmode, $info_rubrika_old); $temparray["total_msg"]=count($msglist); //теперь надо список построчно дообработать. while( ($currline=array_shift($msglist) ) ) { $thisline["msgid"]=0; //идентификатор в SQL-е сообщения $thisline["msgoldid"]=$currline[0]; //старый идентификатор (из старой программы) сообщения //пока не хотят такого строки кода... отключаем... // $thisline["msgsubject"]=bb_msg_old_rezhem_otvet($currline[2]);//заголовок сообщения $thisline["msgsubject"]=$currline[2];//заголовок сообщения $thisline["msgcreate"]=""; //дата создания сообщения. из старого варианта ее не достать - ее там просто нет. $thisline["date_change_raw"]=parse_text_date($currline[1]); //определяем дату обновления $thisline["date_change"]=date ("d.m.Y",$thisline["date_change_raw"]); $thisline["post_number"]=-1; $temparray2[]=$thisline; } $temparray["msglist"]=$temparray2; //теперь надо из SQL-а извлечь список сообщений в рубрике $temparray_sql=bbmsg_head_list_get($dblink, $info_razdel, $info_rubrika_id); $temparray_sql_count=count($temparray_sql); //...и произвести сравение списков... //сначала ищем новые и измененные в файл сервере сообщения for ($i=0;$i<$temparray["total_msg"];$i++) { $number_post=-1; $seeking_index=(int)$temparray["msglist"][$i]["msgoldid"]; //определяем какой же индекс ищем $foundedindex=bbmsg_list_seek_id($temparray_sql, $seeking_index , "record_id_old"); //...и ищем его в базе if ($foundedindex==-1) //запись не найдена в БД SQL, значит надо туда добавиться будет {//просто запустим синхронизацию - и все будет здорово. правда не особо быстро, но произойдет полная синхронизация записи $retarray=getMsg_info_sql($dblink, $info_razdel, $info_rubrika_old, $seeking_index,0,1,0); //запустим функцию извлечения сообщения из БД. и полностью синхронизируемся :) правда это будет долго, но надо по-любому $sqlrecid=$retarray["header"]["recid"]; //надо после добавления заголовка сделать присвоение... $number_post=$retarray["header"]["post_number"]; if ((int)$sqlrecid==0) { $temparray["msglist"][$i]["msgsubject"]="!error!".$temparray["msglist"][$i]["msgsubject"]; cycle; //die('bbmsg_list:после синхронизации(добавления)'.$seeking_index.'/'.$temparray["msglist"][$i]["msgsubject"].' возвращенный идентификатор = 0'); } } else //нашлась запись. надо свериться... { $sqlrecid=$temparray_sql[$foundedindex]["record_id"]; $number_post=$temparray_sql[$foundedindex]["post_number"]; //проверяем - изменилось ли чего нибудь или нет... $changeflag=0; if (strcmp($temparray["msglist"][$i]["msgsubject"],$temparray_sql[$foundedindex]["msg_subject"])!=0) $changeflag=1; if ($temparray["msglist"][$i]["date_change_raw"]!=$temparray_sql[$foundedindex]["date_change_raw"]) $changeflag=1; if ($changeflag==1) //изменились поля. скорее всего изменилось и содержимое. нужно обновиться... { $retarray=getMsg_info_sql($dblink, $info_razdel, $info_rubrika_old, $seeking_index,0,1,0); //запустим функцию извлечения сообщения из БД. и полностью синхронизируемся :) правда это будет долго, но надо по-любому if (count($retarray)==0) die('bbmsg_list:после синхронизации возвращенный результат = 0'); $number_post=$retarray["header"]["post_number"]; } } $temparray["msglist"][$i]["msgid"]=$sqlrecid; //делаем присвоение. это надо! $temparray["msglist"][$i]["post_number"]=$number_post; //делаем присвоение. это надо! // echo $number_post."//"; } //а теперь ищем удаленные из файл-сервера сообщения for ($i=0;$i<$temparray_sql_count;$i++) { $seeking_index=(int)$temparray_sql[$i]["record_id_old"]; $foundedindex=bbmsg_list_seek_id($temparray["msglist"], $seeking_index , "msgoldid"); if ($foundedindex==-1) //запись не найдена в БД, значит надо ее удалить... { //удаляем сообщение по его идентификатору в SQL базе bbmsg_delete($dblink,(int)$temparray_sql[$i]["record_id"]); } } //Теперь осуществляем разбиение на страницы //сначала номер страницы проверим на соответствие минимальным требованиям: if ($pagenumber<=0) $pagenumber=1; //теперь подсчитаем сколько у нас вообще страниц получается $totpages=util_calulate_count_page($temparray["total_msg"], $CONFIG['bb_msg_per_page']); //теперь проверим чтобы номер нужной страницы был меньше чем вообще количество страниц if ($totpages>$pagenumber) $totpages=$pagenumber; //теперь надо извлечь страницу... $temparray["msglist"]=array_slice($temparray["msglist"],(($pagenumber-1)*$CONFIG['bb_msg_per_page']), $CONFIG['bb_msg_per_page']); //все. обработка произведена. можно выходить... return $temparray; /*Старый кусок кода $temparray=array(); $temparray2=array(); //Сначала получаем из старой базы полный список сообщений if ((int)$info_razdel!=5) die('bbrubrika_get:unsupported mode'); if ((int)$info_rubrika_old==0) die('bbrubrika_get:info_rubrika_old неправильная переменная'); if ((int)$info_rubrika_id==0) die('bbrubrika_get:info_rubrika_id неправильная переменная'); $workmode=1; //пока жесткое присвоение $msglist=old_getListMSG($workmode, $info_rubrika_old); $temparray["total_msg"]=count($msglist); //теперь надо список построчно дообработать. while( ($currline=array_shift($msglist) ) ) { $thisline["msgid"]=0; //идентификатор в SQL-е сообщения $thisline["msgoldid"]=$currline[0]; //старый идентификатор (из старой программы) сообщения //пока не хотят такого строки кода... отключаем... // $thisline["msgsubject"]=bb_msg_old_rezhem_otvet($currline[2]);//заголовок сообщения $thisline["msgsubject"]=$currline[2];//заголовок сообщения $thisline["msgcreate"]=""; //дата создания сообщения. из старого варианта ее не достать - ее там просто нет. $thisline["date_change_raw"]=parse_text_date($currline[1]); //определяем дату обновления $thisline["date_change"]=date ("d.m.Y",$thisline["date_change_raw"]); $thisline["post_number"]=-1; $temparray2[]=$thisline; } $temparray["msglist"]=$temparray2; //теперь надо из SQL-а извлечь список сообщений в рубрике $temparray_sql=bbmsg_head_list_get($dblink, $info_razdel, $info_rubrika_id); $temparray_sql_count=count($temparray_sql); //...и произвести сравение списков... //сначала ищем новые и измененные в файл сервере сообщения for ($i=0;$i<$temparray["total_msg"];$i++) { $number_post=-1; $seeking_index=(int)$temparray["msglist"][$i]["msgoldid"]; //определяем какой же индекс ищем $foundedindex=bbmsg_list_seek_id($temparray_sql, $seeking_index , "record_id_old"); //...и ищем его в базе if ($foundedindex==-1) //запись не найдена в БД SQL, значит надо туда добавиться будет {//просто запустим синхронизацию - и все будет здорово. правда не особо быстро, но произойдет полная синхронизация записи $retarray=getMsg_info_sql($dblink, $info_razdel, $info_rubrika_old, $seeking_index,0,1,0); //запустим функцию извлечения сообщения из БД. и полностью синхронизируемся :) правда это будет долго, но надо по-любому $sqlrecid=$retarray["header"]["recid"]; //надо после добавления заголовка сделать присвоение... $number_post=$retarray["header"]["post_number"]; if ((int)$sqlrecid==0) die('bbmsg_list:после синхронизации(добавления) возвращенный идентификатор = 0'); } else //нашлась запись. надо свериться... { $sqlrecid=$temparray_sql[$foundedindex]["record_id"]; //проверяем - изменилось ли чего нибудь или нет... $changeflag=0; if (strcmp($temparray["msglist"][$i]["msgsubject"],$temparray_sql[$foundedindex]["msg_subject"])!=0) $changeflag=1; if ($temparray["msglist"][$i]["date_change_raw"]!=$temparray_sql[$foundedindex]["date_change_raw"]) $changeflag=1; if ($changeflag==1) //изменились поля. скорее всего изменилось и содержимое. нужно обновиться... { $retarray=getMsg_info_sql($dblink, $info_razdel, $info_rubrika_old, $seeking_index,0,1,0); //запустим функцию извлечения сообщения из БД. и полностью синхронизируемся :) правда это будет долго, но надо по-любому if (count($retarray)==0) die('bbmsg_list:после синхронизации возвращенный результат = 0'); $number_post=$retarray["header"]["post_number"]; } else $number_post=$temparray_sql[$foundedindex]["number_post"]; } $temparray["msglist"][$i]["msgid"]=$sqlrecid; //делаем присвоение. это надо! $temparray["msglist"][$i]["post_number"]=$number_post; //делаем присвоение. это надо! } //а теперь ищем удаленные из файл-сервера сообщения for ($i=0;$i<$temparray_sql_count;$i++) { $seeking_index=(int)$temparray_sql[$i]["record_id_old"]; $foundedindex=bbmsg_list_seek_id($temparray["msglist"], $seeking_index , "msgoldid"); if ($foundedindex==-1) //запись не найдена в БД, значит надо ее удалить... { //удаляем сообщение по его идентификатору в SQL базе bbmsg_delete($dblink,(int)$temparray_sql[$i]["record_id"]); } } //все. обработка произведена. можно выходить... return $temparray; */ } ?>