Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2017-06-10, 00:10


Grace

Kierowca Pralki






Wiek: 24
Na forum: 3437 dni
Posty: 168
Nick w MP: Grace

Piwa: 1031

Respekt: 35,8

Cze??, ubolewam si? z pobieraniem informacji z bazy danych.
Ot?? chcia?bym pobra? sobie z bazy list? os?b, kt?rzy s? w tabeli.
Wszystko ?adnie pi?knie, ale gdy robi? tak:
Pawn
if(listitem == 0)
            {
                new index 0;
                format(query256"SELECT * FROM pomoc_drogowa");
                mysql_query(query);
                mysql_store_result();
                while(mysql_fetch_row(query"|"))
                {
                    sscanf(query"p<|>ds[24]s[50]ddd",
                        PomocDrogowa[index][dUID],
                        PomocDrogowa[index][dNick],
                        PomocDrogowa[index][dRanga],
                        PomocDrogowa[index][dSkin],
                        PomocDrogowa[index][dWyplata],
                        PomocDrogowa[index][dSzef]);
                    format(strsizeof(str), "%s\n"PomocDrogowa[index][dNick]);
                }
                mysql_free_result();
                ShowPlayerDialog(playeridD_MENU_LISTADIALOG_STYLE_LIST"Lista pracownikow [PD]"str"Edytuj""Anuluj");
            }

To nie do?? ?e dialog otworz? tylko raz i p??niej za Chiny go nie otworz?,
dopiero po restarcie serwera, to jeszcze wczytuje si? tylko jedna osoba,
kt?ra jest ostatnia w tabeli (ma najwi?ksze UID).

Ma ktos jakis pomys? jak mo?na to zrobi? ?

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-06-10, 10:15


U123
[Usunięty]









na ko?cu w p?tli while
[pawn]
index++;
[/pawn]

 

 
Więcej szczegółów
Wystawiono 1 piw(a):
Grace
Wysłany: 2017-06-10, 10:21


Grace

Kierowca Pralki






Wiek: 24
Na forum: 3437 dni
Posty: 168
Nick w MP: Grace

Piwa: 1031

Respekt: 35,8

Mr.Reus, doda?e,m nie dzia?a.
Teraz moj kod wyglada tak, po przerobieniu:
Pawn
new stringpracownicy[500];
                mysql_query("SELECT * FROM pomoc_drogowa");
                mysql_store_result();
                if(mysql_num_rows() == 0)
                {
                    // BLAD NIE MA POJAZDOW
                }
                else
                {
                    for(new imysql_num_rows(); i++)
                    {
                        mysql_data_seek(i);
                        mysql_fetch_row_data();

                        format(stringpracownicysizeof(stringpracownicy), "%s\t%s\n"stringpracownicymysql_fetch_string("nick"));
                        i++;
                    }
                    ShowPlayerDialog(playeridD_MENU_LISTADIALOG_STYLE_LIST"Pracownicy Frakcji"stringpracownicy"Wybierz""Anuluj");
                }
                mysql_free_result();


Tylko ?e teraz, do dialogu dodawaj? si? pola dobrze (bo tyle ile jest danych w bazie tyle opcji w dialogu). Tylko problem jest taki, ze te pola s? puste, czyli s? i moge je zaznaczyc, ale s? puste.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-06-10, 11:47


Combacior







Wiek: 29
Na forum: 5796 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Czego? takiego jest mn?stwo, wystarczy pobra? jaki? rozbudowany skrypt i poszuka?. Przyk?ad ze skryptu starego uG na wy?wietlanie cz?onk?w gangu

Kod:

case 4:
{
new list[2048], name[25], rank, online, memberid;

m_query("SELECT uid, name, grang, online FROM Accounts WHERE gang = %d AND grang > -1 ORDER BY grang DESC", gangid);
mysql_store_result();

while(mysql_fetch_row(s, " "))
{
sscanf(s, "is[25]ii", memberid, name, rank, online);

if(online) format(list, 2048, "%s"NEUTRAL"(uID: %d) [%s] [%s] "L_GREEN"[online]\n", list, memberid, name, gangRangName[rank]);
else format(list, 2048, "%s"NEUTRAL"(uID: %d) [%s] [%s] "RED"[offline]\n", list, memberid, name, gangRangName[rank]);
}
mysql_free_result();

if(!gRang[playerid]) ShowPlayerDialog(playerid, D_MYGANG_MEMBERS, D_STYLE_MSG, gName[gangid], list, "Cofnij", "Zamknij");
else ShowPlayerDialog(playerid, D_MEMBERMANAGE, D_STYLE_LIST, gName[gangid], list, "Zarz?dzaj", "Cofnij");
}


Kod nie jest za bardzo optymalny, ale mo?esz si? na nim wzorowa?. Na pocz?tku wyja?nijmy kilka fakt?w.

"xMaslo" napisał/a:

format(query,?256,?"SELECT?*?FROM?pomoc_drogowa");
?? ??????????????mysql_query(query);


Po co tutaj funkcja format? Nie ma ?adnych parametr?w, ale widz?, ?e w drugim kodzie ju? jest tak jak by? powinno, wi?c zostawiam.

Potrzebujesz tylko nick gracza z tego zapytania, wi?c dlaczego pobierasz wszystkie warto?ci? Funkcja mysql_fetch_string pobiera dane po?rednio. U?ywaj?c jej, mo?esz pobra? tylko jedn? warto??. Potrzebujesz tylko nick, zatem mo?esz jej u?y?.

Kod:

if(listitem == 0)
{
new nick[25];
mysql_query("SELECT nick FROM pomoc_drogowa");
mysql_store_result();

while(mysql_fetch_string(nick))
{
strcat(str, nick);
strcat(str, "\n");
}
mysql_free_result();
ShowPlayerDialog(playerid, D_MENU_LISTA, DIALOG_STYLE_LIST, "Lista pracownikow [PD]", str, "Edytuj", "Anuluj");
}


Kodu nie testowa?em, ale powinien dzia?a?. Popraw sobie nazw? kolumny nicku gracza je?li masz inn?. Zamiast dw?ch funkcji strcat mo?na u?y? jednej format, wedle uznania. Nie polecam te? robi? czego? takiego

Kod:

new str[2048];
format(str, 2048, "%s"NEUTRAL"(uID: %d) [%s] [%s] "RED"[offline]\n", str, memberid, name, gangRangName[rank]);


Sam tak kiedy? robi?em, tak jak wida? w kodzie z cz?onkami gangu. Dlaczego nie polecam? Za ka?dym u?yciem funkcji format w p?tli w taki spos?b niepotrzebnie jest formatowany ju? wcze?niej sformatowany tekst. Oczywi?cie, jest to wygodne, ale nieoptymalne. Lepiej do tego u?y? funkcji strcat

Kod:

new str[2048], str2[64];
format(str2, sizeof str2, "%s"NEUTRAL"(uID: %d) [%s] [%s] "RED"[offline]\n", str, memberid, name, gangRangName[rank]);
strcat(str, str2);


Oczywi?cie wielko?? tablic te? musisz sobie ustawi?, nie ma potrzeby robi? takich wielkich.

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
Grace
Wysłany: 2017-06-10, 12:05


Grace

Kierowca Pralki






Wiek: 24
Na forum: 3437 dni
Posty: 168
Nick w MP: Grace

Piwa: 1031

Respekt: 35,8

Dalej wychodzi mi to samo, pola s? "puste".
Sprobowalem zaktualizowa? plugin i include, lecz nic mi to nie da?o.
W mysql_log.txt nic niema:
Kod:

Function: mysql_query executed: "SELECT * FROM pomoc_drogowa" with result: "0".
[Sat Jun 10 12:01:05 2017] Function: mysql_store_result executed with result: "1"
[Sat Jun 10 12:01:05 2017] Function: mysql_num_rows executed with result: "%".
[Sat Jun 10 12:01:05 2017] Function: mysql_num_rows executed with result: "%".
[Sat Jun 10 12:01:05 2017] Function: mysql_data_seek executed.
[Sat Jun 10 12:01:05 2017] Function: mysql_fetch_row_data executed.
[Sat Jun 10 12:01:05 2017] Function: mysql_fetch_string executed with result: "2".
[Sat Jun 10 12:01:05 2017] Function: mysql_num_rows executed with result: "%".
[Sat Jun 10 12:01:05 2017] Function: mysql_data_seek executed.
[Sat Jun 10 12:01:05 2017] Function: mysql_fetch_row_data executed.
[Sat Jun 10 12:01:05 2017] Function: mysql_num_rows executed with result: "%".
[Sat Jun 10 12:01:05 2017] Function: mysql_free_result executed.


Dodatkowo, serwer mi sie crashuje gdy podczas tych pustych p?l zmieni? z jednego na drugie.

Skrypt mam taki:
Pawn
#include <a_samp>
#include <mysql>
#include <sscanf2>
#include <zcmd>
//-------------------------------------------------
#define MYSQL_HOST "ukrywam"
#define MYSQL_LOGIN "ukrywam"
#define MYSQL_HASLO "ukrywam"
#define MYSQL_BAZA "ukrywam"
//-------------------------------------------------
#define D_MENU         12
#define D_MENU_ADD     13
#define D_MENU_DEL    14
#define D_MENU_WYP    15
#define D_MENU_SKIN 16
#define D_MENU_RANGA 17
#define D_MENU_UPRA    18
#define D_MENU_LISTA 19
//-------------------------------------------------
#define MAX_FRAKCJE 20
//-------------------------------------------------
enum dinfo
{
    dUID,
    dNick[24],
    dRanga[50],
    dSkin,
    dWyplata,
    dSzef
};
new PomocDrogowa[MAX_FRAKCJE][dinfo];
//-------------------------------------------------
new query[256];
new str[500];

new bool:pracuje[MAX_PLAYERS] = false;
// ------------------------------------------------
main(){}
//-------------------------------------------------
public OnFilterScriptInit()
{
    mysql_init(LOG_ALL);
    mysql_connect(MYSQL_HOSTMYSQL_LOGINMYSQL_HASLOMYSQL_BAZA);
    LoadPomocDrogowa();
    return 1;
}


CMD:panel(playeridparams[])
{
    for(new 0MAX_FRAKCJEi++)
    {
        if(PomocDrogowa[i][dSzef] == 1)
        {
            ShowPlayerDialog(playeridD_MENUDIALOG_STYLE_LIST"Zarzadzanie frakcja", 
                "Edytuj pracownikow\nEdytuj pojazdy\nEdytuj baze frakcji""Wybierz""Anuluj");
        }
    }
    return 1;
}

public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(dialogid == D_MENU)
    {
        if(response)
        {
            if(listitem == 0)
            {
                new nick[25]; 
                mysql_query("SELECT nick FROM pomoc_drogowa"); 
                mysql_store_result(); 

                while(mysql_fetch_string(nick)) 
                { 
                    strcat(strnick); 
                    strcat(str"\n"); 
                } 
                mysql_free_result(); 
                ShowPlayerDialog(playeridD_MENU_LISTADIALOG_STYLE_LIST"Lista pracownikow [PD]"str"Edytuj""Anuluj"); 
            }
        }
    }
    return 0;
}

CMD:sluzba(playerid)
{
    if(IsPlayerInRangeOfPoint(playerid2844.5335,2191.3909,10.8663))// wejscie do bazy PD
    {
        if(pracuje[playerid] == false)
        {
            format(query256"SELECT * FROM pomoc_drogowa WHERE nick = '%s'"PlayerName(playerid));
            mysql_query(query);
            new index 0;
            mysql_store_result();
            if(mysql_fetch_row(query"|"))
            {
                sscanf(query"p<|>ds[24]s[50]ddd",
                    PomocDrogowa[index][dUID],
                    PomocDrogowa[index][dNick],
                    PomocDrogowa[index][dRanga],
                    PomocDrogowa[index][dSkin],
                    PomocDrogowa[index][dWyplata],
                    PomocDrogowa[index][dSzef]);
                SetPlayerSkin(playeridPomocDrogowa[index][dSkin]);
                SetTimerEx("Wyplata"180000true"i"playerid);
                pracuje[playerid] = true;
                format(strsizeof(str), "Zaczynasz sluzbe Pomoc Drogowa: %d$, %s. Komendy /fcmd",
                    PomocDrogowa[index][dWyplata],
                    PomocDrogowa[index][dRanga]);
                SendClientMessage(playerid, -1str);
            }
            mysql_free_result();

        }
        else
        {
            SendClientMessage(playerid, -1"Juz pracujesz na sluzbie!");
        }
    }
    else
    {
        SendClientMessage(playerid, -1"{FF0000}Nie nalezysz do tej frakcji!");    
    }
    return 1;
}


// ------------------------------------------------
stock LoadPomocDrogowa()
{
    format(query256"SELECT * FROM pomoc_drogowa");
    mysql_query(query);

    new index 0;

    mysql_store_result();
    while(mysql_fetch_row(query"|"))
    {
        sscanf(query"p<|>ds[24]s[50]ddd",
            PomocDrogowa[index][dUID],
            PomocDrogowa[index][dNick],
            PomocDrogowa[index][dRanga],
            PomocDrogowa[index][dSkin],
            PomocDrogowa[index][dWyplata],
            PomocDrogowa[index][dSzef]);
        index++;
    }
    mysql_free_result();
    printf("\n\n>> Zaladowano poprawnie %d pracownikow pomocy drogowej\n\n"index);
    return 1;
}

stock PlayerName(playerid)
{
    new nick[24];
    GetPlayerName(playeridnicksizeof(nick));
    return nick;
}


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-06-10, 12:25


Combacior







Wiek: 29
Na forum: 5796 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Z log?w wynika, ?e nie przekompilowa?e? skryptu, gdy? nadal s? u?ywane funkcje mysql_data_seek, mysql_fetch_data_row (prawd? m?wi?c nie wiem co robi? te dwie funkcje, w og?le ich nie u?ywam). U mnie dzia?a dobrze

Kod:

new nick[25];
mysql_query("SELECT nick FROM abc");
mysql_store_result();

while(mysql_fetch_string(nick))
{
strcat(lString, nick);
strcat(lString, "\n");
}
print(lString);
mysql_free_result();



Struktura

Kod:


--
-- Struktura tabeli dla tabeli `abc`
--

CREATE TABLE IF NOT EXISTS `abc` (
`nick` varchar(24) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Zrzut danych tabeli `abc`
--

INSERT INTO `abc` (`nick`) VALUES
('Comb1'),
('Comb2'),
('Combo13'),
('C123');


Output

Kod:

[10.06.2017 12] Comb1
Comb2
Combo13
C123


Co do crash'a, to przed p?tl? while dodaj warunek sprawdzaj?cy, czy s? w og?le jakie? rekordy. Chocia? ja nie dostaj? crash'a, nawet bez ?adnych rekord?w.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-06-10, 12:42


Grace

Kierowca Pralki






Wiek: 24
Na forum: 3437 dni
Posty: 168
Nick w MP: Grace

Piwa: 1031

Respekt: 35,8

Jako ?e lista dzia?a, to chcia?bym teraz doda? inne informacje ktore beda wyswietlane w liscie:
Pawn
new nick[25], uidwyplata;
                format(query256"SELECT uid, nick, wyplata FROM pomoc_drogowa");
                mysql_query(query); 
                mysql_store_result(); 

                while(mysql_fetch_row(query"|")) 
                { 
                    sscanf(query"p<|>ds[24]d",uidnickwyplata);
                    format(strsizeof(str), "%d\t%s\t%d"uidnickwyplata);
                    strcat(str"\n"); 
                } 
                mysql_free_result(); 
                ShowPlayerDialog(playeridD_MENU_LISTADIALOG_STYLE_TABLIST"Lista pracownikow"str"OK""Anuluj");


Tak mi dzia?a, pokazuje sie poprawnie UID, Nick, oraz Wyplata. Jednak dalej
jest tylko to, co jest ostatnie w tabeli.

Kod:

--
-- Struktura tabeli dla tabeli `pomoc_drogowa`
--

CREATE TABLE `pomoc_drogowa` (
`uid` int(11) NOT NULL,
`nick` varchar(24) NOT NULL,
`ranga` varchar(50) NOT NULL,
`skin` int(11) NOT NULL,
`wyplata` int(11) NOT NULL,
`szef` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `pomoc_drogowa`
--

INSERT INTO `pomoc_drogowa` (`uid`, `nick`, `ranga`, `skin`, `wyplata`, `szef`) VALUES
(1, 'Szaman', 'c***', 7, 1000, 1),
(2, 'KamileK.', 'pracownik', 8, 15, 0),
(3, 'Piorun', 'nikt', 8, 10, 0);


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-06-10, 14:04


Combacior







Wiek: 29
Na forum: 5796 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Formatujesz g??wn? tablic?, przez co wcze?niejszy rekord zostaje nadpisany i go nie ma. Poda?em wy?ej jak to ma wygl?da?, jedna g??wna tablica + jedna ma?a pomocnicza do formatu

Kod:


new str[2048], str2[64];
format(str2, sizeof str2, "%s"NEUTRAL"(uID: %d) [%s] [%s] "RED"[offline]\n", str, memberid, name, gangRangName[rank]); //format malej tablicy
strcat(str, str2); //pomocnicza tablica dolaczana do glownej


Co to ma by??

Kod:

format(query, 256, "SELECT uid, nick, wyplata FROM pomoc_drogowa");


Ile razy mo?na pisa?, ?e nie u?ywa si? funkcji format je?li nie ma si? ?adnego parametru!

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-06-12, 23:44


Grace

Kierowca Pralki






Wiek: 24
Na forum: 3437 dni
Posty: 168
Nick w MP: Grace

Piwa: 1031

Respekt: 35,8

Ju? sobie poradzi?em, m?j problem polega? w tym, ?e gdy formatowaniem swoj? zmienna, nie dodawa?em tam tej zmiennej kt?ra formatuje ?eby si? wykonywa?a do skutku. Brzmi dziwnie, ale teraz jest dla mnie przynajmniej zrozumia?e.

Postaw piwo autorowi tego posta
 

 
Tagi: pobieranie :: mysql :: dialog
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » PAWN » Pobieranie z MySQL do dialog Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku