MySQL

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Jolinah

Betreff: MySQL

BeitragSa, Aug 27, 2005 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich hab mal ein kleines MySQL Modul geschrieben Wink
Wollte eigentlich direkt die originale Lib einbinden aber irgendwie gabs in BMax Probleme bei mysql_close() weshalb ich dann noch ne eigene c++ Wrapper-Lib für paar Befehle geschrieben habe und diese nun in BMax einbinde. Folglich werden 2 DLLs benötigt.


Download:
http://zehr.de/blitz3d/libmysql.zip

Hinweise:
- Umlaute und andere Zeichen werden noch nicht richtig umgewandelt.
- Um zu einer Datenbank verbinden zu können muss diese externe Verbindungen erlauben!


Eine Beispielanwendung:
Code:
Strict

Import pub.libmysql

MYSQL.Connect("host.net", "user", "password", "database")

Local res:MYSQL_RES = MYSQL.Query("SELECT * FROM news")

If res <> Null

   For Local x = 0 To res.Rows-1
      For Local y = 0 To res.Fields-1
         Print res.Row[x,y]
      Next
   Next

EndIf

MYSQL.Query("DELETE FROM news WHERE username='Jolinah'")

MYSQL.Close()

End



Code des Moduls:
Code:
Strict

Module pub.libmysql

Import "pub_mysql.a"
Import brl.retro

Extern
   Function MySQL_Init()
   Function MySQL_Connect(mysql, host$z, user$z, passwd$z, db$z, port)
   Function MySQL_Close(mysql)
   Function MySQL_Query(mysql, query$z)
   Function MySQL_Num_Rows(res)
   Function MySQL_Num_Fields(res)
   Function MySQL_Fetch_Row:Byte Ptr Ptr(res)
   Function MySQL_Fetch_Lengths:Int Ptr(res)
   Function MySQL_Free_Result(res)
End Extern


Type MYSQL_RES
   Field Rows:Int
   Field Fields:Int
   Field Row:String[,]
End Type

Type MYSQL

   Global _mysql
   Global _res
   Global row:Byte Ptr Ptr
   Global lengths:Int Ptr
   
   Function Init()
      _mysql = MySQL_Init()
   End Function
   
   Function Connect:Byte(host:String, user:String, passwd:String, db:String, port:Int = 0)
      Local mysql = MySQL_Connect(_mysql, host, user, passwd, db, port)
      If mysql <> 0 And mysql = _mysql
         Return True
      EndIf
      
      Return False
   End Function
   
   Function Query:MYSQL_RES(query:String)
      Local _res = MySQL_Query(_mysql, query)
      
      If _res <> 0
         Local num = MySQL_Num_Rows(_res)
         If num = 0 Then Return Null
         
         Local mres:MYSQL_RES = New MYSQL_RES
         mres.Rows = num
         mres.Fields = MySQL_Num_Fields(_res)
         mres.Row = New String[mres.Rows, mres.Fields]
         
         row = MySQL_Fetch_Row(_res)
         lengths = MySQL_Fetch_Lengths(_res)
         Local value:String
         Local i, x, c
         
            
         While row <> Null
            For i = 0 To mres.Fields-1
               value = ""
               For x = 0 To lengths[i]
                  value :+ Chr(row[i][x])
               Next
               mres.Row[c, i] = Replace(value, "~0", "")
            Next               
            
            row = MySQL_Fetch_Row(_res)
            lengths = MySQL_Fetch_Lengths(_res)            
            c :+ 1
         Wend

         MySQL_Free_Result(_res)
         _res = 0
         row = Null
         lengths = Null

         Return mres
      EndIf

      Return Null   
   End Function
   
   Function Close()
      If _mysql <> 0 Then
         MySQL_Close(_mysql)
         _mysql = 0
      EndIf
   End Function

End Type

MySQL.Init()
 

Nemesis

BeitragSa, Aug 27, 2005 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
naja ist aber doch etwas nervig wenn man dann immer zwei dll's mitliefern muss. die libmysql kann man doch sicher auch static linken, dann ist alles im modul und man muss keine dll's mitliefern.

Suco-X

Betreff: ........

BeitragSa, Aug 27, 2005 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Denke auch das eine weitere Wrapper DLL als Problemlösung etwas Faul und ungeeignet ist.
Aber sonst gute Idee, kann man gut gebrauchen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

bruZard

BeitragSa, Aug 27, 2005 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Finde ich ausgesprochen gefährlich die Zugangsdaten einer Datenbank mit einer Exe zu liefern. Da bleibe ich lieber bei der Brücke über ein PHP Script.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jolinah

BeitragSa, Aug 27, 2005 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich versuch es nochmal mit der statischen Lib. Aber irgendwie konnte ich die Lib nicht gescheit einbinden... oder soll ich das ganze lieber lassen? Bruzard hat da schon recht.. das ganze ist eigentlich nur brauchbar wenn man die Daten dynamisch eingibt.

Blacal

BeitragSa, Aug 27, 2005 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus

Würd ich nicht sagen. Kommt halt drauf an, was man in der DB speichert. Wenn man irgendwelche einfache Spieldaten (wie z. B. Terrainsets, Mapdaten oder sowas) in der DB speichert, ist es egal, wenn andere auch drauf zugreifen könnten. Einfache Dateien liegen ja schließlich auch offen da. Nur is da ne DB einfacher zu bedienen.

Nur wenn man so auf Highscores oder sowas, is der weg über PHP besser.

Jolinah

BeitragSa, Aug 27, 2005 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kriegs nur irgendwie nicht hin die Sache statisch einzubinden. Habs schon mit dem Source direkt versucht:

Code:
Import "libmysql.c"

Extern
Function mysql_init(mysql)
End Extern


Alle .c und .h files in den Modulordner kopiert. Aber da kommt immer undefined reference wenn ich ne Funktion aufrufen will. Habs schon mit Namen wie "_mysql_init@4" und "mysql_init@4" versucht aber auch das wollte nicht. Hab auch verschiedene Calling Conventions getestet...

Danach hab ich es nochmal mit der .lib versucht, scheint ja auch zu funktionieren rein vom kompilieren her. Aber auch da war wieder das Problem mit undefined reference. Aber wenn man sich die Lib oder die Dll anschaut sieht man z.Bsp. die Definition "_mysql_init@4".

Hat einer ne Ahnung was ich falsch mach? Wink

regaa

BeitragSa, Aug 27, 2005 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, so n direktes Modul ohne Wrapperumwege wäre schon genial.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

M@tzM@N

BeitragDo, Nov 24, 2005 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
In der installation.txt steht
Code:
Den Ordner libmysql.mod in den BlitzMax\mods\pub.mod\ Ordner kopieren und
anschliessend das Modul kompilieren lassen.

Habe libmysql.mod dorthin kopiert, aber wie kompiliere ich das Modul?
mfg
M@tzM@N

Du bist Deutschland

d-bug

BeitragDo, Nov 24, 2005 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Lade dir mal die *.bmx Datei mit der IDE.
Jetzt drücke STG+D ab version 1.12 und ALT+D bei den vorherigen Versionen. Dann werden alle geänderten oder nicht kompilierten Module kompiliert.

greetz
 

M@tzM@N

BeitragDo, Nov 24, 2005 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, habe ich gemacht und hat auch funktioniert, aber wenn ich jetzt das Beispielprojekt von Jolinah starte dann kommt dieser Fehler Sad
Code:

Compile Error: Can't find interface for module 'pub.libmysql'
mfg
M@tzM@N

Du bist Deutschland

d-bug

BeitragDo, Nov 24, 2005 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
da bin ich nun leider überfragt Sad ... sorry

bruZard

BeitragDo, Nov 24, 2005 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
[at] M@tzM@N

Da Du noch Anfänger in BMax bist gehe ich ganz stark davon aus dass Du weder MinGW installiert hast, noch dass Du die entsprechenden Umgebungsvariablen gesetzt hast.

Gucke Dir die entsprechenden Geschichten im bb.com Forum an:
http://www.blitzmax.com/Commun...opic=53442
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jolinah

BeitragDo, Nov 24, 2005 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das sieht so aus als ob es nicht korrekt kompiliert wurde oder dann ist der Ordner oder die bmx Datei falsch benannt. Der Ordner muss libmysql.mod heissen und die bmx-Datei darin libmysql.bmx.

PS: Wenn ich wiedermal etwas Zeit finde versuch ich wie gesagt das ganze noch statisch einzubinden. Der Umweg über 2 DLLs ist schon etwas doof. Ausserdem hatte ich ursprünglich geplant, wenn das mit dem statischen einbinden klappt, die Lib zu erweitern, so dass alles einfacher zu handhaben ist. Das Hauptproblem bleibt jedoch noch bestehen: Die Sicherheit mit dem Login. So eignet es sich eigentlich nur für Clients wo das Login während der Laufzeit eingetippt wird oder öffentliche Datenbanken mit unsensiblen Daten.
 

M@tzM@N

BeitragSo, Nov 27, 2005 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So habe es jetzt richtig kompiliert, aber es kommt trotzdem noch ein Fehler bei deinen Beispielprogramm Sad

Code:

Compiling:mysql.bmx
Compile Error: File 'G:/Projekte/mysql/pub_mysql.a' not found


Und dann gibt es da diese Datei libmysql.debug.win32.i;2;21

Code:
import brl.blitz
import "pub_mysql.a"
import brl.retro
MySQL_Init()="MySQL_Init"
MySQL_Connect(mysql,host$z,user$z,passwd$z,db$z,port)="MySQL_Connect"
MySQL_Close(mysql)="MySQL_Close"
MySQL_Query(mysql,query$z)="MySQL_Query"
MySQL_Num_Rows(res)="MySQL_Num_Rows"
MySQL_Num_Fields(res)="MySQL_Num_Fields"
MySQL_Fetch_Row@**(res)="MySQL_Fetch_Row"
MySQL_Fetch_Lengths*(res)="MySQL_Fetch_Lengths"
MySQL_Free_Result(res)="MySQL_Free_Result"
MYSQL_RES^Object{
.Rows&
.Fields&
.Row$&[,]&
-New()="_pub_libmysql_MYSQL_RES_New"
-Delete()="_pub_libmysql_MYSQL_RES_Delete"
}="pub_libmysql_MYSQL_RES"
MYSQL^Object{
_mysql&=mem("_pub_libmysql_MYSQL__mysql")
_res&=mem("_pub_libmysql_MYSQL__res")
row@**&=mem:p("_pub_libmysql_MYSQL_row")
lengths*&=mem:p("_pub_libmysql_MYSQL_lengths")
-New()="_pub_libmysql_MYSQL_New"
-Delete()="_pub_libmysql_MYSQL_Delete"
+Init()="_pub_libmysql_MYSQL_Init"
+Connect@(host$,user$,passwd$,db$,port=0)="_pub_libmysql_MYSQL_Connect"
+Query:MYSQL_RES(query$)="_pub_libmysql_MYSQL_Query"
+Close()="_pub_libmysql_MYSQL_Close"
}="pub_libmysql_MYSQL"


// EDIT : Habe die pub_mysql.a mal in das Projekt-Verzeichniss kopiert, dann wird das Programm ausgeführt, aber es werden nicht die Aktionen aus deinem Beispielprogramm ausgeführt (und ja ich habe die Daten an meine Datenbank angepasst)
mfg
M@tzM@N

Du bist Deutschland

Lunatix

BeitragMi, Jan 24, 2007 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu.

Cooles Modul das danke dafür (:

Eine kleine Anmerkung, die alle versuchen damit einen Server zuschreiben und das auf dem Webserver versuchen zu starten und nen Rappel kriegen weils einfach nich geht "Could not connect to the Database" : es funktioniert (auf meinem Root sowie VServer mit Debian 3.1 Sarge) _nicht_ mit "localhost" (mit xampp auf meinem rechner mit Linux und bei nem freund mit Linux geht es).

Stattdessen geht aber "127.0.0.1"

mfg JP
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...
 

Ticha

BeitragMi, Feb 07, 2007 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
cooles Modul, muss ich bei mir mal ausprobieren. Genau das was ich brauche. Nur leider das mit der DLL :-I
nicht gerade Linux freundlich.

Jolinah

BeitragDo, Feb 08, 2007 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Wink

Es gibt jedoch schon ein neueres Modul. Das hier war der erste Versuch. Das zweite müsste auch unter Linux laufen und es wurde von Vertex noch etwas verbessert:

https://www.blitzforum.de/foru...hp?t=18153

Lunatix

BeitragDo, Feb 08, 2007 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses hier läuft doch auch unter linux ^^
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Jolinah

BeitragDo, Feb 08, 2007 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, kann sein Wink Hab evtl. mal den Downloadlink angepasst an das neuere Modul. Ich weiss nur dass die modifizierte Version von Vertex die neuste/beste ist.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group