我不知道如何在红宝石上做同样的事情:
在 php 中,我可以使用以下结构:
while ((list($r_key, $r_value) = each($rule_arr))
&& (list($v_key, $v_value) = each($value_arr))
&& (list($s_key, $s_value) = each($stack_arr)))
{
$insert_rules_for_types = sprintf("INSERT INTO
`rules_for_types`(`types_id`, `rules_id`, `value`, `stackcount`)
value('%d','%d','%d','%d')", intval($type_id), intval($r_value),
intval($v_value), intval($s_value));
commit_changes($insert_rules_for_types);
}
如何在红宝石上做同样的事情?
对
它的相当字面的重写将是这样的:
rule_arr.each do |r_key, r_value|
value_arr.each do |v_key, v_value|
stack_arr.each do |s_key, s_value|
insert_rules_for_types = "INSERT INTO `rules_for_types`(`types_id`,`rules_id`,`value`,`stackcount`) value('%d','%d','%d','%d')" % [
type_id.to_i,
r_value.to_i,
v_value.to_i,
s_value.to_i
]
commit_changes(insert_rules_for_types)
end
end
end
无论你在PHP中做什么,你都可以通过使用ORM来避免构建SQL的很多混乱,比如范围非常广泛的ActiveRecord,或者Sequel,它更轻巧,更面向插件。
如果使用得当,这两种方法都将确保您正确转义 SQL。转换为整数是弱转义的标志,因为它不是通用解决方案。
Sequel 有一个 Ruby 接口可以调用许多 SQL 调用,因此INSERT
映射为一些简单的代码:
db[:rules_for_types].insert(
:types_id => types_id,
:rules_id => rules_id,
:value => v_value,
:stackcount => s_value
)
这样做使得很难将未转义的值注入到查询中。
我认为你可以使用Ruby的%。有关详细信息,请查看此内容。