Utilisation BD mysql sans ODBC

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Hableur
Messages : 14
Inscription : dim. 03/sept./2006 17:35

Utilisation BD mysql sans ODBC

Message 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]
Hableur, bleubite en PB.
Hableur
Messages : 14
Inscription : dim. 03/sept./2006 17:35

Message 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]
Hableur, bleubite en PB.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui ya moyen de faire bcp plus simple.
je te montrerais un exemple si j'ai le temps ce soir.
Image
Hableur
Messages : 14
Inscription : dim. 03/sept./2006 17:35

Message par Hableur »

Quand tu veux, y a pas le feu, mais ça m'intéresse.

Merci :)
Hableur, bleubite en PB.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Image
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Dernière modification par lionel_om le mer. 27/sept./2006 10:24, modifié 2 fois.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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()

;}
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre