更新后数据库字段不会更改

时间:2015-02-19 16:24:12

标签: mysql ruby

我正在使用MySQL gem学习Sinatra中的一些基本内容。我正在尝试建立的网站有点像www.facemash.com.au。

我向访客提供了两张照片,他们投了一张照片。当他们投票时,POST请求被发送到'/ vote'路径。

此路线的当前处理程序是:

  post '/vote' do
    @db = Mysql.new(host, user, pass, DB_name)
    @old_winner_vote = @db.prepare "SELECT wins FROM accounts WHERE id = ? "
    @winner_vote = @old_winner_vote.execute params[:winer]
    @winner_votes = @winner_vote.fetch.to_s.to_i
    @winner_votes += 1
    @update_winner_vote = @db.prepare "UPDATE accounts SET wins = ? WHERE id = ? "
    @update_winner_vote.execute @winner_votes, params[:winer]
    @old_looser_vote = @db.prepare "SELECT looses FROM accounts WHERE id = ? "
    @looser_vote = @old_looser_vote.execute params[:looser]
    @looser_votes = @looser_vote.fetch.to_s.to_i
    @looser_votes += 1
    @update_looser_vote = @db.prepare "UPDATE accounts SET looses = ? WHERE id = ? "
    @update_looser_vote.execute @looser_votes, params[:looser]
    @db.close
    redirect '/', 303
  end

看起来某些地方出了问题,因为wins / looses永远不会高于1.我试图将它们重置为0并且它们从0更新为1,但从未更高。

此外,我尝试从MySQL控制台将它们设置为更高的数字,并且它们已成功更新,但当我的Sinatra应用程序尝试更新它们时,它们会重置为1.

MySQL DB中的wins / looses定义如下:

| wins     | int(10) unsigned    | YES  |     | NULL    |                |
| looses   | int(10) unsigned    | YES  |     | NULL    |                |

知道什么是错的以及如何解决它?

我正在使用:

  • Ubuntu 14.04 x64bit
  • ruby​​ 2.2.0p0(2014-12-25修订版49005)[x86_64-linux]
  • sinatra 1.4.5
  • mysql 2.9.1
  • 瘦1.6.3

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

问题在于

@winner_vote = @old_winner_vote.execute params[:winer]
@winner_votes = @winner_vote.fetch.to_s.to_i

当调用@ winner_vote.fetch时,它返回:[#]然后调用.to_s将其转换为" [#]"所以调用.to_i会给0总是因此调用+1会给1,在第二次调用时它会以相同的方式进入" [1]"作为字符串,0作为整数递增将给出1,这就是为什么它永远不会高于1。 这可以修复如下:

@winner_votes = @winner_vote.fetch.to_s[1...-1].to_i

这样调用.to_s [1 ..- 1]将删除[]只留下内部的数字,然后它将数字增加1并成功更新数据库。 同样的修复适用于@looser_votes

@looser_votes = @looser_vote.fetch.to_s[1...-1].to_i