Le Deal du moment : -30%
LEGO Icons 10318 – Le Concorde à ...
Voir le deal
139.99 €

Aller en bas
Berka
Berka
Staffeux retraité

Nombre de messages : 1832
Age : 34
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Support Mysql pour rgss Empty 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.

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
Pièce jointe
libmysql.zip Vous n'avez pas la permission de télécharger les fichiers joints.(751 Ko) Téléchargé 17 fois


Dernière édition par Berka le Dim 30 Mai 2010 - 0:12, édité 7 fois
Yoshi-Dragon
Yoshi-Dragon
Membre

Nombre de messages : 752
Age : 28
Localisation : J'ai peur.
Distinction : aucune
Date d'inscription : 19/06/2009
http://smashbrosbrawl.e-monsite.com

Support Mysql pour rgss Empty Re: Support Mysql pour rgss

Dim 23 Mai 2010 - 0:04
Personellement ... j'ai pas compris a quoi sa servais ...
Coco'
Coco'
Staffeux retraité

Nombre de messages : 6578
Age : 31
Localisation : Nord/Douai
Distinction : EL DICTATOR COCO'
Coco-Dieu en puissance

Support Mysql pour rgss Magikarpe 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
http://www.rpgmakervx-fr.com

Support Mysql pour rgss Empty 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 :
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!
Berka
Berka
Staffeux retraité

Nombre de messages : 1832
Age : 34
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Support Mysql pour rgss Empty 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.
Berka
Berka
Staffeux retraité

Nombre de messages : 1832
Age : 34
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Support Mysql pour rgss Empty 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
nuki
nuki
Membre

Nombre de messages : 59
Distinction : aucune
Date d'inscription : 24/05/2010

Support Mysql pour rgss Empty 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 !
avatar
Jakarta
Membre

Nombre de messages : 40
Age : 28
Localisation : Midi-Pyrénées
Distinction : aucune
Date d'inscription : 05/02/2009

Support Mysql pour rgss Empty 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!
avatar
Jakarta
Membre

Nombre de messages : 40
Age : 28
Localisation : Midi-Pyrénées
Distinction : aucune
Date d'inscription : 05/02/2009

Support Mysql pour rgss Empty 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? Very Happy
bubblebug
bubblebug
Membre

Nombre de messages : 35
Distinction : aucune
Date d'inscription : 23/07/2010

Support Mysql pour rgss Empty 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 ?
Contenu sponsorisé

Support Mysql pour rgss Empty Re: Support Mysql pour rgss

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum