Page 1 sur 1

Utilisation BD mysql sans ODBC

Publié : mar. 12/sept./2006 22:50
par Hableur
Bonjour,

je poste çà au cas où cela intéresserais un autre débutant. C'est un script pour utiliser une bd mysql sans passer par le gestionnaire ODBC et en utilisant la bibliothèque mysql.dll.

J'ai pompé tout sur Poshu, mais j'ai simplifié pour que cela soit plus facile à comprendre.

Ma question: y a t'il moyen de faire encore plus simple ?

8O
; -------------------------------
; Petit exemple sur le SQL avec libmysql.
; c'est pompé sur l'exemple de Poshu, mais en
; vachement simplifié pour les bleus-bites comme moi

; Pour les fonctions MySql, allez voir ce site:
; http://doc.domainepublic.net/mysql/doc. ... tions.html
; plus clair que http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html

; Il faut déjà avoir créé une base mysql, bien sûr !


OpenLibrary( 1 , "c:\Program Files\EasyPHP1-8\php\libmysql.dll" ) ;charger la dll. Chez moi, elle est rangée là.


serveur$ = "127.0.0.1" ; ip serveur easyphp
user$ ="root" ; nom utilisateur, root par défaut
pass$ ="" ; mot de passe, vide par défaut
nomdb$="essaipurebasic" ; nom de la base de données
portsql =0
pipe$ =""
conconf =0
objetdb= CallFunction(1,"mysql_init",0); pour dire, c'est l'objet lien entre la db et les fonctions...
; si quelqu'un peut mieux expliquer...

;Se connecter à la base de donnée
If CallFunction(1,"mysql_real_connect",objetdb, serveur$, user$, pass$, nomdb$, portsql, pipe$, conconf)=0
Debug "echec connexion"
End
EndIf


;chopper des données:

SQL$ = "SELECT * FROM purebasic " ;ca c'est la requete

resultat=CallFunction(1,"mysql_query",objetdb,SQL$) ; exécution de la requête
; c'est l'adresse du résultat qui est mis dans la variable resultat
resultat=CallFunction(1,"mysql_store_result",objetdb) ;stocke le résultat dans un
; objet qui sera manipulé ensuite. Renvoie 0 si la requête n'a rien donné!
;If resultat=0
; Debug "La requête a échoué !"
; End
;End If

nblignes=CallFunction(1,"mysql_num_rows",resultat) ;retourne le nombre de lignes
nbchamps=CallFunction(1,"mysql_num_fields",resultat); nombre champs par ligne

; Debug "lignes "+Str(nblignes)
; Debug "colonnes "+Str(nbchamps)

For i=1 To nblignes

ligne=CallFunction(1,"mysql_fetch_row",resultat);
donne l'adresse du debut
; d'une ligne de résultats

For boucle = 0 To nbchamps-1 ;le premier champ est le 0, le second le 1...

pointeur=PeekL(ligne+4*(boucle));donne l'adresse du champ à lire
;cette adresse est stockée sur 4 octets (soit 32 bits) donc entier Long
;donc commande PeekL et incrémentation de 4 à chaque passage.

If pointeur>0
valeur.s=PeekS(pointeur)
; met le contenu du champ dans
; la variable chaîne 'valeur'
; C'est une chaîne, donc PeekS
Else
valeur="NULL"
EndIf

Debug valeur
Next boucle
Next i
8O
[/quote]

Publié : mar. 12/sept./2006 22:56
par Hableur
Désolé, je le donne en code, c'est mieux.

Ah, ces débutants...
:x

Code : Tout sélectionner

; ------------------------------- 
; Petit exemple sur le SQL avec libmysql. 
; c'est pompé sur l'exemple de Poshu, mais en
; vachement simplifié pour les bleus-bites comme moi

; Pour les fonctions MySql, allez voir ce site:
; http://doc.domainepublic.net/mysql/doc.mysql/c-api-functions.html
; plus clair que http://dev.mysql.com/doc/refman/5.0/fr/c-api-functions.html

; Il faut déjà avoir créé une base mysql, bien sûr !


OpenLibrary( 1 , "c:\Program Files\EasyPHP1-8\php\libmysql.dll" ) ;charger la dll. Chez moi, elle est rangée là.


serveur$ = "127.0.0.1" ; ip serveur easyphp
user$ ="root" ; nom utilisateur, root par défaut
pass$ =""     ; mot de passe, vide par défaut
nomdb$="essaipurebasic" ; nom de la base de données
portsql =0 
pipe$ ="" 
conconf =0 
objetdb= CallFunction(1,"mysql_init",0); pour dire, c'est l'objet lien entre la db et les fonctions...
                                        ; si quelqu'un peut mieux expliquer...

;Se connecter à la base de donnée 
If CallFunction(1,"mysql_real_connect",objetdb, serveur$, user$, pass$, nomdb$, portsql, pipe$, conconf)=0 
  Debug "echec connexion"
  End
  
