Ruby 脚本如何规避单引号的导致的 SQL syntax 问题?

xiaoronglv · 2013年01月06日 · 最后由 xiaoronglv 回复于 2013年01月07日 · 3498 次阅读

处理英文文本时,插入到数据库时,英文句子中单引号让我很头疼。脚本如何写才能规避单引号导致的 sql 错误?

我现在非常粗暴的将单引号换为||| , 然后再插入到数据库中。

require "mysql2"

db = Mysql2::Client.new(:host => "localhost", :username => "***", :password => "****", :database => "dictionary")

sentence_en = File.readlines("surgery.esen")
sentence_cn = File.readlines("surgery.csen")
en_count = sentence_en.size
cn_count = sentence_cn.size
reg = %r(')

if en_count != cn_count
    p "not correct"
else
    en_count.times{|i|
    a = sentence_en[i].gsub(reg, "|||")
    b = sentence_cn[i].gsub(reg, "|||")
    p a,b
    db.query("INSERT INTO `pubmed_search_en_cn` (`en`, `cn`, `category`) VALUES ('#{a}', '#{b}', 'surgery')")
    }
end


1

ActiveRecord

ActiveRecord::Base.connection.quote(string/date/number/symbol)

把单引号双引号转义一下,前边加上 \
(这是错误的)

#3 楼 @zhangyuan

这样吗?

a = sentence_en[i].gsub(reg, "\'")

VALUES ( #{a.inspect}, #{b.inspect}, 'surgery')

def quote_string(s)
  s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end

insert into a values("zsss'ssa") 这样本来就是没问题的啊

#7 楼 @zhuf

如果句子中有双引号,你的这个语句就挂了。 😄

不该自己拼字符串吧,VALUES (?, ?, ?)才对吧

#4 楼 @xiaoronglv

# Quotes a string, escaping any ' (single quote) and \ (backslash)
# characters.
def quote_string(s)
  s.gsub(/\\/, '\&\&').gsub(/'/, "''") # ' (for ruby-mode)
end

这是 rails 源码里的 https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L80

#9 楼 @bhuztez 同意用占位符。

#8 楼 @xiaoronglv 哦,其实我刚开始还想着通过 sql_mode 来搞定的,后来去查了下貌似还没办法。

#10 楼 @zhangyuan

hello, 你有没有试过这个方法。

s.gsub(/\/, '&&') 好想有问题。反斜线\的转义方法应该为双反斜杠\\

需要 登录 后方可回复, 如果你还没有账号请 注册新账号