MySQL Connector - query Abfrage mit Variablen

ElFunghi

Erfahrenes Mitglied
Hallo,

da ich leider meine Brötchen nicht mit Programmierung verdiene, hänge ich bei sehr einfachen Aufgaben schon voll im Mist..

Ich möchte eine einfache MySQL Abfrage in C starten. Soweit funktioniert das auch alles.
Wenn ich in die mysql_query direkt die Abfrage schreibe, bekomme ich auch meine Daten die ich benötige.
Nur da der Typ dort const char ist, kann ich ja nicht einfach (wie bei PHP) "id=(variable)" reinschreiben.
Also muss ich vorher die const char passend zusammen bauen, und genau da hänge ich fest.
Wie stelle ich das an? Ich bekomme nur ständig Fehlermeldungen vom Debugger das die Datentypen nicht zueinander passen etc.

Ich möchte also nichts anderes tun als für die mysql_query die Abfrage zusammensetzen.

"SELECT wert FROM tabelle WHERE id=1" - wobei statt der direkten 1 natürlich dann der Wert einer Variable drin steht.

Aber ich habe mich in meinem C Buch und der Google Suche so dermaßen verfrantzt, das ich gar nicht mehr klar komme.

C++:
#include <stdio.h>
#include <mysql.h>
#include <Windows.h>

MYSQL *conn;
MYSQL_FIELD *field;


int main(int argc, char *argv[])
{

    MYSQL *mysql = NULL;

    mysql = mysql_init(mysql);

    if (!mysql) {
        puts("Init faild, out of memory?");
        return EXIT_FAILURE;
    }

    if (!mysql_real_connect(mysql,      
        "localhost",  
        "root",  
        "password",  
        "db",    
        0,          
        NULL,       
        CLIENT_FOUND_ROWS )) {
        puts("Connect failed\n");
    }
    else {
        if (mysql_query(mysql, "SELECT wert FROM tabelle WHERE id=1")) {
            printf("Query failed: %s\n", mysql_error(mysql));
        }
        else {
            MYSQL_RES *result = mysql_store_result(mysql);

            if (!result) {
                printf("Couldn't get results set: %s\n", mysql_error(mysql));
            }
            else {
                MYSQL_ROW row;
                int i;
                int num_fields = mysql_num_fields(result);

                while ((row = mysql_fetch_row(result))) {
                    for (i = 0; i < num_fields; i++) {
                        printf("%s", row[i]);
                    }
                    putchar('\n');
                }

                mysql_free_result(result);
            }
        }
    }

    mysql_close(mysql);

    return EXIT_SUCCESS;


}

Vielleicht könnte mir da Jemand helfen?

Viele Grüße
ElFunghi
 

sheel

I love Asm
Hi

kann ich ja nicht einfach (wie bei PHP) "id=(variable)" reinschreiben.
Bei PHP auch nicht, Injection.

Statt einem einfachen mysql_query brauchst du ca. sowas:
C:
long dieId = 1;

MYSQL_STMT *stmt = mysql_stmt_init(mysql);
const char *abfrage = "SELECT wert FROM tabelle WHERE id=?";
if(mysql_stmt_prepare(stmt, abfrage, strlen(abfrage))) {/*fehler*/}

MYSQL_BIND bind;
bind.buffer_type = MYSQL_TYPE_LONG;
bind.buffer = (void *)&dieId ;
bind.is_null = 0;
bind.length = 0;
if(mysql_stmt_bind_param(stmt, &bind)) {/*fehler*/}

if (mysql_stmt_execute(stmt)) {/*fehler*/}
 

ElFunghi

Erfahrenes Mitglied
Hallo sheel,

vielen Dank für deine Antwort.
Ich hab's jetzt doch mehr oder weniger ähnlich gelöst wie ich es aus der PHP Programmierung gewohnt bin.

C++:
    char buffer[256];
    int dieID = 2;
    sprintf_s(buffer,256, "SELECT wert FROM tabelle WHERE id=%d", dieID);

    const char * abfrage = (const char *)buffer;

Und dann bei der Abfrage einfach:

C++:
mysql_query(mysql, abfrage)

Funktioniert wunderbar :)

Viele Grüße
 

cwriter

Erfahrenes Mitglied
Ich hab's jetzt doch mehr oder weniger ähnlich gelöst wie ich es aus der PHP Programmierung gewohnt bin.
Bei PHP auch nicht, Injection.
Du hängst nicht so sehr an der Sicherheit deiner Daten oder viel schlimmer: An der Sicherheit der Daten deiner Nutzer, oder?

Ja, sprintf ist nicht allzu gefährlich, wenn du die korrekten Spezifizierer verwendest - aber "wie du es aus PHP gewohnt bist" heisst nur: Wie du es dir schnellstens umgewöhnen solltest.

Es ist schon seit mehreren Jahren NICHT IN ORDNUNG, mysql_query (oder mysqli_query) zu verwenden. Wirklich nicht. Es ist gefährlich.
Siehe auch: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1

Bei PHP gibt es, falls du wirklich mit mysql(i)_query arbeiten willst, zumindest mysqli_real_escape_string. Aber das ist eigentlich Mehrarbeit, die dir die prepared statements abnehmen.

Funktioniert wunderbar :)
In diesem speziellen Fall, in dieser Programmiersprache, mit dem Typesafe int: Möglicherweise.
Mit Strings: Finger weg.

Schau dir sheels Code an, binde ihn in eine Wrapperfunktion (also den Code, nicht sheel :) ), um es ein bisschen sauberer zu halten, und hör auf, dich und deine Nutzer zu gefährden.

Sorry, dass ich so deutlich werde, aber sowas geht gar nicht.

Gruss
cwriter