Перейти к контенту
  • 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]

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

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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

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

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

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