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


  • 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