Diskuze: Prosím o pomoc
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Šoupni to prosím někam na pastebin. Když to kopíruju odtud, tak nevím, jestli to je nějaká ochrana při detekci licence, nebo ne, ale každopádně háže mi to nejspíš náhodně do slov pomlčky, takže když si to vložím do studia, tak to je nečitelné.
osm70 to tu vložil ako citáciu, nie ako kód, to preto.
Na 142 otevíráš channel.
Na 171 ho následně zavíráš.
Na 180 se z něj pokoušíš číst, i když už je 171 zavřený.
Na 206 se z něho znovu ve stejném bloku kódu pokoušíš číst (why?!)
Na 140 si inicializuješ proměnnou na výsledek, který ti to vrací vždy, protože máš uzavřený channel (socket) a tím pádem se do ní nic jiného nenastaví.
Takže teď zjednodušeně: odešleš přes socket požadavek na vytvoření usera a ihned ho zavřeš. Poté kontroluješ proměnnou "odpovědi", kterou si hned na začátek inicializuješ jako určitý druh odpovědi.
Proměnnou si inicializuj "nějak" a pak porovnávej, jestli je proměnná stejná a tím pádem zjistíš, že jsi nedostal odpověď ze serveru a nebo jestli je jiná, která bude mít X hodnot (účet vytvořen, nastala neznámá chyba, účet již existuje, atp.).
A pokud ti to vytváří uživatele i když již existuje (což by v ideálním případě nemělo na straně databáze), tak budeš mít nejspíš nějaký problém v bloku
ResultSet r = s.executeQuery("select * from user");
while (r.next()) {
String username = r.getString("name");
System.out.println(username);
if (array[0].equals(username)) {
taken = true;
}
}
Osobně bych nebral vše z databáze, ale bral bych jen zadané uživatelské
jméno (select whatever from user where name = proměnná)
a poté ověřoval přes
if (r.next()) {
taken = true;
}
Snad jsem tvůj kód pochopil správně a ty chápeš mě.
Zkusil jsem odstranit řádek 171 na kterém zavírám channel a dělá to pořád to samé.
Po odstranění 195 to už nevyhazuje vyjímku, ale pořád hlásí, že jméno je obsazené.
Účet to do DB zapisuje jen když neexistuje. Pokud udělám nový, vytvoří se, ale client řeknem že je jméno obsazeno.
Udělej to, co zmiňuji výše. Odeber ten jeden zbytečný (duplicitní) úsek čtení, pokud k jeho přítomnosti zde nemáš nějaký speciální důvod a zkus zjistit, zda-li dostáváš vůbec nějakou odpověď.
Potom budeš vědět, jakou cestou se ubírat dál. (jestli řešit proč dostáváš "takovou" odpověď ze serveru, nebo proč žádnou nedostáváš)
Nové informace:
if (tmp=='O') //napiš OK
if (tmp=='F' //obsazeno)
else //chyba připojení
System.out.println(tmp);
Dostanu se do else (chyba připojení), ale na konzoli se mi vypíše O.
Ahoj, protože by to mělo být if - else if - else.
Teď když je to OK, tak se dostaneš do O a potom protože to není F, tak se
dostaneš do else.
Předělal jsem to na else if a pořád to dělá to samé. A navíc, v tmp mám vždy O, i když je jméno obsazeno.
Přepsal jsi si už inicializaci proměnné tmp na něco jiného, než návratovou hodnotu (O) ?
Tak v tom případě boolean taken není nikdy true a máš problém někde v ověřování v podmínce
try {
Connection con = DriverManager.getConnection(url, name, pass);
Statement s = con.createStatement();
ResultSet r = s.executeQuery("select * from user");
while (r.next()) {
String username = r.getString("name");
System.out.println(username);
if (array[0].equals(username)) {
taken = true;
}
}
} catch (SQLException ex) {
}
a nebo ti rotuje v nějakém cyklu deklarace s inicializací Boolean taken = false; a vždy ti to přepíše hodnotu true zpět na false (méně pravděpodobná možnost).
Potom ti to musí fungovat. ověř si ještě hodnotu "taken" za "Returning result".
EDIT: Teď jsem si ještě všimnul... jakým způsobem proměnnou "taken" resetuješ ? Vidím, že ji nastavíš jednou na true a při dalším požadavku ?
Nastavuji ji uvnitř mé nekonečné smyčky. Smyčka se ukončí odpojením klienta. Při dalším připojení by měla začít znova. Aspoň myslím...
Zobrazeno 18 zpráv z 18.