1Danke
ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
338
338
EMPFEHLEN
-
05.12.11 13:54 #1
- 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"
-
06.12.11 11:10 #2
- 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ßIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
06.12.11 11:37 #3
- 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
-
Prepared Statements über MySQLi in eigener MySQL-Klasse
Von Milliongame im Forum PHPAntworten: 5Letzter Beitrag: 15.10.11, 14:44 -
Falsche Formatierung bei Prepared Statements
Von Cappaja im Forum PHPAntworten: 3Letzter Beitrag: 04.01.11, 21:54 -
MYSQLi Prepared Statements Schreiben nur ý
Von NoUse4aNick im Forum PHPAntworten: 8Letzter Beitrag: 11.08.10, 13:26 -
Hilfe bei Prepared Statements und Klassen
Von jaegerschnitzel im Forum PHPAntworten: 6Letzter Beitrag: 11.02.08, 14:45 -
PDO - prepared statements & SQL Injections
Von DJLopez im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 09.04.07, 12:30





Zitieren
Login






