Isntead of
QString queryString = "INSERT INTO highscores (name, score) VALUES '%1',%2";
あなたは書くべきです
QString queryString = "INSERT INTO highscores (name, score) VALUES ('%1',%2)";
SQLのコマンドは、コンマで区切られたデータセットのリストをINSERT
想定しています。各データセットは、列の値とともに括弧で囲まれています。VALUES
次のコマンドは、1つのタプルをテーブルに挿入しますtable
。
INSERT INTO table (col1, col2) VALUES (val1, val2);
| col1 | col2 |
+------+------+
| val1 | val2 |
2つの値を括弧で囲まなかったため、SQLiteにそれぞれ1つの値を持つ2つのデータセットを挿入するように依頼しました。
INSERT INTO table (col1, col2) VALUES val1, val2;
| col1 | col2 |
+------+------+
| val1 | |
| val2 | |
(面白いことに、SQLiteとMySQLの両方のインストールでこれをテストしました。括弧をまったく省略した場合、どちらもエラーをスローしました。ただし、これはバージョンと使用しているオプションによって異なる場合があります。)
SQLクエリの引数の入力には絶対に使用しないでください。QString::arg
(または、連結などの他の文字列構築方法。)これにより、 SQLインジェクションが発生する可能性があります。
可変引数を使用してステートメントを作成するには、 QSqlQueryバインド値によって提供されるSQLプリペアドステートメントを使用する必要があります。
QString queryString = "INSERT INTO highscores (name, score) VALUES (?,?)";
QSqlQuery query(queryString);
query.addBindValue(name);
query.addBindValue(score);
query.exec();
プリペアドステートメントで文字列引数を引用しなかったことに注意してください。