Frage zu SQL-Befehl

Buba235

Erfahrenes Mitglied
Hallo Leute!


Ich hab da mal ne Frage zu einem SQL-Befehl. Ich weiß nicht ganz wie der aussehen soll, damit er auch das macht was ich will. Das ganze sieht in meinem Code so aus:

Code:
void sub_type(const char *path, MYSQL *conn) {

        /*Variablen*/
        int i;
        FILE *super;
        FILE *datei;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *pfadzuSuper;
        const char *sqlSub_Type;
        pfadzuSuper = "/home/tracer/wlan_DB/alert_files/super.txt";


        /*Erst wird die vorhandene Datei Super.txt geloescht*/
        if ((remove("/home/tracer/wlan_DB/alert_files/super.txt")) < 0) {
                fprintf(stderr, "Fehler beim Loeschen von %s ", "/home/tracer/wlan_DB/alert_files/super.txt");
                errorHandler();
        }

        /*SQL-Befehl*/
        DIESEN Befehl meine ich
        sqlSub_Type = "UPDATE test SET SUB_TYPE = '*word'";

        /*Datei zum Lesen oeffnen*/
        datei = fopen(path, "rt");
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum"
                       " Auslesen(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Jede Zeile durchgehen und immer den,
         * in Token zerlegten String, einlesen*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = mystrtok(buffer, gelesene_Kommas);
                for(i = 0; word != NULL; i++) {
                        if (i == 0) {
                                mysql_query(conn, sqlSub_Type);
                                break;
                        }
                        word = mystrtok(NULL, gelesene_Kommas);
                }
        }

        /*Datei schliessen*/
        fclose(datei);
}/*Ende der Funktion sub_type*/

Wenn ich diesen Code so ausführe, dann steht in meiner DB *word drin. Klar soweit, aber genau das will ich nicht. Es sollte der Inhalt der Variablen in die DB geschrieben werden. Wie muss denn dann der SQL-Befehl aussehen? Habt ihr ne Ahnung?

Gruß
Buba
 
Du musst den String entsprechend zusammenbauen, bei C z.b. mit sprintf:
C++:
char sqlSub_Type[200];
sprintf(sqlSub_Type, "UPDATE test SET SUB_TYPE = '%s'", word);
Gruß
MCoder
 
Hallo!


Danke für deine Antwort. Der Befehl funktioniert auch soweit, aber er schreibt mir immer nur das gleiche Wort in die DB. Ich hab meinen Code so geändert:

Code:
void sub_type(const char *path, MYSQL *conn) {

        /*Variablen*/
        int i;
        FILE *super;
        FILE *datei;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *pfadzuSuper;
        char sqlSub_Type[200];
        pfadzuSuper = "/home/tracer/wlan_DB/alert_files/super.txt";


        /*Erst wird die vorhandene Datei Super.txt geloescht*/
        if ((remove("/home/tracer/wlan_DB/alert_files/super.txt")) < 0) {
                fprintf(stderr, "Fehler beim Loeschen von %s ", "/home/tracer/wlan_DB/alert_files/super.txt");
                errorHandler();
        }

        /*Datei zum Lesen oeffnen*/
        datei = fopen(path, "rt");
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum"
                       " Auslesen(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Jede Zeile durchgehen und immer den,
         * in Token zerlegten String, einlesen*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = mystrtok(buffer, gelesene_Kommas);
                for(i = 0; word != NULL; i++) {
                        if (i == 0) {
                                sprintf(sqlSub_Type, "UPDATE test SET SUB_TYPE = '%s'", word));
                                mysql_query(conn, sqlSub_Type);
                                break;
                        }
                        word = mystrtok(NULL, gelesene_Kommas);
                }
        }

        /*Datei schliessen*/
        fclose(datei);
}/*Ende der Funktion sub_type*/
 
Der Sinn der for-Schleife innerhalb des Dateilese-Schleife erschließt sich mir nicht ganz, die sie bereits beim ersten Durchlauf ( in "if(i == 0)" ) abgebrochen wird. Möglicherweise liegt da das Problem.
 
Hallo!

