eine Reihe schwerwiegender Probleme mit diesem Code Es gibt keine. Beginnen wir mit dem Konzept der vorbereiteten SQL-Abfragen. Wikipedia listet two reasons für mit Prepared Statements:
- Der Aufwand für die Erstellung und Optimierung der Aussage nur einmal entstanden ist, obwohl die Anweisung mehrmals ausgeführt wird. [...]
- Vorbereitete Anweisungen sind gegen SQL-Injection resistent, weil Parameterwerte, die später mit einem anderen Protokoll übertragen werden, nicht korrekt maskiert werden müssen.
Keiner dieser Gründe gilt in Ihrem Code; Sie führen die Abfrage nur einmal aus, und Sie spleißen keine Eingaben in die Zeichenfolge. In der Tat ist der einzige Eingang in Ihrer Anfrage an alle Benutzernamen, die "joejoe"
hartcodiert ist:
"SELECT Height, Weight FROM SQL1 WHERE Username='joejoe'"
Da es keine Variable Eingänge, eine vorbereitete Abfrage mit nicht viel Sinn machen. Man zündet auch nicht die folgenden Zeilen:
query.bindValue(0,"Height");
query.bindValue(1, "Weight");
Größe und Gewicht sind Ausgänge aus dieser Abfrage, nicht Eingänge. Im Abschnitt Qt docs for QSqlQuery mit dem Titel "Ansätze zu Bindungswerten" finden Sie eine Erklärung, wie dies funktionieren soll. Die API von Qt zum Binden vorbereiteter SQL-Abfragen ist ziemlich typisch für Datenbankbibliotheken, hier gibt es nichts, was die Welt erschüttert.
Dann erhalten wir dazu:
userHeight = query.value(0).toInt();
userWeight = query.value(1).toInt();
Sowohl die Variablen, die Sie in hier gerade lesen wurden als verdoppelt erklärt, aber Sie anrufen toInt()
auf dem zurück QVariant
statt toDouble(). Ich weiß nicht, welche (wenn überhaupt!) Werte in Ihrer Datenbank sind, aber es ist möglich, dass sie während der Konvertierung von double nach int auf Null abgerundet werden, wenn die Werte zwischen -1,0 und 1,0 liegen.
Das heißt, Sie tun keine Fehlerprüfung überhaupt. Die Methoden prepare()
und exec()
geben Boolets zurück, die angeben, ob sie erfolgreich waren oder fehlgeschlagen sind. Gleichermaßen sagen Ihnen sowohl toInt()
als auch toDouble()
, ob sie erfolgreich waren oder fehlgeschlagen sind, wenn Sie einen Zeiger auf einen bool übergeben. Es ist erwähnenswert, dass beide Methoden bei einem Fehler auch einen Nullwert zurückgeben.
Ihre Lösung funktioniert perfekt und ist Benutzername spezifisch. – Gepard