Problem mit der MySQL Verbindung

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • ^Hallo, Comunity!


    Ich habe versucht mir ein Script auf Mysql Basis mit, zum testen, interner Mysql Datenbank zu erstellen.
    Das ganze habe ich mit dem R39-2 Plugin von BlueG mit Hilfe dieses Tutorials gemacht: MySQL R38 - Simples Anmeldung´s System


    Nur bekomme ich jetzt diese Mysql Errors:


    [21:20:25] [ERROR] mysql_connect - empty connection data specified
    [21:20:25] [ERROR] "mysql_errno" - invalid connection handle (id: 1)
    [21:20:32] [ERROR] "mysql_tquery" - invalid connection handle (id: 0)


    Der Code bei Mysql connect sieht so aus:
    public OnGameModeInit()
    {
    db_handle = mysql_connect(mysql_host,mysql_pass,mysql_data,mysql_user);
    if(mysql_errno() < 1)print("MySQL: Die Verbindung wurde erfolgreich hergestellt"); else print("MySQL: Die Verbindung ist fehlgeschlagen");
    UsePlayerPedAnims();
    SetGameModeText("Selfmade");
    return 1;
    }


    Das sind die Defines:
    #define mysql_host "127.0.0.1"
    #define mysql_user "Simon"
    #define mysql_data "samp"
    #define mysql_pass ""



    Ja, bei mysql_connect sind mysql_pass und mysql_user vertauscht! Das liegt aber daran, dass wenn es richtig ist die Meldung kommt, dass die Verbindung fehlgeschlagen ist. Und wenn ich es so habe funktioniert es..


    Ich hoffe jemand kann mir helfen.. Ich verzweifle gerade.


    MfG

  • Nimm den "root" Benutzer ohne Passwort.


    #define MYSQL_HOST "localhost"
    #define MYSQL_USER "root"
    #define MYSQL_PASS ""
    #define MYSQL_DATA "DATENBANKNAME"


    Das ist in 99% aller Fälle standardmäßig so eingestellt.
    Dein user "samp" wird nicht die richtigen Berechtigungen haben, das ist auf localhost (dein Rechner) so eingestellt, standardmäßig zumindest.
    Deshalb benutze, wie ich oben geschrieben habe, den root - User ohne Passwort, der hat ALLE Berechtigungen. Dem kannst du später auch, je nach Client, ein Passwort geben.


    Falls das nicht klappt, poste bitte den Log der gespeichert wird, wenn du die Verbindung aufbaust.

  • Der mysql Log:


    Spoiler anzeigen
    [21:46:30] [ERROR] mysql_connect - empty connection data specified
    [21:46:30] [ERROR] "mysql_errno" - invalid connection handle (id: 1)
    [21:47:00] [ERROR] "mysql_tquery" - invalid connection handle (id: 0)


    Der Server Log:

    Spoiler anzeigen
    Loaded log file: "server_log.txt".
    ----------

    Spoiler anzeigen
    SA-MP Dedicated Server
    ----------------------
    v0.3z, (C)2005-2014 SA-MP Team

    Spoiler anzeigen
    [21:46:30] filterscripts = "" (string)
    [21:46:30]
    [21:46:30] Server Plugins
    [21:46:30] --------------
    [21:46:30] Loading plugin: sscanf.dll
    [21:46:30]

    Spoiler anzeigen
    [21:46:30] ===============================

    Spoiler anzeigen
    [21:46:30] sscanf plugin loaded.

    Spoiler anzeigen
    [21:46:30] Version: 2.8.1

    Spoiler anzeigen
    [21:46:30] (c) 2012 Alex "Y_Less" Cole

    Spoiler anzeigen
    [21:46:30] ===============================

    Spoiler anzeigen
    [21:46:30] Loaded.
    [21:46:30] Loading plugin: mysql.dll
    [21:46:30] >> plugin.mysql: R39-2 successfully loaded.
    [21:46:30] Loaded.
    [21:46:30] Loaded 2 plugins.

    Spoiler anzeigen
    [21:46:30]
    [21:46:30] Filterscripts
    [21:46:30] ---------------
    [21:46:30] Loaded 0 filterscripts.

    Spoiler anzeigen
    [21:46:30] MySQL: Die Verbindung wurde erfolgreich hergestellt
    [21:46:30]
    ----------------------------------
    [21:46:30] Selfmade by Simon
    [21:46:30] ----------------------------------

    Spoiler anzeigen
    [21:46:30] Number of vehicle models: 0
    [21:47:00] Incoming connection: 127.0.0.1:51891
    [21:47:00] [join] Carl_Bauer has joined the server (0:127.0.0.1)
    [21:47:00] D1
    [21:47:00] D2



    D1 Und D2 sind meine Debugg Nachrichten.


    Der Code:
    public OnPlayerConnect(playerid)
    {
    new query[50];
    print("D1");
    format(query,sizeof(query),"SELECT * FROM user WHERE name='%e'",GPlayerName(playerid));
    mysql_tquery(db_handle,query,"UserCheck","i",playerid);
    print("D2");
    return 1;
    }


    forward UserCheck(playerid);
    public UserCheck(playerid)
    {
    print("D3");
    new num_rows,num_fields,str[128];
    cache_get_data(num_rows,num_fields,db_handle);
    print("D4");
    if(num_rows == 0)
    {
    format(str,sizeof(str),"{FFFFFF}Willkommen %s.{E40000}Dein Name wurde nicht gefunden!{FFFFFF}Du kannst dich jetzt registrieren!",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_REGISTER1,DIALOG_STYLE_INPUT,"Registrieren",str,"Registrieren","Abbrechen");
    return 1;
    }
    else
    {
    format(str,sizeof(str),"{FFFFFF}Willkommen %s.{00E500}Dein Account wurde gefunden!{FFFFFF}du kannst dich anmelden:",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_LOGIN1,DIALOG_STYLE_PASSWORD,"Login",str,"Login","Abbrechen");
    return 1;
    }
    }


    D3 wird nichtmehr geprintet..

  • Gut, habe alles geloggt!

    [21:46:30] [ERROR] mysql_connect - empty connection data specified
    [21:46:30] [ERROR] "mysql_errno" - invalid connection handle (id: 1)
    [21:47:00] [ERROR] "mysql_tquery" - invalid connection handle (id: 0)
    [22:31:03] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
    [22:31:03] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:31:03] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:31:03] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:31:04] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
    [22:31:04] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
    [22:31:23] [DEBUG] mysql_tquery - connection: 1, query: "SELECT * FROM user WHERE name='e'", callback: "UserCheck", format: "i"
    [22:31:42] [DEBUG] mysql_connect - host: "localhost", user: "root", database: "samp", password: "****", port: 3306, autoreconnect: true, pool_size: 2
    [22:31:42] [DEBUG] CMySQLHandle::Create - creating new connection..
    [22:31:42] [WARNING] CMySQLHandle::Create - connection already exists
    [22:31:42] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:32:23] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
    [22:32:23] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:32:23] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:32:23] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [22:32:24] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
    [22:32:24] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
    [22:33:20] [DEBUG] mysql_tquery - connection: 1, query: "SELECT * FROM user WHERE name='e'", callback: "UserCheck", format: "i"



    Falls du sonst irgendetwas brauchst sag es einfach!


    Und jetzt steht auch in der Server Log, dass die Verbindung fehlgeschlagen ist

  • Zitat

    [22:32:23] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)


    Ist der lokale MySQL Server an? Sieht nämlich nicht danach aus.


    Hast du einen anderen Code der auch eine Verbindung aufbauen will?
    Hast du es mal mit 127.0.0.1 anstatt localhost versucht?



    Und nebenbei:
    format(query,sizeof(query),"SELECT * FROM user WHERE name='%e'",GPlayerName(playerid));
    zu:
    mysql_format(db_handle,query,sizeof(query),"SELECT * FROM user WHERE name='%e'",GPlayerName(playerid));


    Bin jetzt weg, ich schaue mir deine Antwort morgen an.

  • Soo hallo Jeffrey


    Ich habe mir jetzt eine Mysql Datenbank bei Nitrado gehostet, jetzt mal für 3 Tage ^^


    Jetzt bekomme ich auch die Dialoge angezeigt und kann mein Passwort eingeben.


    Nur wird jetzt nichts in die Datenbank geschrieben bei der Registrierung :(


    Das ist der Code:


    public OnPlayerConnect(playerid)
    {
    new query[50];
    print("D1");
    format(query,sizeof(query),"SELECT * FROM user WHERE name='%e'",GPlayerName(playerid));
    mysql_tquery(db_handle,query,"UserCheck","i",playerid);
    print("D2");
    return 1;
    }


    forward UserCheck(playerid);
    public UserCheck(playerid)
    {
    print("D3");
    new num_rows,num_fields,str[128];
    cache_get_data(num_rows,num_fields,db_handle);
    print("D4");
    if(num_rows == 0)
    {
    format(str,sizeof(str),"{FFFFFF}Willkommen %s.{E40000}Dein Name wurde nicht gefunden!\n{FFFFFF}Du kannst dich mit deinem Passwort registrieren: ",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_REGISTER1,DIALOG_STYLE_INPUT,"Registrieren",str,"Registrieren","Abbrechen");
    return 1;
    }
    else
    {
    format(str,sizeof(str),"{FFFFFF}Willkommen %s.{00E500}Dein Account wurde gefunden!{FFFFFF}du kannst dich anmelden:",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_LOGIN1,DIALOG_STYLE_PASSWORD,"Login",str,"Login","Abbrechen");
    return 1;
    }
    }


    if(dialogid == D_REGISTER1)
    {
    if(response)
    {
    if(strlen(inputtext) <= 5 || strlen(inputtext) >= 21)return ShowPlayerDialog(playerid,D_REGISTER1,DIALOG_STYLE_INPUT,"Registrieren","Dein Passwort muss zwischen 6 und 20 Zeichen liegen!","Registrieren","Abbrechen");
    RegisterPlayer(playerid,inputtext);
    pRegV[playerid] = 0;
    return 1;
    }
    if(pRegV[playerid] == 0) return ShowPlayerDialog(playerid,D_REGISTER1,DIALOG_STYLE_INPUT,"Registrieren","Du hast auf 'Abbrechen' gelickt! Du kannst dich erneut registrieren:","Registrieren","Abbrechen"); pRegV[playerid] = 1;
    if(pRegV[playerid] == 1) return SCM(playerid,frot,"[FEHLER]: Du hast die Registrierung abgebrochen! Auf Wiedersehen!"); Kick(playerid);
    }


    stock RegisterPlayer(playerid,inputtext[])
    {
    print("RegisterPlayer");
    new query[250],key[50];
    format(key,sizeof(key),"%s",inputtext);
    format(query,sizeof(query),"INSERT INTO user SET (name,passwort,level,geld,alevel) VALUES ('%e','%e',1,0,0)",GPlayerName(playerid),key);
    mysql_tquery(db_handle,query);
    ShowPlayerDialog(playerid,D_REGISTER2,DIALOG_STYLE_MSGBOX,"WILLKOMMEN","Willkommen auf meinem Server! Mit /help siehst du die wichtigsten Befehle!","Annehmen","");
    return 1;
    }

  • Da ist ein "e" zu viel in deinem Zitierungs-Versuch. ;)


    Also, schreib es erst mal so:
    stock RegisterPlayer(playerid,key[])
    {
    print("RegisterPlayer");
    new query[250];
    mysql_format(db_handle,query,sizeof(query),"INSERT INTO user (name,passwort,level,geld,alevel) VALUES ('%e','%e',1,0,0)",GPlayerName(playerid),inputtext);
    mysql_tquery(db_handle,query);
    ShowPlayerDialog(playerid,D_REGISTER2,DIALOG_STYLE_MSGBOX,"WILLKOMMEN","Willkommen auf meinem Server! Mit /help siehst du die wichtigsten Befehle!","Annehmen","");
    return 1;
    }


    Das wird den Fehler aber wahrscheinlich nicht beheben.


    Schalte den mysql_debug mit LOG_ALL ein und poste dann was im Log steht, wenn du dich registrierst.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Ja tut mir leid, ich spiele auf Nova e-Sports mit einem der Jeffrey heist ^^ ist Macht der Gewohnheit Jeffry - Diesmal richtig ;)


    [pwn}
    [19:52:25] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
    [19:52:25] [DEBUG] CMySQLConnection::Connect - connection was successful
    [19:52:25] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
    [19:52:25] [DEBUG] CMySQLConnection::Connect - connection was successful
    [19:52:25] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
    [19:52:25] [DEBUG] CMySQLConnection::Connect - connection was successful
    [19:52:25] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
    [19:52:45] [DEBUG] mysql_tquery - connection: 1, query: "SELECT * FROM user WHERE name='e'", callback: "UserCheck", format: "i"
    [19:52:45] [DEBUG] CMySQLQuery::Execute[UserCheck] - starting query execution
    [19:52:45] [DEBUG] CMySQLQuery::Execute[UserCheck] - query was successfully executed within 23.740 milliseconds
    [19:52:45] [DEBUG] CMySQLResult::CMySQLResult() - constructor called
    [19:52:45] [DEBUG] Calling callback "UserCheck"..
    [19:52:45] [DEBUG] cache_get_data - connection: 1
    [19:52:45] [DEBUG] CMySQLResult::~CMySQLResult() - deconstructor called
    [19:52:49] [DEBUG] mysql_tquery - connection: 1, query: "INSERT INTO user SET (name,passwort,level,geld,alevel) VALUES ('", callback: "(null)", format: "(null)"
    [19:52:49] [DEBUG] CMySQLQuery::Execute[] - starting query execution
    [19:52:49] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(name,passwort,level,geld,alevel) VALUES ('e','e',1,0,0)' at line 1
    [19:52:49] [DEBUG] CMySQLQuery::Execute[] - error will be triggered in OnQueryError[/pwn]

  • Schreibe es so:
    stock RegisterPlayer(playerid,key[])
    {
    print("RegisterPlayer");
    new query[250];
    mysql_format(db_handle,query,sizeof(query),"INSERT INTO user (name,passwort,level,geld,alevel) VALUES ('%e','%e',1,0,0)",GPlayerName(playerid),inputtext);
    mysql_tquery(db_handle,query);
    ShowPlayerDialog(playerid,D_REGISTER2,DIALOG_STYLE_MSGBOX,"WILLKOMMEN","Willkommen auf meinem Server! Mit /help siehst du die wichtigsten Befehle!","Annehmen","");
    return 1;
    }


    Nicht vergessen, das "format" zu "mysql_format" zu ändern, sonst geht es nicht, wie du siehst hast du nur 'e' da stehen.

  • Danke Jeffry ! Hat soweit auch geklappt...
    Nur anscheinend doch nicht alles ^^


    Wenn ich mich jetzt wieder anmelde komme ich zum Register Dialog.. Ich weiß nur nicht warum :/ Hier ist UserCheck der aufgerufen wird beim connecten, rest vom Code steht ee oben!


    forward UserCheck(playerid);
    public UserCheck(playerid)
    {
    print("D3");
    new num_rows,num_fields,str[128];
    cache_get_data(num_rows,num_fields,db_handle);
    print("D4");
    if(num_rows == 0)
    {
    format(str,sizeof(str),"{FFFFFF}Willkommen %s.{E40000}Dein Name wurde nicht gefunden!\n{FFFFFF}Du kannst dich mit deinem Passwort registrieren: ",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_REGISTER1,DIALOG_STYLE_INPUT,"Registrieren",str,"Registrieren","Abbrechen");
    return 1;
    }
    else
    {
    format(str,sizeof(str),"{FFFFFF}Willkommen %s.{00E500}Dein Account wurde gefunden!{FFFFFF}du kannst dich anmelden:",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_LOGIN1,DIALOG_STYLE_PASSWORD,"Login",str,"Login","Abbrechen");
    return 1;
    }
    }



    Und wie man hier sieht ist es eingetragen:



    Info: Das Passwort ist irgendwas ;) also sowieso kein wichtiges

  • public OnPlayerConnect(playerid)
    {
    new query[50];
    print("D1");
    format(query,sizeof(query),"SELECT * FROM user WHERE name='%e'",GPlayerName(playerid));
    mysql_tquery(db_handle,query,"UserCheck","i",playerid);
    print("D2");
    return 1;
    }

  • Die Probleme wollen einfach nicht aufhören!


    Mir ist aufgefallen, dass ich bei der Passwort Eingabe einfach mal vergessen habe abzufragen ob das Passwort richtig ist...


    Nur weiß ich nicht wie ich das am besten mache :/ Hoffe ihr könnt mir helfen..


    Hier ist der Login Dialog in dem das Passwort eingegeben wird:


    if(dialogid == D_LOGIN1)
    {
    if(response)
    {
    new query[128],key[50];
    format(key,sizeof(key),"%s",inputtext);
    format(query, sizeof(query), "SELECT * FROM user WHERE name='%e' AND password='%e'", GPlayerName(playerid), key);
    mysql_tquery(db_handle, query, "OnPasswordResponse", "i", playerid);
    pRegV[playerid] = 0;
    return 1;
    }
    if(pRegV[playerid] == 0)return ShowPlayerDialog(playerid,D_LOGIN1,DIALOG_STYLE_PASSWORD,"LOGIN","Du hast auf Abbrechen geklickt und kannst es erneut versuchen:","Login","Abbrechen"); pRegV[playerid] = 1;
    if(pRegV[playerid] == 1)return SCM(playerid,frot,"[FEHLER]: Du hast den Login abgebrochen! Auf Wiedersehen!"); KickPlayer(playerid);
    return 1;
    }


    Hier ist OnPasswordResponse:
    forward OnPasswordResponse(playerid);
    public OnPasswordResponse(playerid)
    {
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields);
    if(num_rows == 0)
    {
    if(pRegV[playerid] == 0)
    {
    new str[128];
    format(str,sizeof(str),"Dein Passwort war falsch! Du kannst es jetzt erneut versuchen!",GPlayerName(playerid));
    ShowPlayerDialog(playerid,D_LOGIN1,DIALOG_STYLE_PASSWORD,"Login",str,"Login","Abbrechen");
    return 1;
    }
    else if(pRegV[playerid] == 1)
    {
    SCM(playerid,frot,"[FEHLER]: Dein Passwort war falsch! Auf Wiedersehen!");
    Kick(playerid);
    return 1;
    }
    return 1;
    }
    else
    {
    LoadPlayer(playerid);
    return 1;
    }
    }

    Einmal editiert, zuletzt von Simon2202 ()

  • Wieso? Du hast doch die Abfrage hier:
    format(query, sizeof(query), "SELECT * FROM user WHERE name='%e' AND password='%e'", GPlayerName(playerid), key);


    Und dann fragst du ab ob 0 oder nicht 0 Zeilen vorhanden sind.
    Null = falsches Passwort
    Nicht Null = richtiges Passwort


    :rolleyes: