Page 1 sur 2

Acceder à une BDD MySQL Free depuis un programme purebasic

Publié : mer. 31/oct./2007 12:02
par Kayne
Bonjour à tous,

Je voudrais créer un programme qui puisse m'afficher les entrées de ma BDD sur sql.free.fr.

Avec la libmysql.dll on peut faire quelquechose avec localhost et Wamp mais quand j'essaye avec "sql.free.fr" ca marche pas.

J'ai aussi vu des trucs sur ETNA mais j'ai pas vraiment compris l'utilisation.
Si quelqu'un pouvait m'aider ? Je lui serait très reconnaissant :D

Publié : mer. 31/oct./2007 16:29
par pastor
Bonjour Kayne,

Je connais bien MySQL et ca marche fantastiquement bien avec Purebasic et pourtant avec Purebasic je suis le roi des débutant.

Si tu veux faire un essai sans te prendre la tête :

1. Récupère sur Internet EasyPHP ou mieux XAMP
2. En 30 secondes c'est installé
3. Copie la librairie libmysql.dll qui se trouve dans le répertoire d'installation de Xampp, d'EasyPHP ou de la distrib que tu as choisi vers le répertoire ..\Purebasic\Compilers
4. Fait un essai de connexion avec ton navigateur sur le serveur MySQL avec l'appli PhpmyAdmin, généralement l'adresse est : http://127.0.0.1/phpmyadmin
5. Toujours dans PhpMyAdmin, crée une table ma_table dans la base test pour faire tes tests justement.
6. Utilise ce code que j'ai pompé sur le forum :

Code : Tout sélectionner

#libmysql = 1 

host.s    = "127.0.0.1" 
user.s    = "root" 
passwd.s  = "" 
db.s      = "test" 
port.l    = 3306 

dbHnd.l 
SQL.s 
row.s 
i.l 
j.l 
affRows.l 
fieldNum.l 
rowsNum.l 

Procedure.s GetError(db_ID,requester) 
  
  Protected Errormsg.s, i.l, Error.l 
  
  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 
    If requester 
      Result= MessageRequester("MySQL error",Errormsg,#PB_MessageRequester_Ok) 
    EndIf 
  EndIf 
  
  ProcedureReturn Errormsg 
  
EndProcedure 



If OpenLibrary(#libmysql,"libmysql.dll") 
  Result=CallFunction(#libmysql,"mysql_init",dbHnd) 
  If Result 
    dbHnd = Result 
    If CallFunction(#libmysql,"mysql_real_connect",dbHnd, host, user, passwd, db, port, "", 0) = 0 
      GetError(dbHnd,1) 
    Else 
      CallDebugger 
      SQL = "SELECT * FROM ma_table" 
      If CallFunction(#libmysql,"mysql_real_query", dbHnd, SQL, Len(SQL)) 
        GetError(dbHnd,1) 
      Else 
        *mysqlResult=CallFunction(#libmysql,"mysql_store_result",dbHnd) 
        
        ;no result returned 
        If *mysqlResult=0 
          ;no fields returned means error 
          If CallFunction(#libmysql,"mysql_field_count",dbHnd) 
            GetError(dbHnd,1) 
            ;fields are returned, so no error but query didn't return data 
          Else 
            
          EndIf 
          ;results are returned 
        Else 
          
          
          affRows   = CallFunction(#libmysql,"mysql_affected_rows",dbHnd) 
          fieldNum  = CallFunction(#libmysql,"mysql_num_fields",*mysqlResult) 
          rowsNum   = CallFunction(#libmysql,"mysql_num_rows",*mysqlResult) 
          
          Debug affRows 
          Debug fieldNum 
          Debug rowsNum 
          
          
          For i=1 To rowsNum 
            *mysqlRow=CallFunction(#libmysql,"mysql_fetch_row",*mysqlResult) 
            *mysqlLen=CallFunction(#libmysql,"mysql_fetch_lengths",*mysqlResult) 
            
            row = "" 
            
            ;length of given field 
            For j=1 To fieldNum 
              length=PeekL(*mysqlLen+4*(j-1)) 
              fieldptr=PeekL(*mysqlRow+4*(j-1)) 
              If fieldptr>0 
                content.s=PeekS(fieldptr,length) 
              Else 
                ;zero pointer returend means empty field 
                content="NULL" 
              EndIf 
              row = row + content + ";" 
            Next j 
            
            Debug row 
            
          Next i 
          Result.l=CallFunction(#libmysql,"mysql_free_result",*mysqlResult) 
        EndIf 
      EndIf 
    EndIf 
  EndIf 
Else 
  MessageRequester("Error!", "Couldn't open the libmysql.dll!") 
EndIf
 


Le plus important c'est cette ligne : SQL = "SELECT * FROM ma_table" c'est la que tu mets toutes les commandes que tu veux faire sur tes données.

Cerise sur le gateau, ta base est simultanément accessible depuis ton appli Purebasic et sur Internet avec le navigateur

Concernant sql.free.fr, visiblement c'est uniquement l'interface web de free pour utiliser phpmyadmin et gérer ta base.

J'ai moi aussi un compte chez Free et je ne suis pas arrivé à me connecter depuis Pure dessus (Les connexions externes ne sont peut être pas autorisé chez Free ?!

Voila, si pour une fois je peux aider quelqu'un sur ce forum...

Laurent

Publié : mer. 31/oct./2007 16:47
par lionel_om
ETNA, c'est super simple. Je l'est utilisé pour un projet et ça marche nickel.

Tu ne peux pas accédez à ta BDD Free depuis autre chose qu'une page sur leurs serveurs.
Donc en fait, le principe est d'avoir une page (en PHP par exemple) qui va réceptionner et exécuter les requêtes que tu va lui envoyer via ETNA.
Via un ECHO en PHP par exemple tu vas récupérer dans PB, les logs que tu veux renvoyer. ETNA sert donc à simplifier l'appel de la page (en y passant des arguments) et à récupérer les données résultants de cet appel.

Par contre,j il faut que tout soit programmer dans ta page PHP pour modifier ou lire dans ta BDD. Tu peux alors t'arranger pour renvoyer un flux XML pour plus de simplicité de lecture (si tu veux récupérer des gros volumes de données), sinon une réponse bien structurée suffit.

J'espère t'avoir aidé.
Lio :wink:

Publié : mer. 31/oct./2007 23:36
par Kayne
Merci de vos réponses.

Lionel_OM tu a l'air de bien t'y connaitre ac ETNA tu pourrait me montrer un petit exemple. Code purebasic, Code php, ou placer la page dans le serveur, que faut il placer dans Purebasic/compilers etc.

Merci a toi aussi pastor, mais je connaissait déja ton code et il ne marche pas ac FREE.

Publié : jeu. 01/nov./2007 10:36
par lionel_om
Si tu as bien télécharger le programme depuis http://repeatuntil.free.fr/Etna/ tu as un dossier Doc où tu as tout le nécessaire.

Mais grossomodo il suffit de faire une boucle :

Code : Tout sélectionner

#Etna_Send_Id = 1 ; Id d'un process (car on peut appeler plusieurs pages simultanément
FileToCall$ = "score.php?id=blabla&sort=true" ; nom de la page PHP depuis la racine du site (définie par ETNA_SetServer())


ETNA_Initialise()
ETNA_SetServer("http://mon-serveur.free.fr/")


ETNA_Send(#Etna_Send_Id, FileToCall$)
While ETNA_GetNumberOfCommandsInQueue()
  ETNA_Update()
  If ETNA_Receive(#Etna_Send_Id)
    ; Test des données
    If ETNA_GetState() = #ETNA_OK
      msg$ = ETNA_GetResult()
    Else
      msg$ = "Erreur lors de la réception des données !!!"
    EndIf
  EndIf
Wend

Debug msg$
; affiche tout ce qui aura été généré avec un Echo/Print/Header par ta page PHP
Ta page PHP peut ensuite ressembler à ça :

Code : Tout sélectionner

<?php
// File : score.php

if(isset($_GET['id']))
{
	$sort = FALSE;
	switch( $_GET['sort'] )
	{
		case 1: case "1": case "yes": case "true": $sort = TRUE;
	}
	if($row = $bd->getOneRow("SELECT * FROM `table1` WHERE id='".$_GET['id']."'"
		.($sort ? " ORDER BY SortKeyItem" : "") ))
	{
		echo '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>'."\n"
			."<item>\n"
			."\t<nom>".$row->nomItem."</nom>\n"
			."\t<desc>".$row->descItem."</desc>\n"
			."\t<prix>".$row->prixItem."</prix>\n"
			."</item>\n";
	}
	else
	{
		echo "Item not found !";
	}
}
else
{
	echo "ID is missing !";
}

?>
PS : j'utilise la classe de ce topic : http://www.purebasic.fr/french/viewtopic.php?t=6181

Si t'as des questions, n'hésite pas
Lio :wink:

Publié : jeu. 01/nov./2007 10:46
par Kayne
Merci de ton aide Lionel,

Mais le probleme c'est que quand je tape

Code : Tout sélectionner

ETNA_Initialise()
Purebasic me renvoie : etna-initialise() is not a function, an array, or a linked list. Que faut il faire pour éviter cette erreur? (J'ai le dossier ETNA sur mon disque dur et le fichier ETNA.dll ds Purebasic/compilers)

Publié : jeu. 01/nov./2007 10:51
par lionel_om
Kayne a écrit :Merci de ton aide Lionel,

Mais le probleme c'est que quand je tape

Code : Tout sélectionner

ETNA_Initialise()
Purebasic me renvoie : etna-initialise() is not a function, an array, or a linked list. Que faut il faire pour éviter cette erreur? (J'ai le dossier ETNA sur mon disque dur et le fichier ETNA.dll ds Purebasic/compilers)
Lis bien les directives. T'as deux fichiers à copier/coller et sans doute aussi l'appel à une DLL pour récupérer les fonctions (vrai dans la version que j'ai utilisée, peut-être plus maintenant). Puis faut que tu fermes/réouvre l'éditeur PB.

Lio

Publié : jeu. 01/nov./2007 11:00
par Kayne
ok, Merci bcp Lionel :D :D

Les fonctions ont l'air de marcher, si j'ai encore des problemes, je viendrais te reposer des questions.

Encore merci

Publié : jeu. 01/nov./2007 11:19
par Kayne
Déja un nouveau un nouveau probleme, lorsque je compile l'exemple pour purebasic, j'ai un message d'erreur:
The following purelibrary is missing: object.

Est-ce que qu'elqu'un sais ou je trouve cette library?

Publié : jeu. 01/nov./2007 11:53
par lionel_om
Kayne a écrit :Déja un nouveau un nouveau probleme, lorsque je compile l'exemple pour purebasic, j'ai un message d'erreur:
The following purelibrary is missing: object.

Est-ce que qu'elqu'un sais ou je trouve cette library?
Je viens de tester l'exemple "ETNA_HighScore.pb" et il marche très bien.
Lio

Publié : jeu. 01/nov./2007 12:00
par Kayne
Moi je le teste à l'instant et ca ne marche pas,
Toujours ce message d'erreur : The following purelibrary is missing : object :(

Je vois pas comment faire pour résoudre ce pb ..
Même si je retelecharge, ca change rien

Publié : jeu. 01/nov./2007 12:11
par lionel_om
T'as quelle version de PB ? c'est une version démo ?

Publié : jeu. 01/nov./2007 14:44
par Kayne
Non j'ai la version 3.94

Publié : jeu. 01/nov./2007 15:24
par comtois
et pourquoi tu ne télécharges pas la 4.10 sur ton compte ??

Publié : jeu. 01/nov./2007 15:29
par Ar-S
La 4.10 est finalisée ? 8O 8O 8O