From: rubikitch@... Date: 2008-06-30T17:59:12+09:00 Subject: [ruby-list:45166] Re: MySQLに書き込む前にSJISのエスケープ文字を入れる処理ってどうされてますか? From: adgjmptw@super-r.net Subject: [ruby-list:45162] Re: MySQLに書き込む前にSJISのエスケープ文字を入れる処理ってどうされてますか? Date: Mon, 30 Jun 2008 07:45:35 +0900 > んな無茶な... と思ってたら、Rubyって元のクラスを上書きできるんですね。 > なんか恐いけど便利そうなんでとりあえず使ってみました。 これがオープンクラス。 既存のクラスにメソッドを追加するとき、既存のメソッドやインスタンス変数と かぶらないよう気をつければ、オープンクラスは味方になってくれます。 逆に、かぶってしまうと見付けづらいバグになります。 > どうせならconnectとcloseも一気にやってくれたほうが便利なので、 > こんなクラスにしてみました。 まあ、ほんとはブロック使うべきですがそれは次の段階ということで。 >  def runsql(sql) >   require "kconv"    #んーここでrequireかぁ... > >   # UTFに変換 >   @sql=sql.toutf8 if @dbchar == "UTF-8" > >   #SQL発行 >   self.connect("#{@dbh}","#{@dbu}","#{@dbp}","#{@dbn}") >   @cursol=self.query @sql >   self.close > > # SJISに変換... できねぇ >   #@cur=@cursol.each{ |elm| elm.tosjis } #これができない >   @cur=@cursol #とりあえずUTF-8のまま返す >   return @cur >  end eachの代わりにmapを使えばいいという指摘は既出なのでおいといて、 この場合わざわざインスタンス変数にする意味がないと思います。 @sql、@cursor、@curはローカル変数で十分です。 > self.connect("#{@dbh}","#{@dbu}","#{@dbp}","#{@dbn}") ここも式展開を使うまでもなく、普通に変数で指定すればよい。 self.connect @dbh, @dbu, @dbp, @dbn 欲を言えばこれらのインスタンス変数名も @_host, @_user, @_pass 等の名前にすれば 読みやすいと思います。アンダーラインをつけているのはかぶるのを防ぐためです。 > # mainここから ================== > require "mysql" > require "lib/classup.rb" > > db.setparm("localhost","user","password","testdb","UTF-8","SJIS") > @sql="SQL文" > @cur=db.runsql @sql > # mainここまで ================== ここもローカル変数にしましょう。 というかdbが未定義だから、 undefined local variable or method `db' for main:Object (NameError) というエラーになるのでは? > ・runsqlの中でrequire "kconv"をやっている。 > initializeで出来ないかなぁ...MySQLのinitializeとぶつかりそうだなぁ lib/classup.rbの冒頭に置けばいいです。 # adgjmptwが気になってぐぐってみたら、携帯電話でアルファベットにして2〜9を # 順番に打つと出るんですね… -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/