0

ルビーで同じことをする方法がわかりません:

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);
}

ルビーで同じことをするにはどうすればよいですか?

4

2 に答える 2

2

それをかなり文字通り書き直すと、次のようになります。

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で何をしていても、スコープが非常に広いActiveRecordや、はるかに軽量でプラグイン指向のSequelなどのORMを使用することで、SQLの構築に関する多くの混乱を回避できる可能性があります。

これらの両方を正しく使用すると、SQLを適切にエスケープできます。整数へのキャストは、汎用ソリューションではないため、エスケープが弱いことを示しています。

Sequelには多くのSQL呼び出しへのRubyインターフェースがあるため、INSERT単純なコードとしてマップされます。

db[:rules_for_types].insert(
  :types_id => types_id,
  :rules_id => rules_id,
  :value => v_value,
  :stackcount => s_value
)

このようにすると、エスケープされていない値をクエリに挿入するのが非常に困難になります。

于 2012-08-15T14:25:52.840 に答える
0

Rubyの%が使えると思います。詳しくはこちらをご確認ください。

于 2012-08-15T14:12:56.717 に答える