MySQL queries aus PHP nach MySQL++ "übersetzen

MarkP

Lieutenant
Registriert
Jan. 2016
Beiträge
639
Ich kenne mich halbwegs mit MySQL unter PHP aus und komme (meistens) auch damit klar Anwendungen für Windows in C++ zu coden.
Jetzt hätte ich gerne einen MySQL-Zugriff aus einer C++-Anwendung heraus und damit breche ich mir einen ab.

Ich habe diesen MySQL C++ Connector installiert
https://dev.mysql.com/downloads/connector/cpp/
und mir ein paar Beispiele zu Queries angeschaut.

Das klappt im Prinzip schon, nur kämpfe ich halt mit der Syntax, sobald mein Query nur ein kleines bisschen anders ist als im Beispiel.

Unter PHP mache ich z.B.:

PHP:
$query = mysql_query("SELECT * FROM `table`");
while($row = mysql_fetch_object($query))
{
$data[$row->name] = $row->content;
}
mysql_free_result($query);

Unter MySQL++ ist das extrem viel umständlicher

C++:
MYSQL_RES *result;
MYSQL_ROW row;
MYSQL_FIELD *fields;
UINT numFields;
string query = "SELECT * FROM `table`";
mysql_real_query(&MySqlConnection,query.c_str(),query.size());
result = mysql_use_result(&MyPGlobal_MySqlConnection);
while((row = mysql_fetch_row(result)))
     {
       numFields = mysql_num_fields(result);
       fields = mysql_fetch_fields(result);
       for(UINT FieldCount = 0; FieldCount < numFields; FieldCount++)
          {
           // usw., usw.
          }
     }

Trotzdem habe ich es irgendwie dann doch geschafft die Queries die ich überlicherweise brauche auf die Reihe zu bekommen, auch wenn mich die Type-Conversions von string und wstring zu int und UINT irgendwann in den Wahnsinn treiben werden.

Mein aktuelles Problem klingt nun mehr als lächerlich, denn wo ich die Abfrage in Schleifen mit 100ten Datensätzen auf die Reihe bekommen habe, schaffe ich es nicht die MySQL++ Syntax für einen einzelnen Wert auf die Reihe zu bekommen.

In PHP so einfach, weil PHP die ganzen Conversions automatisch macht:

PHP:
$result = mysql_query("
    SHOW TABLE STATUS LIKE 'table'
");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];

In MySQL++ stehe ich völlig auf dem Schlauch, mit welcher Syntax ich den auto-increment Wert in eine UINT-Variable bekommen könnte.
 
Kenne mit weder mit PHP, noch mit C++ aus, aber waere es nicht viel einfacher und besser ein ORM zu nutzen, das dir den kram direkt in Objekte uebersetzt?
 
herliTz_234 schrieb:
Hier hat jemand ein ähnliches Problem und anscheinend hat jemand eine Lösung gefunden.
StackOverflow

Das ist halt kein "echtes" C++, sondern irgendein Visual-Gedöns, sprich Unmengen an Libraries wo es länger dauert zu lernen wie die Library funktioniert als den ganzen Quatsch selber ohne diesen Unfug zu schreiben.

driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
con->setSchema("test_schema");

Da wird mir schon übel wenn ich sowas sehe.
Ich möchte gar nicht wissen, welche Befehle eine Wrapper/Library (oder wie auch immer die "Experten" bei M$ den Unfug nennen) annimmt, ich möchte lieber wissen, welche Befehle der Connector direkt annimmt, denn um den Connector drumrum noch einen zweiten "Wrapper" bauen, nur um eine Syntax verwenden zu können die nur anders, aber nicht einfacher ist, ist mMn sinnfrei.
Ergänzung ()

NJay schrieb:
Kenne mit weder mit PHP, noch mit C++ aus, aber waere es nicht viel einfacher und besser ein ORM zu nutzen, das dir den kram direkt in Objekte uebersetzt?

Einfacher vielleicht, aber besser sicher nicht.
Das ist wie immer nur Auto mit Automatik fahren, weil man nicht weiss wie eine Kupplung funktioniert.
Ich habe Coden in den 80ern am C64 gelernt, also von GANZ unten rauf und ich habe mir bis heute die Angewohnheit beibehalten, dass ich gerne wissen will was das Programm macht und nicht irgendein Tool verwenden was die Mechanik vor mir versteckt, nach dem Motto "das ist eh zu hoch für dich".

Was M$ unter dem Namen "Visual C++" verkauft ist faktisch das genaue Gegenteil von dem was der Name vermuten lässt, denn über 90% des Visual C++ Compilers beschäftigt sich damit das was tatsächlich passiert vor mir zu verstecken.
 
Zuletzt bearbeitet:
Woran siehst du den das kein "echtes" C++ ist?

C++:
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
con->setSchema("test_schema");

Du könntest auch das Snippet nach programmieren und dann in "get_driver_instance();" rein debuggen. Dann kannst dir anschauen wie es funktioniert.

Das Snippet ist übrigens vom Offiziellen Beispiel was du hier findest. LINK

Ich geb dir recht das man schon immer versuchen sollte die Vorgänge zu verstehen aber um produktiv zu sein muss man oftmals auf vorhandene Dinge vertrauen.

Microsoft versteckt viele Sachen damit die Leute schnell Code generieren können und da sie zusätzlich den Code verwenden ist dieser meistens sehr gut getestet und optimiert. Ich weiß das du mir jetzt wieder sprechen wirst.
 
[QUOTE="MarkP, post: 24309173, member: 714921]

Ich habe Coden in den 80ern am C64 gelernt, also von GANZ unten rauf und ich habe mir bis heute die Angewohnheit beibehalten, dass ich gerne wissen will was das Programm macht und nicht irgendein Tool verwenden was die Mechanik vor mir versteckt, nach dem Motto "das ist eh zu hoch für dich"..
[/QUOTE]

Wenn man es kann, dann kann manuell natürlich besser sein. Aber man muss das Rad ja nicht jedes Mal neu erfinden. ORMs sorgen idr dafür, dass dir Basic Fehler wie SQL injection nicht passieren können. Du würdest dich auch nicht Verschlüsselung in jeder Anwendung selbst neu programmieren, statt eine gescheite und etablierte Library zu benutzen?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: herliTz_234
Na, da muss ich wohl noch dazu sagen, dass ich schon lange Rentner bin und keinerlei Bedarf habe produktiv zu sein.
Ich code so wie andere Rentner Kreuzworträtsel lösen, aus Spass daran, wobei der Haupt-Spass für mich halt ist so wenig wie irgend möglich an Hilfs-Tools zu verwenden.
Wenn ich das Wort "Visual" schon sehe, mache ich einen weiten Bogen drumrum, weil ich weiss, dass das Ganze eigentlich "Blind" heissen müsste.
Ich code mit Code::Blocks/MinGW/GCC++ und verwende ausser den unumgänglichen Libraries wie windows.h, wsock32 usw., im Prinzip nur noch die string und vector libraries und ich tippe den gesamten Code in den simplen Text-Editor den Code::Blocks inklusive hat.
Wenns ginge würde ich mir diesen MySQL-Connector auch noch sparen, aber das artet dann doch in zu viel Tipperei aus, ergo muss ich notgedrungen lernen welche Syntax dieser Connector akzeptiert und genau dafür suche ich nun eine Art "Übersetzer", wie im Titel von diesem Thema erwähnt.

Einen Dank noch für den Link zu StackOverflow, die Seite hatte ich fast vergessen, da werde ich meine Frage gleich auch mal posten, vielleicht können die helfen.

Edit: Naja, helfen konnte StackOverflow mir auch nicht, aber dort schreiben hat meine eigenen grauen Zellen so weit gefördert, dass ich selber auf die Lösung gekommen bin.
Es gibt in C++ keine "Abkürzung" wie in PHP, man muss auch für einzelne Werte immer den langen Weg gehen, als ob man eine ganze Tabelle lesen will und dann das Ergebnis aus den gelesenen Daten fischen, auch wenn die gelesenen Daten nur aus diesem einzelnen Wert bestehen.
 
Zuletzt bearbeitet:
Zurück
Oben