我正尝试在 golang 中完成一个简单的许可系统,并尝试了多种方法来让它工作。基本上,我在我的数据库中输入了几个随机许可 key ,我的 golang 程序应该检查用户输入的 key 是否存在,如果存在,然后将用户指定的用户名和密码添加到数据库中,以便稍后登录。
这是我没有用过的代码:
"IF EXISTS (SELECT * FROM login WHERE LK = "+reglicenceEntry.Text()+") THEN
INSERT INTO `login` (`Username`, `Password`, `LK`) VALUES
('"+regusernameEntry.Text()+"', '"+regpasswordEntry.Text()+"', ''); "
这是 golang 错误:
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS (SELECT * FROM login WHERE LK = '5qp515YHXEmSDzwqgoJh') THEN INSERT IN' at line 1
非常感谢!
最佳答案
MySQL 语法不支持 IF...THEN 结构,除了在存储的例程和触发器和事件中。参见 https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-compound-statements.html
我为您的代码建议了一个替代解决方案:
INSERT INTO `login` (`Username`, `Password`, `LK`)
SELECT ?, ?, ''
FROM `login`
WHERE `LK` = ?
LIMIT 1
如果您的登录表没有 LK 值,上面的 SELECT 将返回 0 行,因此它不会插入任何内容。
如果你的登录表有 LK 值,上面的 SELECT 将返回至少 1 行(我限制为 1),因此它会插入一行。它插入的行由您的用户名和密码以及 LK 的空白字符串组成。
我展示了参数占位符的使用。您应该在 SQL 中使用参数,而不是将变量连接到查询中。这是避免意外 SQL 注入(inject)的良好做法。参见 http://go-database-sql.org/prepared.html例如。
使用参数的目的是避免SQL注入(inject)问题。请参阅我对 What is SQL injection? 的回答SQL注入(inject)的解释。
或者我的介绍SQL Injection Myths and Fallacies (或 youtube video )。
使用参数时,您需要执行两个步骤。
?) 的查询的第一步,否则您会在其中将变量连接到 SQL 查询中。 关键是要将变量与您的查询分开,因此如果变量中有任何可能无意中更改您的 SQL 语法的内容(如不平衡的引号),它永远不会与 SQL 结合。做完prepare之后,SQL已经被MySQL服务器解析过了,之后的语法就没法改了。
MySQL 会记住查询的哪些部分需要填写,并且当您在执行步骤中传递变量时,MySQL 会使用您的值填写查询的缺失部分——但这发生在 MySQL 服务器中,而不是在您的服务器中应用。
因此,查询的动态部分(您的变量)与 SQL 语法保持分离,从而避免了 SQL 注入(inject)问题。
对于您在问题中描述的任务,它看起来像这样(我没有测试过这段 Go 代码,但它应该会让您走上正确的道路)。
stmt, err := tx.Prepare("INSERT INTO `login` (`Username`, `Password`, `LK`) SELECT ?, ?, '' FROM `login` WHERE `LK` = ? LIMIT 1")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
_, err = stmt.Exec(regusernameEntry.Text(), regpasswordEntry.Text(), reglicenceEntry.Text())
if err != nil {
log.Fatal(err)
}
参数的顺序很重要。您传递给 Exec() 的变量的顺序必须与 ? 占位符在您准备好的 SQL 语句中出现的顺序相同。它们由 MySQL 服务器以相同的顺序一对一匹配。
不要在准备好的 SQL 语句中的占位符周围加上引号。这将作为 SQL 中的文字字符串 '?' 工作。使用不带引号的 ? 字符作为占位符。当它在服务器中被 MySQL 合并时,它的工作方式就像您在值周围加上引号一样,就像字符串一样——但没有 SQL 注入(inject)的风险,即使该字符串值包含特殊字符也是如此。
这是另一个提供更多代码示例的站点:https://github.com/go-sql-driver/mysql/wiki/Examples
Exec() 函数用于执行没有结果集的 SQL,如 INSERT、UPDATE、DELETE。 Go SQL 驱动程序中还有其他函数,如 Query() 和 QueryRow() 也接受参数参数。如果您的 SQL 返回结果集,您将使用这些。
关于如果表中存在许可 key ,则 MySQL 代码将用户名和密码插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50202694/
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: