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

Глюк с дополнительными полями


pet-krasnov

Вопрос

После удаления какого-нибудь зарегистрированного пользователя через центр администрирования его дополнительные данные (дополнительные поля) не удаляются. И при регистрации нового пользователя , при записи этих дополнительных данных, выскакивает ошибка

 

mySQL query error: INSERT INTO y_member_extra (id) VALUES (34)
 
mySQL error: Duplicate entry '34' for key 1
mySQL error code:

 

Это косяк в исходниках (форум 1.3) или я сам что-то замутил?

 

Как с этим справиться?

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

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

  • 0

pet-krasnov

ad_members.php, ф-ия dodelete()

смотри там запрос на удаление есть или нет.

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

  • 0

НАшёл строчки

$DB->query("DELETE from ibf_members WHERE id='".$IN['MEMBER_ID']."'");
 $DB->query("DELETE from ibf_pfields_content WHERE member_id='".$IN['MEMBER_ID']."'");
 $DB->query("DELETE from ibf_member_extra WHERE id='".$IN['MEMBER_ID']."'");

 

Первая выполняется, а вот вторая и третья почему-то не удаляют...

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

  • 0

pet-krasnov

трассируй код, смотри какой запрос исполняется, посмотри что приходит в $IN['MEMBER_ID']

а из ibf_members удаляется?

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

  • 0
А функция dodelete() вообще по боку, удаление идёт через remove_member(), в которой как раз удаление только из первой таблицы. Если просто добавить туда ещё пару запросов то не перекосится?
Ссылка на комментарий
Поделиться на других сайтах

  • 0

pet-krasnov ну я вот смотрю и не вижу _вообще_ у себя никакой remove_member.

У меня юзеры удаляются через Delete Users, далее выбираем ник, далее получаем форму с action на dodelete. Это у меня так.

Если у тебя по-другому то тебе и флаг в руки.

 

Если просто добавить туда ещё пару запросов то не перекосится?

с чего бы вдруг? ну вообще смотря как добавлять

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

  • 0

У меня русский модифицированный 1.3.

А функция эта есть в файле /admin/ad_massive.php

А удаляю я так же как и SHiSH - захожу в Пользователи и жму на ссылку Удалить около удаляемого пользователя или галочки проставляю. Результат описан в названии топика.

 

Если у тебя по-другому то тебе и флаг в руки.

Что значит "по-другому"? Как можно догадаться, форум этот не я делал :) А этот участок даже не модифицировал. ;)

 

Если я правильно понял проблему, то при удалении последнего зарегистрированного пользоателя его запись дополнительных полей (получается тоже последняя в таблице) не удаляется, и поэтому при регистрации нового пользователя система пытается добавить в таблицу ещё одну запись с таким же номером (а поле ключевое), т.е. выскакивает ошибка. И так до бесконечности, новые посетители нормально не зарегистрируются.

 

Есть идеи как там чего сделать, н делать боюсь - не знаю всю систему, могу чего-нибудь испортить.

 

Разберитесь там, пожалуйста. :D

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

  • 0

pet-krasnov

у меня нет такого файла. Ок, тогда добавляй туда нужные запросы.

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

  • 0

Сравнил я функции remove_member и dodelete и определил чего в remove_member для полного счастья не хватает. Это и приписал. По хорошему можно было просто затавить скрипт при удалении пользователей из списка пользователей обращаться к функции dodelete, но что-то не получился у меня этот фокус, видать не всё так просто. Пришлось делать не очень эстетично, зато надежно и практично :D

 

В файле source/admin/ad_massive.php ищещь строчку

 

$DB->query("DELETE FROM ibf_members WHERE id='".$IN['mid']."'");

(это собственно единственный запрос, который был реализован в функции remove_member())

 

Заменяешь на

 

// Convert their posts and topics into guest postings..

$DB->query("UPDATE ibf_posts SET author_id='0' WHERE author_id='".$IN['mid']."'");
 
$DB->query("UPDATE ibf_topics SET starter_id='0' WHERE starter_id='".$IN['mid']."'");

// Delete member...
 
$DB->query("DELETE from ibf_members WHERE id='".$IN['mid']."'");
$DB->query("DELETE from ibf_pfields_content WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_member_extra WHERE id='".$IN['mid']."'");
 
// Delete member messages...
 
$DB->query("DELETE from ibf_messages WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_contacts WHERE member_id='".$IN['mid']."' or contact_id='".$IN['mid']."'");
 
// Delete member subscriptions.
 
$DB->query("DELETE from ibf_tracker WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_forum_tracker WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_warn_logs WHERE wlog_mid='".$IN['mid']."'");
 
// Delete from validating..
 
