MySql daten abfragen und ändern mit php

  • PHP

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von der_Freezey.

    MySql daten abfragen und ändern mit php

    Jo Leute!

    Ich bin auch mal wieder da und habe auch gleich ein Problem mitgebracht :D

    Damit ihr es Besser versteht:
    Ich Programmiere in vb.net zur zeit ein kleines Online Spiel, es ist jetzt keine große Sache.
    Und das spiel beinhaltet eine LogIn Funktion (MySql) und die einzelnen Spieler haben dann sowas wie Credits um sich etwas Ingame zu kaufen.

    Nun ja, aber das ist ja jetzt nicht so ganz wichtig...

    Ich bin in Sachen vb.net ja kein Noob und weiß das es gefährlich ist Passwörter in Klartext im Code zupacken, auch wenn man ein Anti Decompiler benutzt!
    Aber in Sachen php bin ich dann doch wieder ein Noob... (Was sagte mein Mathe Lehrer mal zu mir Learning by Doing)

    Ich habe eine *.php datei auf mein Webspace die eine Verbindung zur MySql datenbank herstellt (z.Z. noch alles mit xampp also Localhost), und eine weiter die dann das Anmelden und die Registrierung Managet.

    Die db.php um eine Verbindung herzustellen:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. $host = "127.0.0.1";
    3. $user = "root";
    4. $pass = "root";
    5. $data = "mwtg";
    6. $con = new mysqli($host, $user, $pass, $data);
    7. if($con->connect_errno)
    8. {
    9. printf("Connect failed: %s/n", $con->connect_error);
    10. }


    Die handler.php die das ganze andere managet:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. include('db.php');
    3. $action = $_GET['action'];
    4. $username = $con->real_escape_string($_GET['username']);
    5. $mail = $con->real_escape_string($_GET['mail']);
    6. $ban = $con->real_escape_string($_GET['ban']);
    7. $password = $con->real_escape_string(md5($_GET['password']));
    8. if(!$action)
    9. {
    10. echo "Please enter an action.";
    11. }
    12. else
    13. {
    14. if($action == "register")
    15. {
    16. if($query = $con->query("INSERT INTO users (username,password,email,ban) VALUES ('$username','$password','$mail','$ban')"))
    17. {
    18. echo "1";
    19. }
    20. else
    21. {
    22. echo "0";
    23. }
    24. }
    25. else if($action == "login")
    26. {
    27. $query = $con->query("SELECT * FROM users WHERE username = '$username' and password = '$password'");
    28. $cnt = $query->num_rows;
    29. if($cnt > 0)
    30. {
    31. echo "1";
    32. }
    33. else
    34. {
    35. echo "0";
    36. }
    37. }
    38. else
    39. {
    40. echo "Invalid action.";
    41. }
    42. }
    43. ?>


    Ich denke mal die PHP Profis Unter euch wissen was ich da fabriziert habe, und soviel wie da steht weiß ich auch noch...
    Nur wem es schon aufgefallen ist... Man kann 2 Benutzer mit den Gleichen Namen erstellen, was natürlich kritisch ist!
    Aber bei diesen einem Problem kann es ja leider nicht bleiben X(

    Wie frag ich denn später die "Credits" eines Users ab, und wie kann ich die ggf. ändern, falls ein User etwas kauf oder dazu verdient?

    Bevor ich gleich gesteinigt werde weil bei der db.php, das MySql Passwort im Klartext steht, wie kann man das denn sicherer machen, falls es eine Lösung dafür gibt? Schließlich muss irgendwo doch das Password als Klartext stehen, oder nicht?

    *Topic verschoben*
    MfG, Martin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    der_Freezey schrieb:

    Man kann 2 Benutzer mit den Gleichen Namen erstellen, was natürlich kritisch ist
    Dann musst Du eben vorher noch abfragen, ob dieser Benutzer schon in der Datenbank vorhanden ist. Das ist ja ein einfaches ​SELECT mit den zu prüfenden Daten und dann auswerten in PHP.

    der_Freezey schrieb:

    Wie frag ich denn später die "Credits" eines Users ab, und wie kann ich die ggf. ändern, falls ein User etwas kauf oder dazu verdient?
    Das ist ja mehr eine Schemasache statt PHP-spezifisch. Da musst Du Dir halt ein passendes Schema ausdenken. Ich weiß natürlich jetzt nicht, wie Deine ​users-Tabelle aussieht und was die weiteren Anforderungen sind, aber jetzt so nach dem Text klingt das recht simpel nach einer Tabelle c​redits, die halt den Primärschlüssel von ​users als Fremdschlüssel und dann die Creditsumme enthält. Je nachdem wie komplex das Creditsystem ist, kann man das ja dann noch anpassen und weitere Relationen modellieren. Du könntest es im einfachsten Fall auch direkt zu einer Tabelle zusammenfassen, also einfach eine weitere Spalte hinzufügen. Je nachdem, wie getrennt das sein sollte bzw. wie viel Daten noch hinzukommen.

    der_Freezey schrieb:

    wie kann man das denn sicherer machen
    Brauchst Du nicht. In der PHP-Datei kann damit nichts angestellt werden, solange diese niemand einsieht. Dann hast Du aber eh schon ganz andere Probleme, wenn Dein Webspace gekapert wurde.

    In Deinen Queries fehlen übrigens jew. ein Semikolon.
    Auch würde ich Dir evtl. JsonRPC für die Umsetzung der Actions empfehlen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade Ich benutze eine Tabelle das ist richtig, die sieht ungefähr so aus:

    ID, int(11), Primärschlüssel (Fügt halt immer ein zahl hinzu wenn ein user erstellt wurde)

    Username, text
    Password, text
    Email, text
    Ban, text
    Credits, int
    ...

    Und irgendwie hab ich das ganze nicht so richtig verstanden mit dem Credits teil

    Aber sonst hat mir alles sehr weiter geholfen
    MfG, Martin
    Ja dann hast Du doch alles schon fertig da. Dann kannst Du die Credits abfragen und ändern. Wo ist da die Schwierigkeit?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hi,

    Für ​db.php:

    PHP-Quellcode

    1. <?php
    2. # You could store this shit in an INI or JSON or whatever-file outside your document root
    3. $host = "127.0.0.1";
    4. $user = "root";
    5. $pass = "root";
    6. $data = "mwtg";
    7. try {
    8. # A database class would be more nice here ... but however, just saying
    9. $con = new \PDO("mysql:dbname={$data};host={$host};port=0;charset=utf8;", "{$user}", "{$pass}", [
    10. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    11. ]);
    12. } catch (\Exception $e) {
    13. throw new \Exception("Database connection error: " . $e->getMessage());
    14. }
    15. /**
    16. * Wrapper function for database connection.
    17. *
    18. * @return \PDO
    19. */
    20. function con() {
    21. global $con;
    22. return $con;
    23. }


    Für handler.php:

    PHP-Quellcode

    1. <?php
    2. # Include database connection
    3. require_once 'db.php';
    4. /**
    5. * Getter for GET arguments
    6. *
    7. * @param $key
    8. * @param string $default
    9. *
    10. * @return string
    11. */
    12. function request_get($key, $default = "") {
    13. return (isset($_GET) && array_key_exists($key, $_GET) ? $_GET[$key] : $default);
    14. }
    15. # Get action and validate it by removing invalid chars
    16. $action = trim(request_get("action"));
    17. $action = preg_replace("/[^a-z0-9]/i", "", $action);
    18. # Collect request data
    19. $username = con()->quote(request_get('username'));
    20. $mail = con()->quote(request_get('mail'));
    21. $ban = con()->quote(request_get('ban'));
    22. $password = con()->quote(md5(request_get('password')));
    23. # Which action to choose:
    24. switch (strtolower($action)) {
    25. # Registration
    26. case "register":
    27. # Check for existing user account
    28. $existing = con()->query("SELECT `username` FROM `users` WHERE `username` = {$username}")->fetch();
    29. if ($existing) {
    30. # Try another username, that one already exists
    31. throw new \Exception("User already exists!");
    32. }
    33. # Try inserting the new user account
    34. # Bots are welcome i guess :D
    35. $data = con()->exec("INSERT INTO `users` SET `username` = {$username}, `password` = {$password}, `email` = {$mail}, `ban` = {$ban};");
    36. echo (int)(bool)$data;
    37. break;
    38. # Login
    39. case "login":
    40. $data = con()->query("SELECT * FROM `users` WHERE `username` = {$username} AND `password` {$password};")->fetch();
    41. if ($data && isset($data['username'])) {
    42. echo "1";
    43. } else {
    44. echo "0";
    45. }
    46. break;
    47. # Manage credits
    48. case "credit":
    49. $subaction = trim(request_get("subaction"));
    50. $subaction = preg_replace("/[^a-z0-9]/i", "", $subaction);
    51. # For user (pass as id in GET)
    52. $for = (int)request_get("for");
    53. if ($for) {
    54. $credit_sql = "";
    55. switch ($subaction) {
    56. # Set credits
    57. # Call http://domain.de/handler.php?action=credit&subaction=set&for=123&value=10
    58. case "set":
    59. $credit_sql = "UPDATE `users` SET `credits` = " . (float)request_get("value") . " WHERE `id` = {$for}";
    60. break;
    61. # Add value to existing credits
    62. # Call http://domain.de/handler.php?action=credit&subaction=set&for=123&value=10
    63. case "add":
    64. $credit_sql = "UPDATE `users` SET `credits` = `credits` + " . (float)request_get("value") . " WHERE `id` = {$for}";
    65. break;
    66. # Set credits to 0
    67. # Call http://domain.de/handler.php?action=credit&subaction=clear&for=123
    68. case "clear":
    69. $credit_sql = "UPDATE `users` SET `credits` = 0 WHERE `id` = {$for}";
    70. break;
    71. # Subtract from credits
    72. # Call http://domain.de/handler.php?action=credit&subaction=set&for=123&value=10
    73. case "sub":
    74. $credit_sql = "UPDATE `users` SET `credits` = `credits` - " . (float)request_get("value") . " WHERE `id` = {$for}";
    75. break;
    76. # Invalid
    77. default:
    78. throw new \Exception("Invalid subaction");
    79. break;
    80. }
    81. } else {
    82. throw new \Exception("Select user!");
    83. }
    84. break;
    85. # Unknown action
    86. default:
    87. echo "Invalid action!";
    88. break;
    89. }


    Der Code ist komplett ungetestet, sollte aber so in etwa funktionieren. Du hast eine action für "credit" wo du mit "for" die Benutzer-ID angeben kannst dessen Credits geändert werden sollen. Zusätzlich noch eine subaction um zu entscheiden ob Credits neu gesetzt werden, etwas zu den vorhandenen hinzugefügt oder weggenommen werden soll ("value" in GET übergeben) oder ob sie zurückgesetzt werden auf 0.
    Du kannst doppelte Werte in Tabellenfeldern verhindern, indem du sie mit dem UNIQUE index ausstattest (phpMyAdmin > Datenbank > Tabelle > Struktur > "Unique" anklicken oder so).
    Hinweis: wenn die Seite von einem Bot automatisiert aufgerufen wird, kann deine Datenbank in kurzer Zeit volllaufen, das ist klar oder?


    Grüße
    Link :thumbup:
    Hello World