MySQL
Übersicht

![]() |
JolinahBetreff: MySQL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Ich hab mal ein kleines MySQL Modul geschrieben ![]() 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: [AUSKLAPPEN] 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: [AUSKLAPPEN] 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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-XBetreff: ........ |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kriegs nur irgendwie nicht hin die Sache statisch einzubinden. Habs schon mit dem Source direkt versucht:
Code: [AUSKLAPPEN] 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? ![]() |
||
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
In der installation.txt steht
Code: [AUSKLAPPEN] 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OK, habe ich gemacht und hat auch funktioniert, aber wenn ich jetzt das Beispielprojekt von Jolinah starte dann kommt dieser Fehler ![]() Code: [AUSKLAPPEN] Compile Error: Can't find interface for module 'pub.libmysql' |
||
mfg
M@tzM@N Du bist Deutschland |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
da bin ich nun leider überfragt ![]() |
||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
[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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So habe es jetzt richtig kompiliert, aber es kommt trotzdem noch ein Fehler bei deinen Beispielprogramm ![]() Code: [AUSKLAPPEN] 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: [AUSKLAPPEN] 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso, kann sein ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group