Project1

标题: RGSS 连接到MySQL数据库(网游爱好者的福音) [打印本页]

作者: Goldencolor    时间: 2010-9-17 11:11
标题: RGSS 连接到MySQL数据库(网游爱好者的福音)
本帖最后由 传说VS天涯 于 2010-11-1 15:53 编辑

RGSS 连接到MySQL数据库,,有图有真相在查找MySql资料时无意看到,,转过来. 翻译~



Mysql support for Rgss
Version: 1.0
By: Berka
有任何问题直接回复~3Q
RGSSMySQL.rar (121.55 KB, 下载次数: 2791)


MySQL 下载地址:
Mysql
SQLyog

  1. #======================================================================
  2. #                                                                   Net::Mysql
  3. #      29-05-2010                            www.rpgmakervx-fr.com                                  Rgss1&2  v.1
  4. #                                                                    par berka                 
  5. #--------------------------------------------------------------------------------------------------------------
  6. # 此脚本是免费使用。可以随意转载,注明出处!!
  7. #--------------------------------------------------------------------------------------------------------------
  8. # 警告 : 如果您的游戏破解和解密, 你的MySQL将会被登录!
  9. # 请勿使用包含个人信息数据库。(最好对连接字符串进行加密,举例MD5,)
  10. # 你的MySQL主机应该接受外部连接,,
  11. # 它检查远程SSH访问你的数据库。
  12. #--------------------------------------------------------------------------------------------------------------
  13. # 这个脚本可以直接连接到MySQL数据库,,需要 "libmySQL.dll" 文件的支持!!
  14. #--------------------------------------------------------------------------------------------------------------
  15. # 注意: 如果你对游戏加密了,依然可以访问到MySql数据库。
  16. # 他是直接通过远程SSH访问你的数据库= =,,这点大家注意
  17. #--------------------------------------------------------------------------------------------------------------------------
  18. # 必须存在"libmySQL.dll"否则无法连接到MySql数据库。
  19. #--------------------------------------------------------------------------------------------------------------------------
  20. #  — md5() support
  21. #  — Mysql 方法(函数):
  22. #   - Net::Mysql.new([host,user,pass,base,port]) : return : mysql 连接句柄
  23. #   - @mysql.close : return : bool
  24. #   - @mysql.list_tables([filter]) : return : ["table1", "table2"]
  25. #   - @mysql.select_db(base_name) : return : true if the db exists or false
  26. #   - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
  27. #   - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
  28. #   - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
  29. #   - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
  30. #   - @mysql.num_rows([handle result]) : return : integer
  31. #  — Html 方法(函数):
  32. #   - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
  33. #   - "<berka>".htmlspecialchars : return : "&lr;berka&gt;"
  34. #   - "<berka>".urlencode : return : "%3Cberka%3E"
  35. #   - "%3Cberka%3E".urldecode : return : "<berka>"
  36. #--------------------------------------------------------------------------------------------------------------------------
  37. # SQL 查询示例:
  38. #  —  "SELECT * FROM table"
  39. #  —  "INSERT INTO table (fields) VALUES (values)"
  40. #  —  "INSERT INTO table SET field = value WHERE field = value"
  41. #  —  "UPDATE table SET field = value WHERE field = value"
  42. #--------------------------------------------------------------------------------------------------------------------------
  43. # 示例 :
  44. # @mysql = Net::Mysql.new
  45. # @mysql.query("SELECT * FROM `members`)
  46. # res = @mysql.fetch_assoc
  47. # => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
  48. #======================================================================

  49. module Berka
  50.   module Mysql
  51.     #mysql 服务器(local(本地) : 127.0.0.1)
  52.     Host   = "127.0.0.1"
  53.         #mysql 用户名
  54.     User   = ""
  55.         #mysql 密码
  56.     Pass  = ""   
  57.         #数据库名字(base name)
  58.     Base  = "rgss"
  59.         #服务器端口(默认:3306)
  60.     Port    = 3306                                  # server port (default: 3306)
  61.    
  62.     Err_Con = "Mysql:\n无法连接到数据库"
  63.     Err_Req = "Mysql:\n无法发送查询"
  64.   end
  65.   
  66.   module Html
  67.     Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
  68.   end
  69. end

  70. class Numeric
  71.   def copymem(len)
  72.     # 移动存储转换到C结构Ruby对象
  73.     Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
  74.   end
  75. end

  76. class String
  77.   
  78.   def to_ruby
  79.     # 检测如果该字符串是一个MD5 hash
  80.     return self if self=~/^[a-f0-9]{32}$/
  81.     #转换成一个Ruby controls字符串
  82.     eval(self)rescue self
  83.   end
  84.   
  85.   def htmlspecialchars
  86.     # converts special chars to html compatibles chars (ASCII)
  87.     {"&"=>"&amp;",'"'=>"&quot;","'"=>"&rsquo;","<"=>"&lr;",">"=>"&gt;"}.each_pair{|k,v|self.gsub!(k,v)}
  88.     self
  89.   end
  90.    
  91.   def urlencode
  92.     # 特殊字符的URL转换
  93.     o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o<<c};o
  94.   end
  95.    
  96.   def urldecode
  97.     # converts encoded special char of url to normal chars
  98.     self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
  99.   end
  100. end
  101.   
  102. module Net
  103.   class Mysql
  104.     MI=Win32API.new("libmysql.dll","mysql_init","l","l")
  105.     MC=Win32API.new("libmysql.dll","mysql_close","l","l")
  106.     MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
  107.     MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
  108.     MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
  109.     MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
  110.     MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
  111.     MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
  112.     MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
  113.     MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
  114.     MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
  115.     MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
  116.     MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
  117.     MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
  118.    
  119.     attr_reader :handle
  120.    
  121.     def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
  122.       # @handle : 处理MySQL的初始化
  123.       @handle=MI.call(0)
  124.       # 建立MySQL连接
  125.       (print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
  126.       # returns: handle
  127.       @handle
  128.     end
  129.    
  130.     def close
  131.       # 关闭当前连接
  132.       MC.call(@handle)
  133.     end
  134.    
  135.     def select_db(base)
  136.       # 选择一个数据库
  137.       MSDB.call(base)==true
  138.     end
  139.    
  140.     def list_tables(m="")
  141.       # lists tables request -> fetch the result -> to ruby string
  142.       l=MFR.call(MLT.call(@my,m)).copymem(1024)
  143.       # splits the string to array -> list of tables
  144.       l.scan(/\t(\w+)\0/).flatten
  145.     end
  146.    
  147.     def query(req,ret=false)
  148.       # sends the query (msg error)
  149.       (return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
  150.       # previous results are released
  151.       MFRE.call(@result)if @result
  152.       # gets the results from the query -> c struct handle
  153.       @result=MSR.call(@handle)
  154.       ret ? get_rows(@result) : @result
  155.     end
  156.    
  157.     # Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
  158.     # returns the fieldname or nil if the field is not found.
  159.     ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
  160.    
  161.     def get_fields(res=nil)
  162.       # if a result handle is provided
  163.       r=res.nil? ? @result : res
  164.       # gets the number of fields, offset: 8bytes-2 (cf. loop)
  165.       nf,ch,of=MFC.call(@handle),[],6
  166.       # each field: if the fieldname is not found: increase the offset of bytes.
  167.       nf.times{|i|a=ReadField.call(r,i,of+=2)until a
  168.         # add to the fields array
  169.         ch<<a
  170.         # reinitialize the offset for the next iteration
  171.         of=6}
  172.       # returns an array of fields
  173.       ch
  174.     end
  175.    
  176.     def get_rows(res=nil)
  177.       # if a result handle is provided
  178.       r=res.nil? ? @result : res
  179.       # nr: number of rows, nf: number of fields
  180.       nr,nf,en=MNR.call(r),MNF.call(r),[]
  181.       # each row:
  182.       nr.times{|i|
  183.        # gets each row: c struct -> to ruby string -> to array (handles)
  184.        c=MFR.call(r).copymem(4).unpack("i")[0]
  185.        # gets each field length: c struct -> to ruby string -> to array (handles)
  186.        tf=MFL.call(r).copymem(4*nf).unpack("i*")
  187.        # size of field: offset of each field
  188.        sf=tf.inject(0){|n,i|n+i}
  189.        # handle of row -> to string (offset) -> to array
  190.        en<<c.copymem(sf+nf).split("\0")
  191.        }
  192.        # returns each row as an array
  193.       en
  194.     end
  195.    
  196.     def num_rows(res=nil)
  197.       # if a result handle is provided
  198.       r=res.nil? ? @result : res
  199.       # returns: number of rows
  200.       MNR.call(r)
  201.     end
  202.    
  203.     def fetch_assoc(to_ruby=false)
  204.       # gets rows and fields
  205.       h,f,r={},get_fields,get_rows
  206.       # each field: read the rows and store them to an hash : h[:field]=[rows]
  207.       # rows are converted to ruby objects if to_ruby == true
  208.       f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi.to_sym]=(to_ruby ? t.map!{|o|o.to_ruby if o} : t)}
  209.       h
  210.     end
  211.   end
  212. end
