Invalid conversion from 'char' to 'const char*'



  • Hallo Zusammen,

    hab ne kleine Funktion die nen char-array übergeben bekommt, das in na DB sucht und was zurückgibt.

    Wenn ich den QUERY_POP vollständig deklariere, läuft alles durch.

    Jetzt soll das ganze aber variabel sein. Ich deklariere also nur den "festen" Teil der SELECT Anweisung und will dann 'id' und ein abschließendes "'" dranhängen.

    Dann macht der Compiler dumm...

    Hab jetzt 2 Stunden rumprobiert, kein Erfolg. Hat jemand ne Idee?

    Was eigentlich an so ne Funktion übergeben? Ein Zeiger auf id?

    DANKE 🙂

    String hol_links(char id){
     
    //Funktion sucht nach dem übergebenen Eintrag im entsprechenden Feld in der Datenbank
    //und gibt das Ergebnis als char-Array zurück
    
    char QUERY_POP[] = "SELECT link FROM hoerspiele.eintraege WHERE uic = '";
    char query[128];
    
    strcat(QUERY_POP, id);
    strcat(QUERY_POP, "'");
    

    FEHLERMELDUNG in Zeile 9:
    invalid conversion from 'char' to 'const char*' [fpermissive]



  • Du versucht ein einzelnes Zeichen per strcat an einen C-string anzuhängen, das funktioniert so nicht.
    Und deine ID ist wirklich ein char? Da ist doch bei max. 127 Hörspielen in der db Feierabend.
    Wenn deine db-API keine Prepared Statements unterstützt und du den SQL-String selbst zusammenbauen muss würde ich das über sprintf machen.

    ??? create_sql_statement( unsigned int id )
    {
       char local_buffer[256]; // Array groß genug wählen, dass der SQL String garantiert reinpasst
       sprintf( local_buffer, "SELECT link FROM hoerspiele.eintraege WHERE uic=%d", id );
    
       return ???;
    }
    

    PS:
    Was ist String für ein Typ? Machst du C oder C++?

    Edit:
    Außerdem versuchst du an das array QUERY_POP anzuhängen, in dem garantiert kein Platz mehr ist. Das folgende char array ist ein böser Hack, nur deswegen fliegt dir nicht alles um die Ohren. Wenn es übersetzen würde.



  • Was ist id? Ein numerischer Wert? Ein Zeichen? Eine Zeichenkette?



  • Uih, da seid ihr jetzt schnell gewesen 🙂 Danke dafür!

    Also:

    der Funktion wird beim Aufruf ein char-Array übergeben (sowas wie char[] = "a278196"). Ist die UIC von einer RFID.

    Habe ich jetzt aber geändert, weil das meine Code vorher unschön verhunzt hat.

    Übergebe jetzt sicher einen String! Den hänge ich dann schon mal vorher an meine Variable select_string an (soll ja die SELECT Abfrage werden).

    Die Funktion, die dann später diesen query_pop übergeben bekommt, will aber keinen String sondern ein chart-array. Deswegen also char in Zeile 7 definieren.

    Kann dann aber nicht meinen String übergeben!? Wie geht dem? 🙂

    String hol_links(String id){
     
    //Funktion sucht nach dem übergebenen Eintrag im entsprechenden Feld in der Datenbank
    //und gibt das Ergebnis als char-Array zurück
    
    String select_string = "SELECT link FROM hoerspiele.eintraege WHERE uic = '" + id + "'";
    char query_pop[] =  select_string;  //"SELECT link FROM hoerspiele.eintraege WHERE uic = '725fa51'";
    

    FEHLERMELDUNG in Zeile 7:
    initializier fails to determine size of 'query_pop'

    PS. Ist ein Arduino Projekt und meiner Meinung nach in C. THX


  • Mod

    Was soll denn überhaupt String sein? Es gibt keinen solchen Typen in C, und selbst eventuelle selbst programmierte String-structs können garantiert niemals eine Syntax wie "SELECT link FROM hoerspiele.eintraege WHERE uic = '" + id + "'"; unterstützen. Kann es ein, das du hier Codebeispiele aus anderen Programmiersprachen abschreibst? In C funktionieren Zeichenketten ganz, ganz anders und wenn du nicht wenigstens die Grundlagen davon verstehst, wirst du weder Hilfestellung verstehen, noch irgendetwas selber machen können. Zeichenketten in C sind dazu viel zu fehleranfällig, als dass man damit ahnungslos experimentieren könnte.

    PS: Ist String vielleicht ein typedef auf int? Das könnte erklären, wie der Code auch nur ansatzweise funktioniert. Oder es ist kein C, dann könnte es auch sein.
    PPS: Und warum Zeile 7 nicht geht, hangt damit zusammen, dass Arrays und Zeichenketten in C ganz anders funktionieren, als du denkst. Aber wie die wirklich funktionieren, kann man nicht in zwei Sätzen beschreiben.



  • @alexg sagte in Invalid conversion from 'char' to 'const char*':

    PS. Ist ein Arduino Projekt und meiner Meinung nach in C. THX

    ROFLMAO! Du weisst nicht, in welcher Programmiersprache du programmierst?



  • @alexg sagte in Invalid conversion from 'char' to 'const char*':

    PS. Ist ein Arduino Projekt und meiner Meinung nach in C. THX

    Vergiss den µC, such' Dir eine Sprache aus und lerne diese Sprache. Dann kannst Du weiter mit Deinem Arduino spielen.



  • @alexg sagte in Invalid conversion from 'char' to 'const char*':

    Ich deklariere also nur den "festen" Teil der SELECT Anweisung und will dann 'id' und ein abschließendes "'" dranhängen.

    @DocShoe hat zwar schon darauf hingewiesen; ich möchte dir hiervon noch eindringlich abraten. Wenn die id ein int ist oder ein selbst kontrollierter String, mag das noch korrekt sein. Jedoch solltest du dir das so gar nicht erst angewöhnen, denn es führt irgendwann zu SQL-Injections.

    Es gibt generell zwei Ansätze:
    a) benutze die Datenbankspezifische quote-Funktion für Strings, die du in SQL-Statements reinschreibst. Bei MySQL wäre das zum Beispiel mysql_real_escape_string_quote. Aber das hängt auch von der Datenbank ab! Man kann hier viel falsch machen und ich würde das nur als Notlösung sehen.

    b) (besser) benutze Platzhalter. Oftmals ist es möglich, sowas wie "select * from tabelle where spalte = ?" zu schreiben und dann beim Ausführen dieses Befehls den Wert für das ? mitzugeben. Das gibt es (je nach DB/DB-Interface) in verschiedenen Varianten. Nutze dieses Konzept (suche nach "Platzhalter").



  • @alexg sagte in Invalid conversion from 'char' to 'const char*':

    PS. Ist ein Arduino Projekt und meiner Meinung nach in C.

    Arduino benutzt ein abgespecktes C++ mit einer eigenen String-Klasse.
    Zudem wird noch eine kleine Laufzeitumgebung dazu gebunden, die ein init() und dann zyklisch eine loop() aufruft.

    Trotzdem bleibt das Problem, dass C-Arrays (die man auch in C++ nutzen kann - aber vermeiden sollte) anders funktionieren als normale Typen.

    Edit:
    Du kannst deiner Abfragefunktion doch den C-String von select_string übergeben.
    Das geht mit select_string.c_str()



  • Vielen Dank für die vielen Antworten und die (vermutlich) gut gemeinten Ratschläge in Sachen Sprache lernen... Werde ich gelegentlich beherzigen, wenn ich mal dazu komme.

    Ja ich kopiere mir gelegentlich Code zusammen, den ich nicht immer 100%ig verstehe (nach dem Motto, den Rest sagt mir der Debugger dann schon und wenns gar nicht weiter geht frage ich die netten Experten in Foren).

    Heute saßen mir die Kids im Nacken, dass ihre wLan Musikboxen endlich wieder laufen (und dank @DirkB jetzt mit unendlich vielen Hörspielen aus der MariaDB) 🙂

    Also so gehts jetzt:

    String hol_links(String id){
     
    String select_string = "SELECT link FROM hoerspiele.eintraege WHERE uic = '" + id + "'";
    char query[128];
    
    String antw = "";
    
      // Initiate the query class instance
      MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
      sprintf(query, select_string.c_str(), 9000000);   // Reminder für mich: Unbedingt die Referenz zu c_str() lesen :-) 
    

    THX!!!


  • Mod

    Das was wob gesagt hat, solltest du extrem ernst nehmen. SQL Statements aus Strings zusammen zu setzen ist sehr gefährlich. Im besten Fall plättet dir damit jemand die Datenbank. Und wenn dieser Bestfall schon böse klingt, dann denk dir mal aus, was der schlechteste Fall sein kann.



  • @alexg sagte in Invalid conversion from 'char' to 'const char*':

    // Reminder für mich: Unbedingt die Referenz zu c_str() lesen 🙂

    Geht schnell:
    https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/c_str/

    Das sprintf ist übrigens die falsche Funktion für sowas, bzw. benutzt du sie gefährlich falsch.
    Und was soll die 9000000 in dem Aufruf?



  • @SeppJ sagte in Invalid conversion from 'char' to 'const char*':

    Das was wob gesagt hat, solltest du extrem ernst nehmen. SQL Statements aus Strings zusammen zu setzen ist sehr gefährlich. Im besten Fall plättet dir damit jemand die Datenbank. Und wenn dieser Bestfall schon böse klingt, dann denk dir mal aus, was der schlechteste Fall sein kann.

    Und jetzt habe ich mal das MySQL_Cursor in die Suchmaschine meiner Wahl eingegeben und was kommt raus?
    https://github.com/ChuckBell/MySQL_Connector_Arduino/wiki/Examples
    https://github.com/ChuckBell/MySQL_Connector_Arduino/wiki/Common-Solutions

    Boah! Echt, da steht sowas drin wie "Replacing Values in SQL Commands for Variables: [...] In essence, we use a format string and the sprintf() function to convert format specifiers (also called placeholders) to values from constants or variables". Wird auch in alles Beispiel da so gemacht. Ohne irgendein Wort der Warnung.

    Auch die 9000000 ist von einem Beispiel dort.

    Ich sehe ja ein, dass man auf einem Arduino andere Probleme als auf einem normalen Rechner hat. Aber mit keinem Wort auf die SQL-Injection-Problematik einzugehen, ist schon fragwürdig.



  • Vielen Dank für den zusätzlichen Input.

    1. Ja ich werde mir Gedanken über das Problem der SQL-Injections... Wobei die DB lokal auf meinem Home-Server gehostet ist, der nicht mit der Außenwelt verbunden ist. Da müsste sich schon jemand in das Wlan schummeln oder sonst wie den Datenverkehr abfangen und verändern. Oder sich den Arduino schnappen und über den RFID-Leser entsprechende Dinge einschleusen... Bißchen aufwändig vielleicht um ne kleine DB mit Links auf Kinderhörspiele zu hacken 👁

    2. Merke: Verlass Dich auch nicht auf Beispiel-Code von Github 🙂

    THX nochmal und ein schönes Wochenende!


Log in to reply