Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

In cosa sto sbagliando?

Iscritto
Messaggi: 21
Discussioni: 4
Registrato: 05-2013
Mix: 0
Sto creando evento in warrock "C#" e non riesco a definire una cosa, se il player è la prima volta che ha digitato l'evento "in questo caso ho messo Asd" allora inserisce nel db della tabella message_event la giusta stringa con actived 0, da il contenuto dell'evento e setta actived a 1. Se il player ha già fatto questo evento allora nel db non deve inserire nulla. ma arrivato a if (present[2].Equals(User.UserID)) la macchina mi da "Indice oltre i limiti della matrice" Cosa è che sto sbagliando?
Codice:
if (sMessage == "asd")
                           {
                              
                                string[] present = DB.runReadRow("SELECT ownerid, message, actived FROM message_event WHERE id='" + User.UserID + "'");
                               if (present[2].Equals(User.UserID)) return;
DB.runQuery("INSERT INTO message_event (ownerid, message , actived) VALUES ('" + User.UserID + "', '" + sMessage + "', '" + 0 + "')");
                            }
                            Thread.Sleep(1000);
                            string[] me = DB.runReadRow("SELECT ownerid, message, actived FROM message_event WHERE id='" + User.UserID + "'");

                            bool b = (me[2] == "1" ? true : false);

                            if (b == false)
                            {
                                
                                if (sMessage == "asd") //4ppyxmas-from-FW14
                                {
                                  
                                    int Rand = new Random().Next(0, 0);
                                    string ItemCode = null;
                                    int Days = 1;
                                    
                                    
                                  
                                        if (sMessage == "asd")
                                    {
                                        if (Rand == 0) { ItemCode = "CZ79"; Days = 0; }
                                    }
                                    DB.runQuery("UPDATE message_event SET actived='" + 1 + "' WHERE ownerid='" + User.UserID + "'");
                                    User.AddOutBoxItem(ItemCode, Days);
                                    User.Inventory = new InventoryItem[105];
                                    User.LoadItems();
                                    User.send(new PACKET_CHAT("SERVER", PACKET_CHAT.ChatType.Whisper, "SERVER >> Guarda il tuo OutBox!", User.SessionID, User.Nickname));
                                }
                            }
                            if (b == true)
                            {
                                User.send(new PACKET_CHAT("SERVER", PACKET_CHAT.ChatType.Whisper, "SERVER >> Guarda il tuo OutBoxerx!", User.SessionID, User.Nickname));
                            }
                                break;
                        }


11/01/2015, 16:02
#1
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 12/01/2015, 2:44 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
questo codice mi pare un po spaghettoso...

comunque... ti va in errore perchè tu vuoi controllare se nel db c'è o non c'è quella user, ma è chiaro che se non c'è non ti restituisce un'array di stringhe con il record e quindi è chiaro che ti va in errore, tu cerchi di leggere la colonna 2 di un record che non esiste.

In ogni caso non capisco perchè confronti il campo 2 (che visto cosi pare essere "actived") con la userid ? sono due cose diverse...

superando un attimo il fatto dell'errore, già che ci siamo vediamo cosa segue

perchè poi usi il construtto :

    C++ Programming
  1. bool b = (me[2] == "1" ? true : false);
  2.  
  3. if (b == false)
  4. {}
  5.  
  6. if (b==true)
  7. {}


funziona, ma non era piu facile un classico:

    C++ Programming
  1. if (me[2]=="1")
  2. {
  3. }
  4. else
  5. {
  6. }



e poi, perchè sopra controlli se sMessage==Asd per poi leggere il db e sotto invece prima leggi il db per poi controllare sMessage==Asd? non mi è davvero chiaro sto giro

inoltre sempre sotto, dopo aver controllato una volta se sMessage==Asd poco sotto ricontrolli se sMessage==Asd, perchè due controlli uno dopo l'altro?

Sotto poi prova a sostituire la parte
Citazione:SET actived='" + 1 + "'

con
Citazione:SET actived='1'

dovrebbe prendertelo lo stesso e ti semplificherebbe la vita


digger
12/01/2015, 2:12
#2
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 12/01/2015, 15:29 da Rokys091.)

Iscritto
Messaggi: 21
Discussioni: 4
Registrato: 05-2013
Mix: 0
il fatto è che il codice funziona alla grande ma non fa ciò che dico, mi spiego meglio. Supponiamo di avere un player "A" che ha digitato al momento dell'evento "Asd" il codice dovrbbe lavorare cosi:
-Controllare se è presente nella tabella "message_event" quel userid:
1a- Se non c'è esegue la funzione di insert proto.
2a- Se c'è legge se la colonna actived è settato a 1.
Se actived è a 1 non rilascia l'evento

Se actived è a 0
-Da l'oggetto che propone l'evento è setta ad actived 1, in modo che se lo stesso player "A" digita nuovamente "Asd" il player non ottiene di nuovo lo stesso oggetto ma non ottiene nulla.


Questa sarebbe l'operazione che dovrebbe avvenire alla digitazione di "Asd" ma non avviene cosi. Ogni volta che il player digita "Asd" avviene sempre l'operazione di insert proto e nella tabella di mysql appare più stringe dello stesso player "A" spero di essermi fatto capire Smile

12/01/2015, 15:27
#3
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Cosa ne pensate di Windows 8? Admin 7 2,073 17/12/2012, 17:44
Ultimo messaggio: TheFrank



Utenti che stanno guardando questa discussione: 1 Ospite(i)