复制代码

作者: bbaugle    时间: 2010-9-17 12:17
很好很强大.......RM中能用帐号登录了..
作者: zphyp120    时间: 2010-9-17 12:23
kankan
作者: DeathKing    时间: 2010-9-17 12:50
恩,现在正在研究这方面的饿内容,是个很好的参考。
作者: Goldencolor    时间: 2010-9-17 13:03
:lol 很不错的东西,我自己也在完善ing,做一C/S程序来连起来= =。。主要是对C++这东西无能无力。
作者: orochi2k    时间: 2010-9-17 19:13
很好很强大.......RM中能用帐号登录了..
bbaugle 发表于 2010-9-17 12:17


账号登陆的话只要调用IE的API就够实现了

作者: qaz4633063    时间: 2010-9-18 03:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: secondsen    时间: 2010-9-18 08:47
回复能看到隐藏的东西
作者: maju_saka    时间: 2010-9-20 10:28
隐藏的是什么东东捏?
作者: a80018001a    时间: 2010-9-20 10:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: 逸豫    时间: 2010-9-20 11:15
啊喂……首先我们应该解决加密的问题吧……
是不是用DLL封装下会更好些 - -
作者: gjz010    时间: 2010-9-23 12:15
看看什么好东西~
作者: 大鲨鱼3000    时间: 2010-9-23 14:58
X
作者: longpu940213    时间: 2010-9-23 16:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 光的圆周率    时间: 2010-9-23 19:13
会不会被恶意插入关键字?
作者: f530144236    时间: 2010-9-25 12:09
:handshake:o
作者: 511139511    时间: 2010-9-25 17:24
网游啊,当然要支持这种华丽的东西了。

作者: 【紫雨】    时间: 2010-9-25 20:49
回帖···我也想看看这到底是个什么东西来的
作者: g061151    时间: 2010-9-25 21:53
回复看一下...很强大的东西
作者: 星之璇    时间: 2010-9-26 23:35
如果可以连其它数据库那就好了~
作者: zzhzzhzzh    时间: 2010-9-29 20:25
很不错的说
作者: 灵九哲    时间: 2010-10-1 12:55
不错
作者: ML4455739    时间: 2010-10-1 13:06
看下
作者: N.K    时间: 2010-10-1 13:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 贼船    时间: 2010-10-2 22:46
不明真相,看一下吧

作者: END66RPG    时间: 2010-10-2 22:50
爱爱爱
作者: yyc970428    时间: 2010-10-4 13:55
回复一个看看是什么东西
作者: jinzii    时间: 2010-10-4 16:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: q2571875    时间: 2010-10-4 17:02
好东西啊!我找了很久了。

作者: wyongcan2008    时间: 2010-10-7 10:29
嗯嗯,但是数据库内容要加密额
作者: 月华舞    时间: 2010-10-7 11:30
???????????
作者: -LOli控-    时间: 2010-10-8 18:28
- -你玩我是吧?
作者: mwkug    时间: 2010-10-20 21:01
打算研究一下这个东西,网游的话可能比较复杂点吧……
作者: 5810707    时间: 2010-10-21 13:02
看看。。。。。
作者: saturnfjh    时间: 2010-10-22 16:25
不管是什么,回了再说……
作者: ★PIG★    时间: 2010-10-22 19:47
恩?这么神奇么?
作者: chao6889898    时间: 2010-10-22 21:03
真的?
作者: a35869930    时间: 2010-10-30 16:49
哈哈,看看:lol
作者: 狠、陌生    时间: 2010-10-31 02:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 悠然飞雪    时间: 2010-10-31 12:56
哦 是真的吗?
作者: xingyu    时间: 2010-11-1 00:09
回帖···我也想看看这到底是个什么东西来的
作者: amethystfy    时间: 2010-11-1 08:39
回复一下看看
作者: 冷镜    时间: 2010-11-14 12:11
回复一个看看
作者: lijianjun    时间: 2010-11-14 12:19
kankankan看
作者: adeliyas    时间: 2010-12-8 16:06
顶,新大陆
作者: lianran123456    时间: 2010-12-19 14:09
^^^^^^^^^^^^^^^^^^
作者: chaochao    时间: 2010-12-21 20:19
将来要把游戏数据都存数据库里吗?
ps:我不建议直接用RM连数据库。因为这样不安全。中间至少要有一层服务器来挡住对数据库的攻击。
作者: enghao_lim    时间: 2010-12-21 23:34
对mysql理解不能……(=_=):L
作者: tamashii    时间: 2010-12-22 00:26
您好闲啊 - -bbbb
作者: 天天发呆    时间: 2011-1-9 15:54
kkkkkkkkkkkkkkkkkkkkkkkkkkkk
作者: zjaycool    时间: 2011-5-16 22:13
我也来看看
作者: 残风水月    时间: 2011-5-17 15:52
有点深奥哦!
作者: zjaycool    时间: 2011-5-27 20:04
可以看看
作者: 759782518    时间: 2011-6-12 12:24
嘿嘿!恢复看看有什么?
作者: ngngy    时间: 2011-7-12 00:32
看得我头大
作者: asd65198805    时间: 2011-7-23 16:58
可用RM制造网游?
作者: 522194792    时间: 2011-7-27 15:31
http://119.147.99.23/down_group1 ... %98%AF%E7%8C%AA.zip
作者: snow22299    时间: 2011-9-23 06:55
gjz010 发表于 2010-9-23 12:15
看看什么好东西~


看看什么好东西~:)
作者: 李梦遥    时间: 2011-9-23 17:43
可耻的想看一下-v-
作者: 1370528656    时间: 2011-10-2 15:59
不错,很好的东西
作者: 952538359    时间: 2011-11-3 18:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: eu国猪    时间: 2012-4-4 23:20
着呢大大大大
作者: 群216361445    时间: 2012-7-27 11:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 天皇子夜    时间: 2013-8-28 10:42
于是我来看好东东了+v+
作者: mabingjun626    时间: 2013-10-18 21:55
请说明怎么使用该脚本。不明觉厉。
作者: 八神太一    时间: 2014-1-19 23:55
问一下这到底是讲什么啊
作者: hoo_huayi92    时间: 2014-1-27 04:35
本帖最后由 hoo_huayi92 于 2014-1-27 04:47 编辑

MySQL 5.6 能支持 RGSS3 吗?
作者: Fakmab    时间: 2014-1-27 12:50
不明觉厉……MySQL数据库不是一种开放源代码的关系型数据库管理系统吗?
作者: 1760206308    时间: 2014-7-14 08:54
隐藏的东西肯定是好东西。
作者: 孤城泣血    时间: 2014-7-14 10:16
话说这样数据真的安全么?
作者: c248611    时间: 2014-7-14 21:00
只适用于XP的是么?
扔脚本+dll就可使用了是吧?
作者: yoolee    时间: 2015-3-4 12:13
kankan, lol
作者: 欧买歌    时间: 2015-3-4 21:03
隐藏什么==
作者: 冷峻逸    时间: 2015-5-3 18:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 夜狠简单    时间: 2015-5-5 08:59

隐藏的一定是好东西
作者: shinai    时间: 2015-6-2 04:22
感谢楼主
作者: Ultra∮魔坦    时间: 2016-6-12 17:18
網絡連接超duang的
作者: 云海尘清    时间: 2016-6-22 22:55
额,到好强大
作者: 卡米尔    时间: 2016-10-14 19:55
111111111111111111111
作者: 66小空    时间: 2019-12-6 14:47
好像链接不上




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1