使用 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
查询将像这样构建(假设 tableName
是 users
):
SELECT username, email FROM users WHERE username= "peter";
而且你会有一个 SQL 注入漏洞。如果用户写了引号,则字符串的其余部分将被视为查询的一部分。
例如,如果用户写
" or "" = "
查询将像这样构建:
SELECT username, email FROM users WHERE username= "" or "" = "";
这将 return 所有用户。这只是他们可以写的内容的一个例子,因为记住他们会写 SQL.
准备好的语句避免了该漏洞。而不是通过字符串技巧,而是通过适当的支持。而且没有麻烦。请使用准备好的语句。
我对 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
查询将像这样构建(假设 tableName
是 users
):
SELECT username, email FROM users WHERE username= "peter";
而且你会有一个 SQL 注入漏洞。如果用户写了引号,则字符串的其余部分将被视为查询的一部分。
例如,如果用户写
" or "" = "
查询将像这样构建:
SELECT username, email FROM users WHERE username= "" or "" = "";
这将 return 所有用户。这只是他们可以写的内容的一个例子,因为记住他们会写 SQL.
准备好的语句避免了该漏洞。而不是通过字符串技巧,而是通过适当的支持。而且没有麻烦。请使用准备好的语句。