Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Nazwa użytkownika jest już zajęta mimo, że nie jest(!)


Przejdź do rozwiązania Rozwiązane przez eider,

Rekomendowane odpowiedzi

Opublikowano (edytowane)

Mam forum na IPB 3.4.1. Po wykonaniu konwersji z SMF wszystko działa pięknie. Polskie znaki ogarnięte, etc etc. Problem jest jeden: forum na złość nie pozwala zmienić nazwy wyświetlanej użytkownika. Cokolwiek bym tam wpisał zawsze powie, że jest to używane. Problem jest o tyle dziwny, że po włączeniu debugowania nie widzę zapytań do bazy o tą nazwę użytkownika! Jedyne ślady tego, że coś się dzieje widać w: makeSeoTitle (nie-ma-tego) called i SELECT COUNT(*) as count, MIN(dname_date) as min_date FROM fs_dnames_change WHERE dname_member_id=11934 AND dname_date > 1355788071 AND dname_discount=0. Po tym zapytaniu nie ma już żadnego. Jako, że nie jestem byle użytkownikiem temat obadałem bardzo dokładnie przed napisaniem tutaj. Sprawdzałem i próbowałem debugować różne rzeczy w plikach, ale bez skutku. Plik którym się najwięcej bawiłem to usercpForms.php w core. Dokładnie chodzi o public function saveFormDisplayname() która wykonuje większość roboty. Czyli sprawdza czy formularz nie jest pusty, czy hasło jest poprawne itp. Tutaj wszystko przechodzi ładnie. Problem zaczyna się od try() i przechodzi dalej do catch().

if ( IPSMember::getFunction()->updateName( $this->memberData['member_id'], $members_display_name, 'members_display_name' ) === TRUE )
{
$this->cache->rebuildCache( 'stats', 'global' );
return $this->showFormDisplayname( '', $this->lang->words['dname_change_ok'] );
}
else
{
# We should absolutely never get here. So this is a fail-safe, really to
# prevent a "false" positive outcome for the end-user
return array( 0 => $this->lang->words['name_taken_change'] );
}

Poprzez prostą zabawę "return array( 0 => $this->lang->words['name_taken_change'] );" i podmienianiem tego tekstu na inny doszedłem do wniosku, że nasz fail-safe nie wykonuje się. Tak więc przechodzimy dalej do catch(). Po przejściu przez masę innych błędów, które na pewno się nie wykonują dochodzimy do USER_NAME_EXISTS. Zamiana words['name_change_taken'] na words['current_pw_bad'] nie dała oczekiwanego efektu, a więc mamy pierwszy znak zapytania. Dalej mamy jeszcze default jak przystało na każdy switch. Tam jest funkcja getMessage(), ale jej podmiana na return array( 0 => $this->lang->words['current_pw_bad'] ); nie dała niestety także żadnego efektu. Tutaj mamy drugi znak zapytania. Skoro nie wykonał się fail-safe, nie wykonał się updateName() i catch ze switchem nie zwraca żadnych błędów to gdzie mam szukać błędu?

Oczywiście mógłbym pomyśleć, że to wina konwersji i coś jest nie tak, ale pola się zgadzają, po za tym nie widzę zapytania które odpytywało by bazę o nową nazwę (a powinienem, patrząc na funkcję updateName() ;)

Edytowane przez eider
  • Manager
Opublikowano

Czekaj czekaj, piszesz o zmianie nazwy użytkownika, a potem o pliku usercpForms.php, więc wnioskuję, że mowa o zmianie publicznej nazwy użytkownika na forum, a nie w ACP.

Sprawa wygląda tak - skrypt sprawdza czy istnieje user o takiej nazwie oraz o takim loginie - tabela members, pola name oraz members_display_name. Sprawdź czy faktycznie nie ma tam nikogo o takim samym loginie. Musi być. ;)

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Opublikowano

Zapytanie o nazwę wyświetlaną na jaką chciałem zmienić zwraca zero wyników :-) " SELECT * FROM `fs_members` WHERE name='nie_ma_tego' OR members_display_name='nie_ma_tego' ". Jestem pewien, że nie ma takich nazw, bo wpisałem nawet "njdsjehffhoki" ;-) Zresztą jak pisałem, po włączeniu trybu debugowania w ustawieniach nie widzę zapytania do bazy o tą nazwę

Opublikowano

Jedyne co widzę w panelu użytkownika to: http://i.imgur.com/Wd7h2.png

Logi administracyjne milczą :-) Jak pisałem w pierwszym poście, bawiłem się już tym pliczkiem PHP i wygląda na to, że wywala się gdzie indziej. Gdzie? Nie mam pojęcia, ale catch() które normalnie łapie błędy nie wykonuje się

Opublikowano

Aktywna jest tylko IPB Internal. Converter jest wyłączona, ale jej włączenie nic nie zmienia. Zaznaczę, że konwersje wykonywałem na wersji 3.1 i później aktualizowałem forum do 3.4. Konwersje wykonywałem na 3.1 ponieważ konwerter pod 3.4 gubił strukturę działów z niewiadomych przyczyn. Podczas aktualizacji forum usunąłem aplikację konwertera, a więc jego dane zostały usunięte (m.in stare hasła zapisane w formacie SMF czy też dane potrzebne do przekierowania linków), ale raczej nie powinno mieć to wpływu na nazwy wyświetlane. Integracje z Facebookiem jest aktywna, ale jej wyłączenie nie zmienia nic.

  • Manager
Opublikowano

Jedyna opcja sprawdzająca to taka:

    public function nameExistsCheck( $name, $memberData, $fieldToCheck )
   {
       return false;

       $this->DB->build( array(
                                   'select' => "{$fieldToCheck}, member_id",
                                   'from'   => 'members',
                                   'where'  => $fieldToCheck . "='". $this->DB->addSlashes( strtolower($name) )."' AND member_id != ".$memberData['member_id'],
                                   'limit'  => array( 0,1 ) ) );

       $this->DB->execute();


       if ( $this->DB->getTotalRows() )
        {
           $this->return_code = 'NAME_IN_USE';
           return TRUE;
       }
   }

Na pewno dobrze sprawdziłeś czy nie ma tego usera o takiej nazwie?

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

  • Rozwiązanie
Opublikowano

Tak. Sprawdzałem dobrze. Funkcja którą podajesz nie jest wykonywana, a przynajmniej nie w moim IPB 3.4.1 ;-) Do teraz nie wiem co błąd powodowało bo nie bawiłem się w debugowanie. Natomiast podam rozwiązanie na wypadek gdyby ktoś miał kiedyś podobny problem.

Idziemy do /admin/sources/classes/member i otwieramy plik memberFunctions.php. Szukamy w nim funkcji updateName, to ona odpowiada za zmianę nazwy. Szukamy tam:

if ( $this->checkNameExists( $name, $member, $field ) === TRUE )
{
throw new Exception( "USER_NAME_EXISTS" );
}

i zamieniamy na:

$this->DB->build( array(
	 'select' => "{$field}, member_id",
	 'from' => 'members',
	 'where' => $field . "='". $this->DB->addSlashes( strtolower($name) )."' AND member_id != ".$member_id,
	 'limit' => array( 0,1 ) ) );
$this->DB->execute();

if ( $this->DB->getTotalRows() )
{
throw new Exception( "USER_NAME_EXISTS" );
}

To tyle ;-) Teraz troszkę rozważań: funkcja checkNameExists z memberFunctions.php wydaje się nieprawidłowo wywoływać sprawdzanie nazwy (a może autorzy w nowej wersji pomylili nazwy? Wszak te w różnych plikach różnią się jedynie kolejnością "name"). W każdym razie funkcja którą podałeś DawPi pochodzi z auth.php i nigdy nie jest wywoływana przez skrypt zmiany nazwy wyświetlanej w profilu. Zamiast niej wywoływana jest dosyć spora funkcja

/**
* Check for an existing display or user name
*
* @access public
* @param string Name to check
* @param array [ Optional Member Array ]
* @param string name or members_display_name
* @param bool Ignore display name changes check (e.g. for registration)
* @param bool Do not clean name again (e.g. coming from cleanAndCheckName)
* @return mixed Either an exception or ( true if name exists. False if name DOES NOT exist )
* Error Codes:
* NO_PERMISSION This user cannot change their display name at all
* NO_MORE_CHANGES The user cannot change their display name again in this time period
* NO_NAME No display name (or shorter than 3 chars was given)
* ILLEGAL_CHARS The display name contains illegal characters
*/
public function checkNameExists( $name, $member=array(), $field='members_display_name', $ignore=false, $cleaned=false )

Nie doszedłem i nie mam zamiaru dochodzić (brak czasu) gdzie funkcja się wywala, ale dodanie "return FALSE;" w środku nie daje efektu, a na początku daje, więc zapewne gdzieś na samym początku się wykrzacza. W każdym razie na pewno nie dochodzi do tej części kodu:

//-----------------------------------------
// Check for existing name.
//-----------------------------------------

/* Load the handler if it's not present */
if( ! $this->han_login )
{
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/handlers/han_login.php', 'han_login' );
 $this->han_login = new $classToLoad( $this->registry );
 $this->han_login->init();
}

$this->han_login->nameExistsCheck( $name, $member, $checkField );
if( $this->han_login->return_code AND $this->han_login->return_code != 'METHOD_NOT_DEFINED' AND $this->han_login->return_code != 'NAME_NOT_IN_USE' )
{
return TRUE;
}
$this->DB->build( array(
	 'select' => "{$field}, member_id",
	 'from' => 'members',
	 'where' => $checkField . "='" . $this->DB->addSlashes( strtolower($name) ) . "'" . ( $member['member_id'] ? " AND member_id != " . $member['member_id'] : '' ),
	 'limit' => array( 0,1 ) ) );

 $this->DB->execute();

Zaznaczam, że pliki IPB mam oryginalne, nawet wgrywałem je drugi raz specjalnie dla pewności ;-)

  • Lubię to 1
  • Manager
Opublikowano

Problem ROZWIĄZANY. Jeśli są jakiekolwiek wątpliwości, pytania proszę o wysłanie wiadomości do jednego z członków ekipy zarządzającej.

Wszelkie uzasadnione reklamacje/pretensje/sugestie/rady przyjmuje ekipa forum.

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.