EndIf 


;chopper des données: 

SQL$ = "SELECT * FROM purebasic " ;ca c'est la requete  

    resultat=CallFunction(1,"mysql_query",objetdb,SQL$) ; exécution de la requête
                ; c'est l'adresse du résultat qui est mis dans la variable resultat
    resultat=CallFunction(1,"mysql_store_result",objetdb) ;stocke le résultat dans un
                ; objet qui sera manipulé ensuite. Renvoie 0 si la requête n'a rien donné!
                ;If resultat=0
                ;    Debug "La requête a échoué !"
                 ;   End
                ;End If 
                
    nblignes=CallFunction(1,"mysql_num_rows",resultat) ;retourne le nombre de lignes
    nbchamps=CallFunction(1,"mysql_num_fields",resultat); nombre champs par ligne 
 
    Debug "lignes  "+Str(nblignes)   
    Debug "colonnes "+Str(nbchamps)
    
    For i=1 To nblignes
    
     ligne=CallFunction(1,"mysql_fetch_row",resultat); donne l'adresse du debut
       ; d'une ligne de résultats
     
           For boucle = 0 To nbchamps-1 ;le premier champ est le 0, le second le 1...

                pointeur=PeekL(ligne+4*(boucle));donne l'adresse du champ à lire 
                  ;cette adresse est stockée sur 4 octets (soit 32 bit) donc entier Long
                  ;donc commande PeekL et incrémentation de 4 à chaque passage.
          
              If pointeur>0 
               valeur.s=PeekS(pointeur) ; met le contenu du champ dans
                                        ; la variable chaîne 'valeur'
                                        ; C'est une chaîne, donc PeekS
               Else 
               valeur="NULL"
              EndIf 
        
              Debug valeur 
           Next boucle
     Next i
    
[/code]

Publié : mer. 13/sept./2006 6:51
par Flype
oui ya moyen de faire bcp plus simple.
je te montrerais un exemple si j'ai le temps ce soir.

Publié : mer. 13/sept./2006 21:09
par Hableur
Quand tu veux, y a pas le feu, mais ça m'intéresse.

Merci :)

Publié : mer. 13/sept./2006 23:56
par Flype

Publié : mer. 27/sept./2006 9:04
par lionel_om
Bonjour,

J'utilise la fonction "mysql_real_connect" de la dll "libmysql.dll" pour me connecter à ma base de données, mais je n'y arrive qu'en local. Pas moyen de me connecter à ma BD sur sql.free.fr.

J'ai essayé avec les paramètres suivants :

Code : Tout sélectionner

mysql_real_connect(resBD, "sql.free.fr", user$, pass$, nom_bd$, 3306, "NULL", 0)
Quelqu'un a déjà essayé autrement qu'en local ?

Merci d'avance
Lionel

Publié : mer. 27/sept./2006 9:30
par Progi1984
La plupart des serveur web de type free refusent les connexions externes !

Il faut utiliser une librairie de type ETNA : http://blitzklan.free.fr

Publié : mer. 27/sept./2006 10:05
par lionel_om
Y'a aucune information pr PB aussi : ni exemple, ni notice d'installation.
Tu pourrait pas m'expliquer un peu svp Progi1984 ?

Merci
Lionel

Publié : mer. 27/sept./2006 10:23
par Progi1984
Mince... je l'ai que sur mon poste... j'en suis un des dev... Elle dervait bientot sortir...

Sinon en fait, ETNA est une userlib qui permet d'accéder via un fichier PHP à un serveur MySQL ou autre(PostGreSQL testé) on web de type free, OVH, etc... Comme elle utilise des threads, elle permet au programme de continuer en attendant les réponses !

http://blitzklan.free.fr/etna.php

Publié : mer. 27/sept./2006 10:29
par lionel_om
Oui j'avais vu que tu étais un des développeurs (le principal pe etre car le site à l'air d'être fait par toi ?).

Et vous n'avez pas fait d''exemples en PB ? (j'v essayé de migrer le code Blitz sinon car il a l'air transparent comme langage) Le Thread est inclu dans la Lib ou faut le créer dans PB ?
Car en fait c'est pour un projet de mise en ligne de site Web et j'utilise la version 3.9x de PB (avec une Lib FTP). Or cette version n'est pas Thread Safe, dc j'risque pas d'avoir des pb ? (sinon j'utiliserai des mutex...)

Merci d'avance
Lio

Publié : mer. 27/sept./2006 10:36
par Progi1984
Le site Pas par moi mais par Loki, notre leader.

Les exemples &l'userlib en PB arriverotn bientot !
Thread inclus dans la lib !

Par contre code PB4 !

Publié : mer. 27/sept./2006 12:51
par lionel_om
C'est bon j'ai compris comment ca marche.
En effet c'ets pas bien compliqué !!!

Voici un codepour ceux que ca intéresse (PB 3.9x) :

Code : Tout sélectionner

;{ Structure }
Structure ETNA
  SetServer.l
  SetDelimiter.l
  SetKey.l
  SetKeySend.l
  SetKeyReceive.l
  Update.l
  Send.l
  NbOfQueuedCmd.l
  Cancel.l
  Receive.l
  GetState.l
  GetResult.l
  GetNbOfLines.l
EndStructure
;}

;{ Constantes }
#ETNA_OK = 2
#ETNA_NO_NETWORK = 3
#ETNA_CONNECTION_FAILED = 4
#ETNA_REQUEST_ERROR = 5
#ETNA_SYSTEM_ERROR = 6
#ETNA_NO_THREAD = -999  ; To run without thread for a special command
;}

;{ Globals }
Global ETNA_Info.ETNA
Global ETNA_hLib
;}

Procedure ETNA_Init( _dllFile.s )
  ETNA_hLib = OpenLibrary(#PB_Any, _dllFile)
  If ETNA_hLib
    ETNA_Info\SetServer     = IsFunction(ETNA_hLib, "ETNA_SetServer")
    ETNA_Info\SetDelimiter  = IsFunction(ETNA_hLib, "ETNA_SetDelimiter")
    ETNA_Info\SetKey        = IsFunction(ETNA_hLib, "ETNA_SetKey")
    ETNA_Info\SetKeySend    = IsFunction(ETNA_hLib, "ETNA_SetKeySend")
    ETNA_Info\SetKeyReceive = IsFunction(ETNA_hLib, "ETNA_SetKeyReceive")
    ETNA_Info\Update        = IsFunction(ETNA_hLib, "ETNA_Update")
    ETNA_Info\Send          = IsFunction(ETNA_hLib, "ETNA__Send")
    ETNA_Info\NbOfQueuedCmd = IsFunction(ETNA_hLib, "ETNA_GetNumberOfCommandsInQueue")
    ETNA_Info\Cancel        = IsFunction(ETNA_hLib, "ETNA_Cancel")
    ETNA_Info\Receive       = IsFunction(ETNA_hLib, "ETNA_Receive")
    ETNA_Info\GetState      = IsFunction(ETNA_hLib, "ETNA_GetState")
    ETNA_Info\GetResult     = IsFunction(ETNA_hLib, "ETNA__GetResult")
    ETNA_Info\GetNbOfLines  = IsFunction(ETNA_hLib, "ETNA_GetNbOfLines")
    ProcedureReturn ETNA_hLib
  Else
    MessageRequester("Lib ETNA", "Lib ETNA introuvable !", #MB_ICONERROR)
  EndIf
EndProcedure
Procedure ETNA_SetServer( _url.s )
  CallFunctionFast(ETNA_Info\SetServer , _url)
EndProcedure
Procedure ETNA_Send( _key.l, _page.s )
  CallFunctionFast(ETNA_Info\Send , _key,  _page, #False, #False)
EndProcedure
Procedure ETNA_SendCrypted( _key.l, _page.s )
  CallFunctionFast(ETNA_Info\Send , _key,  _page, #True, #False)
EndProcedure
Procedure ETNA_GetNumberOfCommandsInQueue()
  ProcedureReturn CallFunctionFast(ETNA_Info\NbOfQueuedCmd)
EndProcedure
Procedure ETNA_Update()
  CallFunctionFast(ETNA_Info\Update)
EndProcedure
Procedure ETNA_Receive( _id.l )
  ProcedureReturn CallFunctionFast(ETNA_Info\Receive, _id )
EndProcedure
Procedure ETNA_GetState()
  ProcedureReturn CallFunctionFast(ETNA_Info\GetState)
EndProcedure
Procedure.s ETNA_GetResult()
  ProcedureReturn PeekS(CallFunctionFast(ETNA_Info\GetResult, -1))
EndProcedure
Procedure.s ETNA_GetRowResult( _index.l )
  ProcedureReturn PeekS(CallFunctionFast(ETNA_Info\GetResult, _index))
EndProcedure
Procedure ETNA_GetNbOfLines()
  ProcedureReturn CallFunctionFast(ETNA_Info\GetNbOfLines)
EndProcedure
Procedure ETNA_Finish()
  CloseLibrary(ETNA_hLib)
EndProcedure


  
;{ Test }

#Id_Test = 1

ETNA_Init("Etna.dll")
ETNA_SetServer("http://site.tempo.free.fr")
ETNA_Send(#Id_Test, "etna.php?opt=coucou")

While ETNA_GetNumberOfCommandsInQueue()
  ETNA_Update()
  If ETNA_Receive(#Id_Test)
    If ETNA_GetState() = #ETNA_OK
      Debug ETNA_GetResult()
    EndIf
  EndIf
Wend

ETNA_Finish()

;}