使用 GDScript 在 SQLite 中传递字符串变量

Passing a string variable in SQLite with GDScript

我对 GDScript 中的 SQLite 有疑问。

我想打印一个查询结果进行调试,但找不到方法。

在我的代码中我有:

var tableName = "users"
db.query("SELECT username, email FROM " + tableName + " WHERE username=?;" + (username))

我不能将用户名作为“用户名”传递,正确的方法是什么?

我也试试这个:

var tableName = "users"
db.query("SELECT username, email FROM " + tableName + " WHERE username= " + username + ";")

还有这个:

var tableName = "users"
db.query("SELECT username, email FROM " + tableName + " WHERE username = " + 'username' + ";")

顺便说一下,我从这里获取用户名:

var username = $NinePatchRect/VBoxContainer/username.get_text()

我已经打印出来了,变量用户名没问题。

谢谢大家!

做什么

正确的方法是使用准备好的语句和参数绑定。您需要找到一种方法来使用您正在使用的任何解决方案。


如果您使用此解决方案:2shady4u/godot-sqlite (Which is available from the Godot Asset Library, here)。执行以下操作:

var query = "SELECT username, email FROM " + tableName + " WHERE username=?;"
db.query_with_bindings(query, [username])

应该在幕后使用准备好的语句和参数绑定。 Source.


如果您正在使用此解决方案:godot-extended-libraries/godot-sqlite(Godot Core 开发人员为此做出了贡献)。执行以下操作:

var query = "SELECT username, email FROM " + tableName + " WHERE username=?;"
db.query_with_args(query, [username])

应该在幕后使用准备好的语句和参数绑定。 Source.


如果您正在使用此解决方案:khairul169/gdsqlite-native(这是一个较旧的项目)。执行以下操作:

var query = "SELECT username, email FROM " + tableName + " WHERE username=?;"
db.query_with_args(query, PoolStringArray([username]))

应该在幕后使用准备好的语句和参数绑定。 Source.


如果您使用的是其他解决方案,请弄清楚如何使用准备好的语句。如果没有办法,请切换到支持它们的解决方案,例如上面链接的那些。


不该做什么,为什么

SQLite 需要引号之间的字符串。

在 Godot 中放置引号的常用方法是将字符串写在 ' 之间而不是 ".

例如:

print('Hello "World"')

应该打印 Hello "World".

或者,您可以使用 escape sequences:

print("Hello \"World\"")

这也应该打印 Hello "World".


因此,您可以——请不要——这样查询:

db.query("SELECT username, email FROM " + tableName + " WHERE username= \"" + username + "\";")

然后如果用户输入:

peter

查询将像这样构建(假设 tableNameusers):

SELECT username, email FROM users WHERE username= "peter";

而且你会有一个 SQL 注入漏洞。如果用户写了引号,则字符串的其余部分将被视为查询的一部分。

例如,如果用户写

" or "" = "

查询将像这样构建:

SELECT username, email FROM users WHERE username= "" or "" = "";

这将 return 所有用户。这只是他们可以写的内容的一个例子,因为记住他们会写 SQL.

准备好的语句避免了该漏洞。而不是通过字符串技巧,而是通过适当的支持。而且没有麻烦。请使用准备好的语句。