$DB->query("DELETE FROM ibf_validating WHERE member_id='".$IN['mid']."'");

// Set the stats DB straight.
 
$DB->query("SELECT id, name FROM ibf_members WHERE mgroup <> '".$INFO['auth_group']."' ORDER BY joined DESC LIMIT 0,1");
 
$memb = $DB->fetch_row();
 
$DB->query("SELECT COUNT(id) as members from ibf_members WHERE mgroup <> '".$INFO['auth_group']."'");
$r = $DB->fetch_row();
// Remove "guest" account...
$r['members']--;
$r['members'] < 1 ? 0 : $r['members'];

$DB->query("UPDATE ibf_stats SET ".
            "MEM_COUNT={$r['members']}, ".
             "LAST_MEM_NAME='" . $memb['name'] . "', ".
            "LAST_MEM_ID='"   . $memb['id']   . "'");

 

Ещё нужно из таблиц member_extra и pfields_content удалить все лишние запси. Можно зайти в табличку members, посмотреть ID последнего пользователя и удалить из первых двух таблиц все записи с большим ID. Ну а можно попробовать скрипт написатЬ, который всё это культурно сделает, сейчас попытаюсь.

 

Надежность этого кода не гарантирую. Но у меня всё работает.

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

  • 0

в общем попробовал снести пользователей а он опять ругается :D (fix стоит)

в админке выбрал "или удалить следующих пользователей..."

Пользователей, написавших последнее сообщение [x] дней назад. оставил пустым

и пользователей, имеющих менее [x] сообщений на форуме 5

и пользователей, зарегистрированных [x] дней назад оставил пустым

и пользователей группы... пользователи

нажал удалить он их удалил но опять эта ошибка при регистрации ;):):)

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

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

  • 0

Song

подскажи где копать а то я в php и mysql ламер :D

Добавлено в [mergetime]1110118353[/mergetime]

а если именно одного пользователя удалять то удаляет все что нужно ;)

Добавлено в [mergetime]1110118805[/mergetime]

как я понял за массовое удаление пользователей отвечает вот эта часть в файле ad_member.php

 

 function doprune() {
 global $IN, $INFO, $DB, $SKIN, $ADMIN, $std, $MEMBER, $GROUP;
 
 //-----------------------------
 // Make sure we have *something*
 //------------------------------
 
 $query = trim(urldecode($std->txt_stripslashes($IN['query'])));
 
 $query = str_replace( "<", "<", $query );
 $query = str_replace( ">", ">", $query );
 
 if ($query == "")
 {
	 $ADMIN->error("Ошибка запроса удаления. Нет запроса на удаление.");
 }
 
 //-----------------------------
 // Get the member ids...
 //------------------------------
 
 $ids = array();
 
 $DB->query("SELECT id FROM ibf_members WHERE ".$query);
 
 if ( $DB->get_num_rows() )
 {
	 while ($i = $DB->fetch_row())
	 {
   $ids[] = $i['id'];
	 }
 }
 else
 {
	 $ADMIN->error("Не найдено ни одного пользователя, соответствующего введённым критериям.");
 }
 
 $id_string = implode( "," , $ids );
 
 $id_count = count($ids);
 
 // Convert their posts and topics into guest postings..
 
 $DB->query("UPDATE ibf_posts SET author_id='0' WHERE author_id IN(".$id_string.")");
 
 $DB->query("UPDATE ibf_topics SET starter_id='0' WHERE starter_id IN(".$id_string.")");
 
 // Delete member...
 
 $DB->query("DELETE from ibf_members WHERE id IN(".$id_string.")");
 
 $DB->query("DELETE from ibf_pfields_content WHERE member_id IN(".$id_string.")");
 
 // Delete member messages...
 
 $DB->query("DELETE from ibf_messages WHERE member_id IN (".$id_string.")");
 
 // Delete member subscriptions.
 
 $DB->query("DELETE from ibf_tracker WHERE member_id IN (".$id_string.")");
 
 // Delete from validating..
 
 $DB->query("DELETE FROM ibf_validating WHERE member_id IN (".$id_string.")");
 
 // Set the stats DB straight.
 
 $DB->query("SELECT id, name FROM ibf_members WHERE mgroup <> '".$INFO['auth_group']."' ORDER BY joined DESC LIMIT 0,1");
 
 $memb = $DB->fetch_row();
 
 $DB->query("SELECT COUNT(id) as members from ibf_members WHERE mgroup <> '".$INFO['auth_group']."'");
 $r = $DB->fetch_row();
 // Remove "guest" account...
 $r['members']--;
 $r['members'] < 1 ? 0 : $r['members'];
 
 $DB->query("UPDATE ibf_stats SET ".
               "MEM_COUNT={$r['members']}, ".
               "LAST_MEM_NAME='" . $memb['name'] . "', ".
               "LAST_MEM_ID='"   . $memb['id']   . "'");
               
 // Blow me melon farmer
 
 $ADMIN->save_log("Удаление $id_count пользователей");
 
 if ( USE_MODULES == 1 )
 {
	 $this->modules->register_class(&$this);
	 $this->modules->on_delete($ids);
 }
 
 $ADMIN->done_screen("Пользователи удалены", "Управление пользователями", "act=mem&code=edit" );
 
}

Добавлено в [mergetime]1110119995[/mergetime]

и заменил на

 function doprune() {
 global $IN, $INFO, $DB, $SKIN, $ADMIN, $std, $MEMBER, $GROUP;
 
 //-----------------------------
 // Make sure we have *something*
 //------------------------------
 
 $query = trim(urldecode($std->txt_stripslashes($IN['query'])));
 
 $query = str_replace( "<", "<", $query );
 $query = str_replace( ">", ">", $query );
 
 if ($query == "")
 {
	 $ADMIN->error("Ошибка запроса удаления. Нет запроса на удаление.");
 }
 
 //-----------------------------
 // Get the member ids...
 //------------------------------
 
 $ids = array();
 
 $DB->query("SELECT id FROM ibf_members WHERE ".$query);
 
 if ( $DB->get_num_rows() )
 {
	 while ($i = $DB->fetch_row())
	 {
   $ids[] = $i['id'];
	 }
 }
 else
 {
	 $ADMIN->error("Не найдено ни одного пользователя, соответствующего введённым критериям.");
 }
 
 $id_string = implode( "," , $ids );
 
 $id_count = count($ids);
 
 // Convert their posts and topics into guest postings..
 
 $DB->query("UPDATE ibf_posts SET author_id='0' WHERE author_id IN(".$id_string.")");
 
 $DB->query("UPDATE ibf_topics SET starter_id='0' WHERE starter_id IN(".$id_string.")");
 
 // Delete member...
 
 $DB->query("DELETE from ibf_members WHERE id IN(".$id_string.")");
 
 $DB->query("DELETE from ibf_pfields_content WHERE member_id IN(".$id_string.")");
 
 $DB->query("DELETE from ibf_member_extra WHERE id IN(".$id_string.")");
 // Delete member messages...
 
 $DB->query("DELETE from ibf_messages WHERE member_id IN (".$id_string.")");
 $DB->query("DELETE from ibf_contacts WHERE member_id IN (".$id_string.") or contact_id IN (".$id_string.")");

 // Delete member subscriptions.
 
 $DB->query("DELETE from ibf_tracker WHERE member_id IN (".$id_string.")");
 $DB->query("DELETE from ibf_forum_tracker WHERE member_id IN (".$id_string.")");
 $DB->query("DELETE from ibf_warn_logs WHERE wlog_mid IN (".$id_string.")");

 // Delete from validating..
 
 $DB->query("DELETE FROM ibf_validating WHERE member_id IN (".$id_string.")");
 
 // Set the stats DB straight.
 
 $DB->query("SELECT id, name FROM ibf_members WHERE mgroup <> '".$INFO['auth_group']."' ORDER BY joined DESC LIMIT 0,1");
 
 $memb = $DB->fetch_row();
 
 $DB->query("SELECT COUNT(id) as members from ibf_members WHERE mgroup <> '".$INFO['auth_group']."'");
 $r = $DB->fetch_row();
 // Remove "guest" account...
 $r['members']--;
 $r['members'] < 1 ? 0 : $r['members'];
 
 $DB->query("UPDATE ibf_stats SET ".
               "MEM_COUNT={$r['members']}, ".
               "LAST_MEM_NAME='" . $memb['name'] . "', ".
               "LAST_MEM_ID='"   . $memb['id']   . "'");
               
 // Blow me melon farmer
 
 $ADMIN->save_log("Удаление $id_count пользователей");
 
 if ( USE_MODULES == 1 )
 {
	 $this->modules->register_class(&$this);
	 $this->modules->on_delete($ids);
 }
 
 $ADMIN->done_screen("Пользователи удалены", "Управление пользователями", "act=mem&code=edit" );
 
}

вроде работает

Song

у меня всё правильно?

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

  • 0

нет я добавил недостающие поля для удаления взяв их из того что предложил добавить pet-krasnov и заменил

='".$IN['mid']."'"

на

 IN (".$id_string.")"

Добавлено в [mergetime]1110123767[/mergetime]

так у меня всё правитьно сделано или нет?

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

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

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

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

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

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

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

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

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

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

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

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