Die Schleife zerlegt einen String in Tokens und liest solange bis sie auf ein Komma trifft. Wenn sie auf ein Komma getroffen ist, dann gehts in die nächste Zeile. Soweit zu der Schleife. Das if(i == 0) (also die Zahl) gibt an bei welchem Komma er aufhören soll. In diesem Fall soll er also nach dem ersten (also geleseneKommas = 0) aufhören und dann das Wort in die DB schreiben. Ich hab in einem anderen Teil in meinem Programm ne andere Zahl. Das Ding ist wenn ich das ganze ohne SQL-Befehl schreibe und dafür das Wort in eine Datei schreibe, dann gibt er es mir ja richtig aus. In der Datei stehen die richtigen Wörter. Nur wen ich das in die DB schreiben will, dann nimmt er immer nur das erste Wort! Ich hoffeich hab das einigermaßen klar erklärt!
Mit dieser Funktion wird da immer in Tokens zerlegt. Das ist der Grund warum es if(i == 0) heißt:
Code:
char* mystrtok(char *s, char delim) {

        /*Variablen*/
        char *curr = NULL;
        char *ret = NULL;
        static char *buffer = NULL;

        if (s) {
                buffer = s;
        }

        curr = buffer;

        if (curr) {
                /*Einzelne Characters durchgehen solange bis Komma
                  oder ein \0 Zeichen*/
                while(*curr != delim && *curr != '\0') {
                        curr++;
                }

                if (*curr == '\0') {
                        return NULL;
                }

                *curr = '\0';
                ret = buffer;
                buffer = curr + 1;
        }

        return ret;
}/*Ende der Funktion mystrtok*/
 
Zuletzt bearbeitet:
Hi.
Buba235 hat gesagt.:
Code:
  sprintf(sqlSub_Type, "UPDATE test SET SUB_TYPE = '%s'", word));
Was willst du denn damit eigentlich erreichen? Wenn du diese Anweisung wiederholt jeweils mit einem anderen Wort ausführst, werden alle Zeilen der Spalte "SUB_TYPE" auf den Wert von word gesetzt. D.h. eigentlich sollte am Ende in allen Zeilen der Spalte "SUB_TYPE" das letzte Wort drin stehen.

Du solltest den Rückgabewert der mysql_query Funktion prüfen ob die Anfrage erfolgreich war.

Gruß
 
Deine Leseschleife (hab's etwas anders formatiert) macht folgendes, siehe Kommentare im Quelltext:
C++:
while( fgets(buffer, LINE_SIZE, datei) != NULL )
{
   word = mystrtok(buffer, gelesene_Kommas); // Das erste Wort (bis zum ersten Komma) wird gefunden
   
   for( i = 0; word != NULL; i++ )  
   {
       if( i == 0 ) // Die Bedingung ist beim ersten Durchlauf der Schleife bereits erfüllt
       {
           // Das erste Wort wird in alle Records der Tabelle geschrieben --> siehe Kommentar deepthroat
           // evt. neuen Record erzeugen (INSERT) und auf jeden Fall mit der WHERE-Klausel arbeiten      
        
           sprintf(sqlSub_Type, "UPDATE test SET SUB_TYPE = '%s'", word));
           mysql_query(conn, sqlSub_Type);
            
           break; // Ende der for-Schleife
       }
        
       word = mystrtok(NULL, gelesene_Kommas); // Dieser Part wird NIE ausgeführt 
   }
}
Gruß
MCoder
 
Hallo!

Also ich habe die mysql_query() mal überprüft und sie ist nicht erfolgreich! Jetzt weiß ich allerdings nicht was ich weiter machen soll! Wie kann ich denn jetzt meinen SQL-Befehl so ausführen, dass bei jedem neuen Wort auch das jeweilige in die DB-Tabelle geschrieben wird?
 
Hey!

Danke für die Tipps, nur das Problem ist, ich checks nicht! Ich hab echt null Ahnung wie ich das machen soll! Entweder steh ich total auf dem Schlauch oder ich bin einfach zu beschränkt. Wenn ich mit INSERT arbeite geht es nicht, da ja schon Daten in der Tabelle vorhanden sind. Ich kann doch nur noch mit UPDATE nachträglich Daten einfügen und was will ich denn mit der WHERE Klausel? Die Wörter, die eingetragen werden sollen, müssen der Reihe nach eingetragen werden. Da benötige ich keine Bedingung! Wie gesagt, ich schein echt total auf dem Schlauch zu stehen!
 
Mit der WHERE-Klausel kannst du festlegen, welche Records aktualisiert werden sollen. Wenn du z.B. in Tabelle ein Feld "Nummer" angelegst und entsprechend füllst, könntest du mit
Code:
UPDATE ... WHERE Nummer=1
den ersten Record auswählen, mit "WHERE Nummer=2" den zweiten usw.

Gruß
MCoder
 
Zurück