Support Mysql pour rgss
Sam 22 Mai 2010 - 15:24
Bonjour à tous.
Sous ce nom barbare se cache un script tout aussi barbare.Ceux qui s'y connaissent auront directement compris l'utilité de ce script par le titre de ce sujet. Pour les autres, ce script permet d'établir une connexion à une base de donnée de type mysql directement depuis rpgmaker.
Vous allez pouvoir envoyer et recevoir des informations dans votre jeu et cela beaucoup plus rapidement que par des transferts de fichiers classiques.
Mais tout d'abord il faut savoir que ce script ne fonctionne pas pour tous les types d'hébergement mysql. Seuls les hébergements (payants) offrant une connexion SSH (connexion depuis un programme externe au serveur web) peuvent faire fonctionner ce script. Vous pouvez toutefois tester en local, via des logiciels comme wamp.
Sachez enfin qu'en cas de décryptage de votre jeu, les identifiants mysql seront lisibles en clair. Ne mettez aucunes données personnelles sur votre serveur. Mais là, ce n'est plus mon problème.
Ce script a besoin d'une dll pour fonctionner. Elle est mise en pièce jointe.
Voila le script à copier au dessus de main.
Vous avez des réglages à faire au début du script. Lisez bien tout. Enfin, je voudrais que vous me demandiez la permission avant de poster ce script sur un autre forum.
Sous ce nom barbare se cache un script tout aussi barbare.Ceux qui s'y connaissent auront directement compris l'utilité de ce script par le titre de ce sujet. Pour les autres, ce script permet d'établir une connexion à une base de donnée de type mysql directement depuis rpgmaker.
Vous allez pouvoir envoyer et recevoir des informations dans votre jeu et cela beaucoup plus rapidement que par des transferts de fichiers classiques.
Mais tout d'abord il faut savoir que ce script ne fonctionne pas pour tous les types d'hébergement mysql. Seuls les hébergements (payants) offrant une connexion SSH (connexion depuis un programme externe au serveur web) peuvent faire fonctionner ce script. Vous pouvez toutefois tester en local, via des logiciels comme wamp.
Sachez enfin qu'en cas de décryptage de votre jeu, les identifiants mysql seront lisibles en clair. Ne mettez aucunes données personnelles sur votre serveur. Mais là, ce n'est plus mon problème.
Ce script a besoin d'une dll pour fonctionner. Elle est mise en pièce jointe.
Voila le script à copier au dessus de main.
Vous avez des réglages à faire au début du script. Lisez bien tout. Enfin, je voudrais que vous me demandiez la permission avant de poster ce script sur un autre forum.
- Code:
#======================================================================
# Net::Mysql
# 29-05-2010 rpgmakervx.1fr1.net Rgss1&2 v.1
# par berka
#--------------------------------------------------------------------------------------------------------------
# This script is free to use. Do not post anywhere without my permission. Credits needed.
#--------------------------------------------------------------------------------------------------------------
# Warning: if your game is cracked and decrypted, your mysql login will be available !
# Do not use with a database containing personal information.
# Your mysql host should accept external connections.
# Check with it for remote SSH access to your database.
#--------------------------------------------------------------------------------------------------------------
# This script allows interractions with a mysql database directly in the game
# It requires a file "libmysql.dll" in the game folder
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
# Ne pas utiliser de base de donnée contenant des informations personnelles.
# Votre hébergeur Mysql doit accepter les connexions mysql externes.
# Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
#--------------------------------------------------------------------------------------------------------------------------
# ● md5() support
# ● Mysql functions:
# - Net::Mysql.new([host,user,pass,base,port]) : return : mysql connection handle
# - @mysql.close : return : bool
# - @mysql.list_tables([filter]) : return : ["table1", "table2"]
# - @mysql.select_db(base_name) : return : true if the db exists or false
# - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
# - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
# - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
# - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
# - @mysql.num_rows([handle result]) : return : integer
# ● Html functions:
# - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
# - "<berka>".htmlspecialchars : return : "&lr;berka>"
# - "<berka>".urlencode : return : "%3Cberka%3E"
# - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# SQL queries samples
# ● "SELECT * FROM table"
# ● "INSERT INTO table (fields) VALUES (values)"
# ● "INSERT INTO table SET field = value WHERE field = value"
# ● "UPDATE table SET field = value WHERE field = value"
#--------------------------------------------------------------------------------------------------------------------------
# Sample :
# @mysql = Net::Mysql.new
# @mysql.query("SELECT * FROM `members`)
# res = @mysql.fetch_assoc
# => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
#======================================================================
module Berka
module Mysql
Host = "127.0.0.1" # mysql server(local : 127.0.0.1)
User = "" # mysql user
Pass = "" # mysql password
Base = "rgss" # base name
Port = 3306 # server port (default: 3306)
Err_Con = "Mysql:\nUnable to connect to the database"
Err_Req = "Mysql:\nUnable to send the query"
end
module Html
Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
end
end
class Numeric
def copymem(len)
# move memory to convert c structs to ruby objects
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end
class String
def to_ruby
# detect if the string is a md5 hash
return self if self=~/^[a-f0-9]{32}$/
# converts syntax of a string to ruby controls
eval(self)rescue self
end
def htmlspecialchars
# converts special chars to html compatibles chars (ASCII)
# REMOVE THE * !!!!
{"&"=>"&*amp;",'"'=>"&*quot;","'"=>"&*#039;","<"=>"&*lr;",">"=>"&*gt;"}.each_pair{|k,v|self.gsub!(k,v)}
self
end
def urlencode
# converts special char of url
o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o << c};o
end
def urldecode
# converts encoded special char of url to normal chars
self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
end
end
module Net
class Mysql
MI=Win32API.new("libmysql.dll","mysql_init","l","l")
MC=Win32API.new("libmysql.dll","mysql_close","l","l")
MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
attr_reader :handle
def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
# @handle : handle of mysql initialization
@handle=MI.call(0)
# establishes the mysql connection
(print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
# returns: handle
@handle
end
def close
# closes the current connection
MC.call(@handle)
end
def select_db(base)
# selects a current database
MSDB.call(base)==true
end
def list_tables(m="")
# lists tables request -> fetch the result -> to ruby string
l=MFR.call(MLT.call(@my,m)).copymem(1024)
# splits the string to array -> list of tables
l.scan(/\t(\w+)\0/).flatten
end
def query(req,ret=false)
# sends the query (msg error)
(return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
# previous results are released
MFRE.call(@result)if @result
# gets the results from the query -> c struct handle
@result=MSR.call(@handle)
ret ? get_rows(@result) : @result
end
# Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
# returns the fieldname or nil if the field is not found.
ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
def get_fields(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# gets the number of fields, offset: 8bytes-2 (cf. loop)
nf,ch,of=MFC.call(@handle),[],6
# each field: if the fieldname is not found: increase the offset of bytes.
nf.times{|i|a=ReadField.call(r,i,of+=2)until a
# add to the fields array
ch << a
# reinitialize the offset for the next iteration
of=6}
# returns an array of fields
ch
end
def get_rows(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# nr: number of rows, nf: number of fields
nr,nf,en=MNR.call(r),MNF.call(r),[]
# each row:
nr.times{|i|
# gets each row: c struct -> to ruby string -> to array (handles)
c=MFR.call(r).copymem(4).unpack("i")[0]
# gets each field length: c struct -> to ruby string -> to array (handles)
tf=MFL.call(r).copymem(4*nf).unpack("i*")
# size of field: offset of each field
sf=tf.inject(0){|n,i|n+i}
# handle of row -> to string (offset) -> to array
en << c.copymem(sf+nf).split("\0")
}
# returns each row as an array
en
end
def num_rows(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# returns: number of rows
MNR.call(r)
end
def fetch_assoc(to_ruby=false)
# gets rows and fields
h,f,r={},get_fields,get_rows
# each field: read the rows and store them to an hash : h[:field]=[rows]
# rows are converted to ruby objects if to_ruby == true
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)}
h
end
end
end
- Fichiers joints
Re: Support Mysql pour rgss
Dim 23 Mai 2010 - 0:04
Personellement ... j'ai pas compris a quoi sa servais ...
- Coco'Staffeux retraité
- Nombre de messages : 6578
Age : 31
Localisation : Nord/Douai
Distinction : EL DICTATOR COCO'
Coco-Dieu en puissance
Grand gourou suppléant de la secte des MAGIKARP
Leader charismatique des 2beStaffieux
N°1 du forum
Président, vice-présidents et membres honoraires de la cour suprême du forum
Président de l'association des grosses distinctions CMB
Date d'inscription : 02/07/2008
Re: Support Mysql pour rgss
Dim 23 Mai 2010 - 0:26
Je t'en ai déjà parlé sur la CB, mais je poste quand même ici.
Ton script est tout simplement ÉNORME, les utilisations sont vraiment multiples, mais il possède un grand défaut :
Si t'arrives à trouver une parade, franchement, ce serait un de tes meilleurs scripts!
Ton script est tout simplement ÉNORME, les utilisations sont vraiment multiples, mais il possède un grand défaut :
Sachez enfin qu'en cas de décryptage de votre jeu, les identifiants mysql seront lisibles en clair.
Si t'arrives à trouver une parade, franchement, ce serait un de tes meilleurs scripts!
Re: Support Mysql pour rgss
Dim 23 Mai 2010 - 0:30
Yoshi: c'est assez difficile à expliquer. C'est comme pour un site internet. Ce script permet d'envoyer et de recevoir des données qui sont enregistrées dans une base de données sur un serveur distant.
Tu vas pouvoir envoyer tes scores sur ton site internet, récupérer des valeurs comme la position d'autres joueurs...
Coco: merci beaucoup, une nouvelle fois aussi. Pour le cryptage j'ai peut etre une idée... à creuser.
Tu vas pouvoir envoyer tes scores sur ton site internet, récupérer des valeurs comme la position d'autres joueurs...
Coco: merci beaucoup, une nouvelle fois aussi. Pour le cryptage j'ai peut etre une idée... à creuser.
Re: Support Mysql pour rgss
Sam 29 Mai 2010 - 15:33
Nouvelle version. La majeure partie du script est en anglais. Je suis désolé pour les anglophobes, mais c'est beaucoup plus pratique pour moi.
Au niveau des modifs:
- support Rgss 1 et 2
- class Mysql (plus facile et connexion multiples)
- mysql_select_db permet de choisir une base courante
- correction de quelques petits bugs
Au niveau des modifs:
- support Rgss 1 et 2
- class Mysql (plus facile et connexion multiples)
- mysql_select_db permet de choisir une base courante
- correction de quelques petits bugs
- nukiMembre
- Nombre de messages : 59
Distinction : aucune
Date d'inscription : 24/05/2010
Re: Support Mysql pour rgss
Dim 30 Mai 2010 - 11:00
Les conseils de Zeus ont portés leur fruit. Du très très bon boulot !
- JakartaMembre
- Nombre de messages : 40
Age : 28
Localisation : Midi-Pyrénées
Distinction : aucune
Date d'inscription : 05/02/2009
Re: Support Mysql pour rgss
Sam 31 Juil 2010 - 10:47
Bonjour, désolé du nécropost, mais j'ai un petit problème avec ton script Berka, je lance mon jeu et je parle à un personnage pour effectuer cette commande (appeler script) :
@mysql.query("INSERT INTO 'table'(ID, Nom, Lvl) VALUES('', '\N[001]', '\V[0001]')")
\N[001] = Nom du héros
\V[0001] = Level du héros
Je voulais faire un test pour voir si le script fonctionnait bien, (pour par la suite pouvoir stocker les données des joueurs en ligne)
Cependant, un message d'erreur apparait :
"NoMethodError occured while running script.
undefined method 'query' for nil:NilClass"
Si quelqu'un pouvait m'aider...
Merci d'avance!
@mysql.query("INSERT INTO 'table'(ID, Nom, Lvl) VALUES('', '\N[001]', '\V[0001]')")
\N[001] = Nom du héros
\V[0001] = Level du héros
Je voulais faire un test pour voir si le script fonctionnait bien, (pour par la suite pouvoir stocker les données des joueurs en ligne)
Cependant, un message d'erreur apparait :
"NoMethodError occured while running script.
undefined method 'query' for nil:NilClass"
Si quelqu'un pouvait m'aider...
Merci d'avance!
- JakartaMembre
- Nombre de messages : 40
Age : 28
Localisation : Midi-Pyrénées
Distinction : aucune
Date d'inscription : 05/02/2009
Re: Support Mysql pour rgss
Dim 1 Aoû 2010 - 23:50
Graille... tu dis ca pasque t'as réussi à faire marcher le script ? Si oui tu peux m'expliquer?
- bubblebugMembre
- Nombre de messages : 35
Distinction : aucune
Date d'inscription : 23/07/2010
Re: Support Mysql pour rgss
Lun 2 Aoû 2010 - 11:07
Ont gros avec ce script ont peut permettre au personne de se créer un compte en ligne ?
Inscription/connexion ?
Inscription/connexion ?
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum