db-Funktionen statt MySQL-Modul

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • db-Funktionen statt MySQL-Modul

    Neu

    Moin,

    bin seit längerem nicht mehr aktiv und habe deshalb wohl nicht mitbekommen, was sich bezüglich MySQL geändert hat.

    Sehe ich das richtig? - Das MySQL-Modul von MTA ist nicht mehr aktuell, stattdessen wird jetzt mit dbConnect gearbeitet.
    Was ändert sich konkret im Script? Wie kann ich das Script möglichst schnell wieder ans Laufen bringen?
    Kann man alle MySQL-Abfragen einer "Sorte" einfach und schnell ersetzen?

    (Gibt es vielleicht schon einen Beitrag dazu? Habe auf die Schnelle nichts Brauchbares gefunden.)

    Gruß
    Die deutsche Sprache ist Freeware.
    Das heißt, du darfst sie uneingeschränkt nutzen. ABER(!) die deutsche Sprache ist NICHT(!) Open Source.
    Das heißt, du darfst sie NICHT(!) nach deinen Vorstellungen verändern!
  • Neu

    Ok, soweit verstanden.

    Welche Alternative gibt es jetzt zu ...?
    1. mysql_fetch_row
    2. mysql_fetch_assoc
    Die deutsche Sprache ist Freeware.
    Das heißt, du darfst sie uneingeschränkt nutzen. ABER(!) die deutsche Sprache ist NICHT(!) Open Source.
    Das heißt, du darfst sie NICHT(!) nach deinen Vorstellungen verändern!
  • Neu

    Naja, diese Funktionen liefern dir ja nur Reihe für Reihe zurück.

    Mit wiki.multitheftauto.com/wiki/DbPoll bekommste gleich dein Ergebnis geliefert.
    Kannst dann ja die Tabelle einfach mit einer Schleife durchgehen.

    LUA-Quellcode

    1. local result = dbPoll ( qh, -1 )
    2. if result then
    3. for _, row in ipairs ( result ) do
    4. -- by using a second loop (use it if you want to get the values of all columns the query selected):
    5. for column, value in pairs ( row ) do
    6. -- column = the mysql column of the table in the query-- value = the value of that column in this certain row
    7. end
    8. -- or without a second loop (use it if you want to handle every value in a special way):
    9. outputChatBox ( row["column"] ) -- it will output the value of the column "column" in this certain row
    10. end
    11. end
    Alles anzeigen




    LUA-Quellcode

    1. local result = mysql_query(handler, "SELECT * FROM account") -- Execute the query
    2. if (result) then
    3. while true do
    4. local row = mysql_fetch_assoc(result)
    5. if (not row) then break end
    6. outputDebugString(row["name"])
    7. end
    8. mysql_free_result(result) -- Free the result
    9. end
    Alles anzeigen


    Kommst somit auf quasi ähnliche Ergebnisse. In beiden Fällen ist in der Schleife die Variable "row" die aktuelle Reihe aus der Datenbank, die du dann über die Namen der Spalten "auslesen" kannst.
  • Neu

    Hier mal ein kleines beispiel:


    LUA-Quellcode

    1. local result = dbPoll ( dbQuery ( dbverbindung, "SELECT irgendwas FROM Tabelle1 Where Name=?",Spielername ), -1 )
    2. if result and result[1] then ---wenn ein eintrag da ist dann weiter
    3. outputChatBox(result[1]["irgendwas"])
    4. end
    so könnte man jetzt etwas aus der Datenbank abfragen,im Grunde ganz einfach.


    //

    Der einzige unterschied ist das man nicht mehr mit dbQuery Etwas in die Datenban einträgt oder updatet sondern mit dbExec
  • Neu

    [Hive]IDK schrieb:

    habe jetzt auch das Problem^^ also das ich alles mit dbconnect etc machen muss. aber ich komme net mit "mysql_num_rows" etc weiter

    Naja, man muss hier schon etwas umdenken, jedoch bekommt man ja über dbPoll ne Tabelle mit den Werten zurückgeliefert und muss nicht mehr jede Reihe einzeln abfragen.

    Ich denke mal, das macht das ganze etwas einfacher.

    Mysql Tutorial
    Hab hier aber auch nochmal ein Tutorial gefunden, welches ganz nützlich sein könnte.
  • Neu

    Strider schrieb:


    Der einzige unterschied ist das man nicht mehr mit dbQuery Etwas in die Datenban einträgt oder updatet sondern mit dbExec
    Das verstehe ich nicht. Ich kann doch auch mit dbQuery etwas in die Datenbank eintragen.
    Die deutsche Sprache ist Freeware.
    Das heißt, du darfst sie uneingeschränkt nutzen. ABER(!) die deutsche Sprache ist NICHT(!) Open Source.
    Das heißt, du darfst sie NICHT(!) nach deinen Vorstellungen verändern!
  • Neu

    Strider schrieb:

    Der einzige unterschied ist das man nicht mehr mit dbQuery Etwas in die Datenban einträgt oder updatet sondern mit dbExec
    Das stimmt absolut nicht. dbExec führt auch nur einen Query aus. Die Unterschied ist, dass er eben auch nur das macht. Er führt nur deinen Query aus, bekommst aber keinen Rückgabewert vom Datenbank Server. Die Funktion spuckt nur einen bool aus, und wenn der Query an den DB Server ging, bekommst du true zurück. So fallen Fehler (z.B. nicht existierende Tabelle) gar nicht auf und geben trotzdem true zurück.

    dbQuery/dbPoll bekommst du noch Infos, ob dein Query überhaupt erfolgreich war, wie viele Zeilen bearbeitet wurden oder was die lastInsertId war. Allerdings dauert das ganze auch minimal länger und läuft nicht Async.

    Es kommt also auf den Anwendungszweck an, was man benutzen möchte. Für Logs brauchst du zum Beispiel kein dbQuery und es ist sinnvoller dbExec zu nutzen, da MTA dann auch nicht auf eine Antwort vom Datenbank Server wartet.
    Anders sieht es aus wenn du z.B. ein Fahrzeug erstellst und die ID auf das Fahrzeug setzen möchtest. Da empfiehlt es sich, dbQuery zu nutzen, da du dort die lastInsertId bekommst.
    Das Problem hatte ich vor 3 Jahren nämlich schon mal gehabt, als ich mir darüber kaum Gedanken gemacht hatte^^ --> Script zu schnell für Datenbankverbindung (man beachte die Antwort von Sbx, der das ganze gut zusammenfasst)
  • Neu

    Gut erklärt @PewX.

    Was mich noch beschäftigt ist die Sicherheit:
    Bisher maskierte die Funktion mysql_escape_string() Strings zur sicheren Benutzung in Querys.
    Dafür ist jetzt offensichtlich dbPrepareString() zuständig. Die Argumente sind die DB-Verbindung sowie ein Query-String.
    Für meinen Zweck möchte ich allerdings lediglich einen einfachen String (-> Eingabe eines Users) maskieren - und eben keinen Query.
    Welche Option gibt es da?
    Die deutsche Sprache ist Freeware.
    Das heißt, du darfst sie uneingeschränkt nutzen. ABER(!) die deutsche Sprache ist NICHT(!) Open Source.
    Das heißt, du darfst sie NICHT(!) nach deinen Vorstellungen verändern!
  • Neu

    [BG]Tim schrieb:

    Bisher maskierte die Funktion mysql_escape_string() Strings zur sicheren Benutzung in Querys.
    Das kann dbQuery von sich aus schon wenn du die ? für die eingaben nutzt.

    Kleines Beispiel (das queryFetchSingle führt auch nur dbQuery aus)

    LUA-Quellcode

    1. board:queryFetchSingle("SELECT username, password, userID, email FROM wcf1_user WHERE username LIKE ?", username)