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

xiaoronglv · 发布于 2013年01月06日 · 最后由 xiaoronglv 回复于 2013年01月07日 · 2025 次阅读
1638

处理英文文本时,插入到数据库时, 英文句子中单引号让我很头疼. 脚本如何写才能规避单引号导致的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

共收到 13 条回复
1

ActiveRecord

165

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

96

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

1638

#3楼 @zhangyuan

这样吗?

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

186

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

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

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

1638

#7楼 @zhuf

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

96

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

96

#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

15

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

3479

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

1638

#10楼 @zhangyuan

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

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

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