Autor Wątek: mySQL  (Przeczytany 7434 razy)

Offline Adam27

  • Użytkownik

  • +1
# Styczeń 19, 2016, 21:19:25
Zobacz lib/Debug. W Debug w głównym katalogu rzeczywiście nic nie ma.

Edit: Skoro już znalazłeś to OK :) Linkerowi musisz podac tylko .lib, a .dll musi być w folderze z exekiem albo w system32. No i oczywiście includy. Pozostałe pliki raczej nie są potrzebne.
« Ostatnia zmiana: Styczeń 19, 2016, 21:21:48 wysłana przez Adam27 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 19, 2016, 22:07:16
Cytuj
Linkerowi musisz podac tylko .lib

Najpierw podałem libcurl_imp.lib, nie działa.

Potem według wcześniej podanego artykułutm podałem curllib.lib, też nie działa.

Problem raczej błachy, ale kompletnie nie wiem co podać.

Logi:

[b]1>------ Build started: Project: Construgia, Configuration: Debug Win32 ------
1>LINK : fatal error LNK1104: cannot open file 'curllib.lib' (bo taki nie istnieje..)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

1>------ Build started: Project: Construgia, Configuration: Debug Win32 ------
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl saveToMySQL(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?saveToMySQL@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) referenced in function "int __cdecl _mangled_main(void)" (?_mangled_main@@YAHXZ)
1>E:\Projekty C++\The Construgert 3\Debug\Construgia.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Offline Adam27

  • Użytkownik

  • +1
# Styczeń 19, 2016, 22:16:53
SaveToMySQL to chyba Twoja funkcja?

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 19, 2016, 22:25:55
Taak, zdecydowanie widać że jestem przeziębiony. :P

Problem rozwiązany :)

Dzięki za pomoc :)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 19, 2016, 23:41:52
Teraz poszukuję funkcji w cURL, która pozwoliłaby mi na odczytanie HTML-u danej strony internetowej (mógłbym wtedy po prostu odwołać się do np "costrugia.c0.pl/API/?mt=save&whe=posX&what=231&login=****&pass=****", a strona zrobiłaby swoje, a wynik 'przesłała' echo()).

Znalazłem to: http://cpp0x.pl/dokumentacja/curl/895, gdzie podanych funkcji jest trochę mało i nie ma tam tego czego szukam.

Potem to: http://www.curlpp.org/guide.pdf (nie istnieje..) i jeszcze kilka starych lub brzydko sformatowanych (w ogóle nie sformatowanych) dokumentacji.

Zna ktoś jakiś fajnie napisany tutorial, lub przejrzystą dokumentację (przypominającą tą Unity czy też SFML)? Jeżeli tak to proszę o podanie mi linku, bardzo się przyda :)
« Ostatnia zmiana: Styczeń 19, 2016, 23:43:40 wysłana przez BrunonDEV »

Offline Xion

  • Moderator
    • xion.log

  • +1
# Styczeń 20, 2016, 03:21:19
Pierwsza lepsza odpowiedź ze StackOverflow po wpisaniu "libcurl get response body" w Google: http://stackoverflow.com/q/2329571 . W skrócie: musisz podać callback który będzie otrzymywał bajty odpowiedzi i zapisywał je gdzie tam chcesz.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 20, 2016, 08:51:08
Dzięki :)

Na tamtej stronce znalazłem również to: https://techoverflow.net/blog/2013/03/15/c-simple-http-download-using-libcurl-easy-api/

Okropnie ułatwia sprawę bo wystarczy że zrobię tak:

HTTPDownloader downloader;
std::string content = downloader.download("https://strona.com");

I już mam HTML-a strony. :)

Można powiedzieć, że nie wziąłem taksówki tylko autonomiczny samochód ;)

Więc "wielkie propsy" dla autora tego kodu, okazał się bardzo pomocny :)

Czyli stronę clienta już mam, teraz zajmę się PHP :)
« Ostatnia zmiana: Styczeń 20, 2016, 09:02:53 wysłana przez BrunonDEV »

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 22, 2016, 22:09:18
Zrobiłem już API, część logowania i natrafiłem na problem.

Gdy raz użyję funkcji do komunikacji z PHP i spróbuję ją wywołać drugi raz, nie zadziała i nie wiem z jakiego powodu.

Pliki:

HttpDownloader.h:

/**
 * HTTPDownloader.hpp
 *
 * A simple C++ wrapper for the libcurl easy API.
 *
 * Written by Uli Köhler (techoverflow.net)
 * Published under CC0 1.0 Universal (public domain)
 */

#include <string>

/**
 * A non-threadsafe simple libcURL-easy based HTTP downloader
 */
class HTTPDownloader {
public:
    HTTPDownloader();
    ~HTTPDownloader();
    /**
     * Download a file using HTTP GET and store in in a std::string
     * @param url The URL to download
     * @return The download result
     */
    std::string download(const std::string& url);
private:
    void* curl;
};

HttpDownloader.cpp:

/**
 * HTTPDownloader.hpp
 *
 * A simple C++ wrapper for the libcurl easy API.
 *
 * Written by Uli Köhler (techoverflow.net)
 * Published under CC0 1.0 Universal (public domain)
 */

#include <string>

/**
 * A non-threadsafe simple libcURL-easy based HTTP downloader
 */
class HTTPDownloader {
public:
    HTTPDownloader();
    ~HTTPDownloader();
    /**
     * Download a file using HTTP GET and store in in a std::string
     * @param url The URL to download
     * @return The download result
     */
    std::string download(const std::string& url);
private:
    void* curl;
};

DataBaseSave.h:

#ifndef dataBaseSave
#define dataBaseSave

void mysql(std::string mt, std::string par1, std::string par2, std::string id, std::string pass, std::string & stringout, int & intout);

#endif

DataBaseSave.cpp:

#include "httpDownloader.h"
#include <fstream>

HTTPDownloader downloader;

using namespace std;

void mysql(std::string mt, std::string par1, std::string par2, std::string id, std::string pass, std::string & stringout, int & intout){
std::string url;
url = "http://construgia.c0.pl/API/?mt=" + mt + "&par1=" + par1 + "&par2=" + par2 + "&id=" + id + "&pass=" + pass;
    std::string content = downloader.download(url);
stringout = content;
intout = atoi(content.c_str());
}

Kod w mejnie (znaczący fragment):

if(App::button("Zaloguj", button, l_button, 0, 0, 1, 0, "", 100, 180, 150, 35)){
mysql("getid", Login, "", "", "", ID, freeVariable);
if(ID == "")
allegro_message("Uzytkownik nie istnieje!");
else{
std::string passwordGood;
mysql("login", "", "", ID, md5("..."), passwordGood, freeVariable);

if(passwordGood == "done")
game();
else
allegro_message("Niepoprawne haslo!");
}
return 0;
}

Spróbuję jeszcze losowo komentować części kodu, tudzież robić małe zmiany i patrzeć co to da, lecz na razie męczę się z tym godzinę i dalej nie mam pojęcia co może być przyczyną problemu.
« Ostatnia zmiana: Styczeń 22, 2016, 22:13:46 wysłana przez BrunonDEV »

Offline Karol

  • Użytkownik

# Styczeń 23, 2016, 01:22:26
Spróbuję jeszcze losowo komentować części kodu, tudzież robić małe zmiany i patrzeć co to da
O łał, słyszałem o "shotgun sort", ale takie podejście do diagnozy problemu jest dla mnie nowością. Debugger się popsuł, czy klawisze F7 i F8 (choć kto tam wie jakie są w VS2010 czy co tam używasz)?

Btw. zwracanie oddzielnych informacji o istnieniu konta oraz poprawności hasła nie jest rozsądne, bo wystawia listę kont. Te dane powinny iść zawsze w parze, albo obie są ok, albo żadne.

//odpowiedź do poniższego, żeby nie śmiecić wątku
Wstawianie do kodu wypisywania stanu zmiennych lub wykomentowywanie kolejnych fragmentów (oczywiście dbając o poprawność składniową tego, co zostaje), a często oba na raz, to dość popularne metody diagnostyki
Owszem, ale przy jakichś algorytmach gdzie można tweakować jakieś parametry, albo patrzeć co się stanie jeżeli to czy tamto, albo gdy sprawdza się event, który wykonuje się wiele razy na sekundę, a błąd nie jest w każdym z nich (albo w PHP gdzie 99% devów var_dumpuje wszystko, nie wiedząc, że istnieje debugger). Przy tego typu problemach szybciej znajdzie się rozwiązanie wykonując kod krok po kroku i analizując co się dzieje, niż strzelając na chybił trafił.
« Ostatnia zmiana: Styczeń 23, 2016, 14:50:14 wysłana przez Karol »

Offline Xender

  • Użytkownik

  • +1
# Styczeń 23, 2016, 13:09:03
O łał, słyszałem o "shotgun sort", ale takie podejście do diagnozy problemu jest dla mnie nowością. Debugger się popsuł, czy klawisze F7 i F8 (choć kto tam wie jakie są w VS2010 czy co tam używasz)?
A dla mnie nie jest.
Wstawianie do kodu wypisywania stanu zmiennych lub wykomentowywanie kolejnych fragmentów (oczywiście dbając o poprawność składniową tego, co zostaje), a często oba na raz, to dość popularne metody diagnostyki i  zasługują na swoje miejsce obok debuggera czy symbolicznej kaczuszki (której wyjaśnia się kod kawałek po kawałku, z zamierzeniem, że podczas takiego szczegółowego wyjaśniania błąd odnajdzie się "przy okazji"). ;)

Btw. zwracanie oddzielnych informacji o istnieniu konta oraz poprawności hasła nie jest rozsądne, bo wystawia listę kont. Te dane powinny iść zawsze w parze, albo obie są ok, albo żadne.
O ile lista kont nie jest i tak publiczna.
Chociaż jeśli jest, oddzielenie nazwy użytkownika (wyświetlanej publicznie) od loginu i hasła (niepublicznych) może być dobrym pomysłem.
« Ostatnia zmiana: Styczeń 23, 2016, 13:10:37 wysłana przez Xender »

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 23, 2016, 18:26:06
Cytuj
O łał, słyszałem o "shotgun sort", ale takie podejście do diagnozy problemu jest dla mnie nowością. Debugger się popsuł, czy klawisze F7 i F8 (choć kto tam wie jakie są w VS2010 czy co tam używasz)?

Używam allegro 4 i nie wiem co jest nie tak.. ale debugger wywala się przy allegro_init(), co uniemożliwia jego używanie ;)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 24, 2016, 13:59:37
Ok, wiem w czym leży problem (w kodzie.. :P), dokładnie w w tym, że z jakiegoś powodu część zmiennej url, określającej adres strony, z której ma być pobrany HTML jest w następnej linii.

Zrobiłem zapis do pliku tej zmiennej i mam takie coś:

http://construgia.c0.pl/API/?mt=login&par1=&par2=&id=1
&token=hasloZapisaneWmd5

Oto funkcja w której ta zmienna jest tworzona:

void mysql(std::string mt, std::string par1, std::string par2, std::string id, std::string pass, std::string & stringout, int & intout){
std::string url;
url = "http://construgia.c0.pl/API/?mt=" + mt + "&par1=" + par1 + "&par2=" + par2 + "&id=" + id + "&token=" + pass;
        std::string content = downloader.download(url);
stringout = content;
intout = atoi(content.c_str());

        // Debug ->
ofstream plik;
plik.open("save.txt");
plik << url;
        // <- Debug
}

Nie mam natomiast pomysłu dlaczego tak się dzieje, jeżeli ktoś wie to proszę o pomoc :)

Offline Karol

  • Użytkownik

  • +1
# Styczeń 24, 2016, 15:08:20
Prześledź co się dzieje z id (i to skąd ta dana przychodzi).

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 24, 2016, 15:35:30
Heh, wpadłem na to zanim otrzymałem tu odpowiedź, w każdym razie dzięki. :)

Zrobiłem zapisanie ID do pliku, byłam jedna pusta linijka niżej.
Jednak nie wiem czemu tak się dzieje.. czyżby PHP-owe echo() stawia jakiegoś endl (czy coś takiego) automatycznie na końcu?

Jak to obejść?

Offline Karol

  • Użytkownik

# Styczeń 24, 2016, 15:45:38
Jeżeli nie dodasz żadnego PHP_EOL, albo \n to żaden znak nowej linii się nie doda. Zerknąłem zresztą pod ten Twój URL od API i nie zwraca nowej linii. Zostaje więc tylko downloader?

Pozbyć można się łatwo, ale brutalnie - po sformatowaniu url'a usuń wszystkie \n ;). A jeżeli to faktycznie wina downloadera i dolepia tam coś to trimuj jego output.