tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
338
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi Leute,

    sitze gerade an einer Loginfunktion für mein C-Programm. Leider komm ich nicht weiter, die Datenbankabfrage schlägt immer fehl.

    Die Datenbanktabelle exisitert, es ist auch ein Eintrag vorhanden der eigentlich gefunden werden müsste.

    Hier der Codeausschnitt für die Loginfunktion:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    
    /*
    Aus dem Header:
      #define MYSQL_QUERY_LOGIN \
          "SELECT ID FROM users WHERE user = ? AND pass = ?"
     
    e: Eigene Struktur mit der Datenbankverbindung und diversen Parametern
    u: Benutzername, Parameter der Funktion
    p: Passwort, Parameter der Funktion
    */
     
      /* statement erstellen */
      stmt = mysql_stmt_init(e->connection);
      if(stmt == NULL) {
        logger_write(log, LOGLEVEL_ERROR, "MySQL: (login) Unable to "
            "initialize statement: %u: %s", mysql_errno(e->connection),
            mysql_error(e->connection));
        pthread_mutex_unlock(&e->mutex);
     
        return false;
      }
     
      /* statement vorbereiten */
      if(mysql_stmt_prepare(stmt, MYSQL_QUERY_LOGIN,
            strlen(MYSQL_QUERY_LOGIN)) != 0) {
        logger_write(log, LOGLEVEL_ERROR, "MySQL: (login) Unable to "
            "prepare statement: %u: %s", mysql_errno(e->connection),
            mysql_error(e->connection));
        mysql_stmt_close(stmt);
        pthread_mutex_unlock(&e->mutex);
     
        return false;
      }
     
      /* parameter initialisieren */
      memset(params, 0, sizeof(params));
      memset(result, 0, sizeof(result));
     
      /* parameter initialisieren */
      params[0].buffer_type    = MYSQL_TYPE_STRING;
      params[0].buffer         = &u;
      params[0].is_unsigned    = true;
     
      params[1].buffer_type    = MYSQL_TYPE_STRING;
      params[1].buffer         = &p;
      params[1].is_unsigned    = true;
     
      result[0].buffer_type    = MYSQL_TYPE_LONG;
      result[0].buffer         = &erg;
      result[0].is_unsigned    = true;
     
      /* parameter binden */
      if(mysql_stmt_bind_param(stmt, params) != 0) {
        logger_write(log, LOGLEVEL_ERROR, "MySQL: (login) Unable to "
            "bind params: %u: %s", mysql_errno(stmt->mysql),
            mysql_error(stmt->mysql));
        mysql_stmt_close(stmt);
        pthread_mutex_unlock(&e->mutex);
     
        return false;
      }
     
      /* statement ausführen */
      if(mysql_stmt_execute(stmt) != 0) {
        logger_write(log, LOGLEVEL_ERROR, "MySQL: (login) Unable to "
            "execute statement: %u: %s", mysql_errno(stmt->mysql),
            mysql_error(stmt->mysql));
        mysql_stmt_close(stmt);
        pthread_mutex_unlock(&e->mutex);
     
        return false;
      }
     
      /* ergebnis binden */
      if(mysql_stmt_bind_result(stmt, result) != 0) {
        logger_write(log, LOGLEVEL_ERROR, "MySQL: (login) Unable to "
            "bind result: %u: %s", mysql_errno(stmt->mysql),
            mysql_error(stmt->mysql));
        mysql_stmt_close(stmt);
        pthread_mutex_unlock(&e->mutex);
     
        return false;
      }
     
      /* ergebnis holen */
      if(mysql_stmt_fetch(stmt) != 0) {
        logger_write(log, LOGLEVEL_ERROR, "MySQL: (login) Unable to "
            "fetch result: %u: %s", mysql_errno(stmt->mysql),
            mysql_error(stmt->mysql));
        mysql_stmt_close(stmt);
        pthread_mutex_unlock(&e->mutex);
     
        return false;
      }
     
     
      /* result aufräumen */
      mysql_stmt_free_result(stmt);
      mysql_stmt_close(stmt);
     
      /* mutex entsperren */
      pthread_mutex_unlock(&e->mutex);
     
      return (erg > 0);

    Er verlässt mir die Funktion mit der Fehlermeldung dass er das Result nicht holen kann. Ich verstehe es nicht, weil mysql_errno eine 0 zurückgibt.

    Jemand einen Ansatz, wie ich das weiter debuggen / lösen kann? Oder ein Beispiel für Prepared Statements in C mit Strings als Parametern?

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Kontrollier doch mal direkt den Rückgabewert von mysql_stmt_fetch. Ist er 1 (vermutlich nicht), oder MYSQL_NO_DATA oder MYSQL_DATA_TRUNCATED ?

    Das Bsp. hier sieht eigentlich ziemlich gut aus: http://dev.mysql.com/doc/refman/5.0/...tmt-fetch.html

    Gruß
    Bratkartoffel bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi deepthroat,

    Danke für den Link, werd mich da mal durchlesen. Konnte aber soeben das Problem finden, auch wenns für mich keinen Sinn macht:

    Im obigen Beispiel:
    Code c:
    1
    2
    
    params[0].buffer         = u;
    params[1].buffer         = p;

    Ich darf die Strings u und p nicht per Referenz übergeben, ich muss die direkt übergeben. Bekomme damit zwar von meinem GCC Warnungen, aber so gehts zumindest.

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 15.10.11, 14:44
  2. Antworten: 3
    Letzter Beitrag: 04.01.11, 21:54
  3. MYSQLi Prepared Statements Schreiben nur ý
    Von NoUse4aNick im Forum PHP
    Antworten: 8
    Letzter Beitrag: 11.08.10, 13:26
  4. Hilfe bei Prepared Statements und Klassen
    Von jaegerschnitzel im Forum PHP
    Antworten: 6
    Letzter Beitrag: 11.02.08, 14:45
  5. PDO - prepared statements & SQL Injections
    Von DJLopez im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 09.04.07, 12:30