鉴于name = "Ben"
,这不起作用:
DB.execute("SELECT id FROM departments WHERE name = #{name}")
但这样做(添加单引号):
DB.execute("SELECT id FROM departments WHERE name = '#{name}'")
为什么呢?为什么Ruby在第一个例子中没有调用变量?它已经是一个字符串了。我不明白为什么会有任何不同。这不等于传递"'Ben'"
吗?这不等于传递"Ben"
吗?
答案 0 :(得分:3)
这不是Ruby问题,而是SQL语法问题。
WHERE name = tom
和
WHERE name = 'tom'
是两件不同的事情。
在第一种情况下,它被视为一个模式对象名称(这里可能是一个列名),在第二种情况下它是一个字符串文字。
当您使用一种编程语言通过直接字符串操作为另一种编程语言(此处为Ruby - > SQL)创建程序时,您会遇到同样的问题。
正确的方法是使用绑定变量。
WHERE name = ?
这也涉及name
包含特殊字符的问题。
name = "Little Bobby Tables, see http://xkcd.com/327/"