Mysql et Pure basic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Voila un exemple de code, fonctionne avec PB4b7.

Code : Tout sélectionner

; -------------------------------
; Petit exemple sur le SQL avec libmysql. Le code provient de divers sources (codes en VB 6 surtout).
; "biensur" si vous compilez tel quel, ca ne marchera pas puis ce que vous n'avez pas la meme base sql que moi ^^;
; Je n'ai pas commenté les commandes de la dll, tout simplement par ce qu'une tres bonne doc le fait à ma place ici:
;http://dev.mysql.com/doc/refman/5.0/fr/c-api-functions.html


#libmysql = 1

If OpenLibrary( #libmysql , "libmysql.dll" ) ;charger la dll et choper l'adresse des fonctions qui vont etre utiles à ce mini tut
  Global init = GetFunction( #libmysql , "mysql_init")
  Global close = GetFunction(#libmysql, "mysql_close")
  Global list_tables = GetFunction(#libmysql, "mysql_list_tables")
  Global real_connect=GetFunction(#libmysql,"mysql_real_connect")
  Global num_rows=GetFunction(#libmysql,"mysql_num_rows")
  Global fetch_row=GetFunction(#libmysql,"mysql_fetch_row")
  Global free_result=GetFunction(#libmysql,"mysql_free_result")
  Global query = GetFunction(#libmysql,"mysql_query")
  Global store_result = GetFunction(#libmysql,"mysql_store_result")
  Global real_query = GetFunction(#libmysql,"mysql_real_query")
  Global field_count = GetFunction(#libmysql,"mysql_field_count")
  Global affected_rows = GetFunction(#libmysql,"mysql_affected_rows")
  Global num_fields = GetFunction(#libmysql,"mysql_num_fields")
  Global num_rows = GetFunction(#libmysql,"mysql_num_rows")
  Global fetch_row = GetFunction(#libmysql,"mysql_fetch_row")
  Global fetch_lengths = GetFunction(#libmysql,"mysql_fetch_lengths")
  
  dbHnd = CallCFunctionFast(init,0)
  
  If dbHnd = 0
    MessageRequester("Erreur","Impossible d'initialiser la connection", #PB_MessageRequester_Ok)
    End
  EndIf
Else
  MessageRequester("Erreur","Impossible de charger libmysql.dll", #PB_MessageRequester_Ok)
  End
EndIf


Procedure.s GetError(db_ID) ; permet de choper l'erreur revoyée par la DB.
  Errormsg.s
  If CallFunction(#libmysql,"mysql_errno",db_ID) > 0
    *Error =CallFunction(#libmysql,"mysql_error",db_ID)
    i=-1
    Repeat
      i=i+1
      Errormsg=Errormsg+PeekS(*Error+i,1)
    Until PeekB(*Error+i)=0
    MessageRequester("Sql a renvoyé une erreur", Errormsg, #PB_MessageRequester_Ok)
    Debug Errormsg
  EndIf
EndProcedure

; Entrez les infos sur votre base sql (là, c'est celles par défaut de Easy PHP)
IPsql$ = "127.0.0.1"
user$ ="root"
pass$ =""
portsql =0
pipe$ =""
conconf =0


;Se connecter à la base de donnée est tres simple!
If CallFunctionFast(real_connect,dbHnd, IPsql$, user$, pass$, "nomdelabase", portsql, pipe$, conconf) = 0
  GetError(dbHnd)
EndIf

;Maintenant, un exemple pour chopper des données:
ID$= "poshu"
MDP$ = "motdepass"
SQL$ = "SELECT ID, email, sex, access_lvl, realname FROM tbl_account WHERE Login = '"+ ID$ +"' AND Pass = '"+ MDP$ +"'" ;ca c'est la requete en SQL j'ai mis des variables pour vous montrer à quel point c'est facil & pratique.

If CallFunctionFast(real_query, dbHnd, SQL$, Len(SQL$)) ;note c'est un peu bizzare, mais real_query renvoie 0 QUAND ELLE MARCHE et des infos QUAND ELLE NE MARCHE PAS. Je suis resté bloqué comme un con à cause de ca xD
  GetError(dbHnd)
Else
  
  *mysqlResult=CallFunctionFast(store_result,dbHnd)
  If *mysqlResult=0
    If CallFunctionFast(field_count,dbHnd)
      GetError(dbHnd)
    Else
    EndIf
  Else
    affRows   = CallFunctionFast(affected_rows,dbHnd)
    If affRows > 0
      *mysqlRow=CallFunctionFast(fetch_row,*mysqlResult)
      *mysqlLen=CallFunctionFast(fetch_lengths,*mysqlResult)
      
      For boucle = 0 To 4 ;ici, le seul piege, c'est qu'il faut peekL puis peeks... :/
        length=PeekL(*mysqlLen+4*(boucle))
        fieldptr=PeekL(*mysqlRow+4*(boucle))
        If fieldptr>0
          content.s=PeekS(fieldptr,length)
        Else
          content="NULL"
        EndIf
        Debug content
      Next boucle
    Else
      Debug "rien"
    EndIf
  EndIf
EndIf
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Merci m'sieur :D
Anonyme

Message par Anonyme »

Merci, je vais étudier cela.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Pour tester les requêtes SQL on peut aussi utiliser la lib MDB dispo ici : http://www.reelmedia.org/pureproject/ar ... DB_Lib.zip

Cela permet d'accéder à des base Access.

Voici le code d'exmple fourni avec pour créer une table :

Code : Tout sélectionner

curdir.s=Space(250)
GetCurrentDirectory_(250,@curdir)
If Right(curdir,1)<>"\":curdir+"\":EndIf


MDB_Create(curdir+"Test")
db=MDB_Connect(curdir,"Test","","")

If db
  qry$="Create table Info(id autoincrement,name text(100),phone text(50),constraint Info unique(id));"
  If DatabaseQuery(qry$) 
    DatabaseQuery("Insert into Info(name,phone)values('Paul','555-1234')")
    DatabaseQuery("Insert into Info(name,phone)values('Fred','555-0098')")
    DatabaseQuery("Insert into Info(name,phone)values('Joey','555-4455')")
    Else
    Debug "Data already exists"
  EndIf
 
 
  If DatabaseQuery("Select * from Info order by name asc;")
    While NextDatabaseRow()
      Debug Str(GetDatabaseLong(0))+": "+GetDatabaseString(1)+" ..."+GetDatabaseString(2)
    Wend
  EndIf
  
  CloseDatabase(db)
EndIf

MDB_Disconnect("Test")
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Merci poshu sa a l'air super simple ton code :P
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Re poshu,

Pour la connexion a mysql je comprend maintenant, par contre a partir de ";Maintenant, un exemple pour chopper des données:" je capte plus rien...

Y a t'il moyen d'avoir des petites explication ? :oops:
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Voui:

déjà, je crée la requete SQL à faire executer par la table (en l'occurence, envois moi les données des collones email, sex, access lvl & real name, là ou ID = poshu et MDP = motdepasse)
Apres quoi je l'envoie à la base grace à la commande mysql_real_query (voir la doc fournie).
Si la requete est correctement executé, je vérifie si il y a des résultats grace à la fonction mysql_store_result.
Le cas échéant, je les récuperes & les transformes. (j'ai mis des sécurités mais elles ne sont pas obligatoire)

S'tout con.
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Haaaa ok merci ! c'est plus clair comme sa, je t'en remercie :D
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Salut,

Je ne comprend pas, il me dit tout le temp
La table 'projet1.tbl_account' n'existe pas
Alors que la table projet1 existe bel et bien, d'où vient le problème ?

Merci d'avance pour votre aide.

P.S.: le code na pas été modifier, juste le nom de la table, et la liste des champ a aller rechercher.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

uh?
j'en ai aucune idée (je touche pas grand chose en sql).
Si le probleme tiens toujours, contactes moi par msn; je te filerais un coup de main.
Répondre