• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

PHP MySQL Problem

IDK_WHO_AM_I

Kuhfänger
Registriert
30 Mai 2017
Beiträge
66
Alter
28
Diamanten
300
Minecraft
IDK_WHO_AM_I
Hey,
ich arbeite da an einem SQL Query und ich hab keine Ideen mehr.. vielleicht weiß hier jemand mehr :D

Folgende Situation:
PHP:
function createUser($user, $hashed_pw, $mail) {
    global $db;
    global $db_tableprefix;
    $db->query("INSERT IGNORE INTO " . $db_tableprefix . "users VALUES (" . $user . ", " . $hashed_pw . ", " . $mail .")");
    $db->close();
}

Damit versuche ich einen Nutzer in der Datenbank abzuspeichern. Jedoch funktioniert das auch nicht. Und ich weiß großteils auch warum. Also ich die SQL mal so wie sie ausgegeben wird in phpmyadmin reingehauen habe. sagte der natürlich geht nicht wegen der Sonderzeichen im gehashten passwort und dem @ in der mail. Also dachte ich ich mache folgendes:

PHP:
function createUser($user, $hashed_pw, $mail) {
    global $db;
    global $db_tableprefix;
    $db->query("INSERT IGNORE INTO " . $db_tableprefix . "users VALUES ('" . $user . "', '" . $hashed_pw . "', '" . $mail ."')");
    $db->close();
}

Was aber auch nicht hilft den PHP denkt wahrscheinlich nur das ich dem String entkommen möchte :D
Leider haben sonstige htmlspecialchars etc. Methoden nicht geholfen. Weiß jemand wie ich das jetzt machen kann?

Oder ob es etwas ganz anderes ist :(

Grüße Maxi
 

IDK_WHO_AM_I

Kuhfänger
Registriert
30 Mai 2017
Beiträge
66
Alter
28
Diamanten
300
Minecraft
IDK_WHO_AM_I
//UPDATE:

Jemand hat mir geholfen und das ist das Ergebnis hilft aber nicht viel :(
PHP:
function createUser($user, $hashed_pw, $mail) {
    global $db;
    global $db_tableprefix;
    try
    {
        $stmt = $db->prepare("INSERT IGNORE INTO " . $db_tableprefix . "users (username, password, email) VALUES (?, ?, ?)");
        $stmt->bind_param('sss', $user, $hashed_pw, $mail);
        $stmt->execute();
        $stmt->close();
    } catch (Exception $e)
    {
        die($e);
    }
    $db->error;
}
 

IDK_WHO_AM_I

Kuhfänger
Registriert
30 Mai 2017
Beiträge
66
Alter
28
Diamanten
300
Minecraft
IDK_WHO_AM_I
Ja das mir klar ich weiß was das ist an dieser Stelle ist es aber nicht nötig und wenn mache ich das am Ende wenn alles fertig ist damit ich nicht durcheinander komme xD
Bist aber nicht der Erste dem das auffällt
 
D

deleted196100

Guest
Unter Verwendung der PDO Schnittstelle kann das Ganze folgendermaßen mit prepared Statements realisiert werden:

PHP:
$db = new PDO("mysql:host=<host>;dbname=<dbname>","<username>","<password>");
$user = "deinuser";
$hash = "hash";
$mail = "mail@mail.de";

$statement = $db->prepare("
    INSERT INTO TABELLE VALUES (
      :user,
      :hash,
      :mail
    )
")
$statement->execute([
    "user" => $user,
    "hash" => $hash,
    "mail" => $mail
]);

Der Code ist natürlich nur ein Beispiel und sollte so nicht verwendet werden.

Wenn deine Datenbank das ganze nicht annimmt hast du eventuell in der Datenbank einen Falschen Datentyp für das Betreffende Feld
 
Zuletzt bearbeitet von einem Moderator:
D

deleted196100

Guest
@Brickchef Das mit dem Datentyp kann sein. Erkennt den MySQL ein hashed bcryt password als solches?

Nutze folgenden Code:
PHP:
$hashed_pw = password_hash($_POST['adminpassword'], PASSWORD_BCRYPT);

Die Funktion gibt dir einen 60 Zeichen langen String zurück, du solltest das ganze also Problemlos in ein Varchar Feld reinspeichern können.
Siehe http://php.net/manual/en/function.password-hash.php

Hast du schon den Lösungsweg mit prepared Statements ausprobiert, ich vermute das Problem eher in dieser Richtung
 
D

deleted196100

Guest
Dann muss es einen Fehler geben, ohne diesen zu kennen kann man schlecht weiterhelfen. Wenn du keine Fehlerausgabe bekommst aktiviere doch bitte Error Reporting, das kannst du mit einer Funktion (http://php.net/manual/de/function.error-reporting.php) oder direkt in der php.ini bewerkstelligen.

Edit: Schande über mein Haupt, in meinem Code fehlt ein semikolon bei der Mailvariable. Solltest du den Code kopiert haben wird das der Fehler sein.
 

IDK_WHO_AM_I

Kuhfänger
Registriert
30 Mai 2017
Beiträge
66
Alter
28
Diamanten
300
Minecraft
IDK_WHO_AM_I
Ich schick mal die ganze File rein:
PHP:
<?php

include 'config.php';

$db = new mysqli($db_config['host'], $db_config['username'], $db_config['password'], '', $db_config['port']);

if ($db->connect_error) {
    echo "<div class='callout callout-warning'><p>Connection failed: " . $db->connect_error . "</p></div>";
}

function initTables() {
    global $db;
    global $db_config;
    global $db_tableprefix;
    $db->query("CREATE DATABASE IF NOT EXISTS " . $db_config['databasename']);
    $db->select_db($db_config['databasename']);
    $db->query("CREATE TABLE IF NOT EXISTS " . $db_tableprefix . "settings (property VARCHAR(99) NOT NULL, value VARCHAR(99) NOT NULL, PRIMARY KEY ( `property` ))");
    $db->query("CREATE TABLE IF NOT EXISTS " . $db_tableprefix . "users (username VARCHAR(99) NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(99) NOT NULL, PRIMARY KEY ( `username` ))");
    $db->query("CREATE TABLE IF NOT EXISTS " . $db_tableprefix . "projects (project_name VARCHAR(255) NOT NULL, launch_date VARCHAR(255) NOT NULL, may_players VARCHAR(255) NOT NULL, version VARCHAR(255) NOT NULL, creator VARCHAR(255) NOT NULL, PRIMARY KEY ( `project_name` ));");
    $db->query("CREATE TABLE IF NOT EXISTS " . $db_tableprefix . "players (player_uuid VARCHAR(99) NOT NULL, player_name VARCHAR(15) NOT NULL, player_ipaddress VARCHAR(99), PRIMARY KEY ( `player_uuid` ))");
    $db->query("CREATE TABLE IF NOT EXISTS " . $db_tableprefix . "link_player_projects (project_name VARCHAR(255) NOT NULL, player_uuid VARCHAR(99), FOREIGN KEY (`project_name`) REFERENCES projects(`project_name`), FOREIGN KEY (`player_uuid`) REFERENCES players(`player_uuid`)");
    $db->query("CREATE TABLE IF NOT EXISTS " . $db_tableprefix . "ranks (rank_name VARCHAR(15) NOT NULL, rank_shortcut VARCHAR(6) NOT NULL, rank_permission INT(2), PRIMARY KEY ( `rank_name` ))");

    $db->query("INSERT IGNORE INTO " . $db_tableprefix . "ranks VALUES ('Administrator', 'Admin', 99)");
    $db->query("INSERT IGNORE INTO " . $db_tableprefix . "ranks VALUES ('Moderator', 'Mod', 75)");
}

function createUser($user, $hashed_pw, $mail) {
    global $db;
    global $db_tableprefix;
    $db->query("INSERT IGNORE INTO " . $db_tableprefix . "users (username, password, email) VALUES (" . $user . ", " . $hashed_pw . ", " . $mail . ")");
    if ($db->error) {
        echo "<div class='callout callout-warning'><p>Connection failed: " . $db->error . "</p></div>";
    }
}

function getSetting($property) {
    global $db;
    global $db_tableprefix;
    $result = $db->prepare("SELECT value FROM " . $db_tableprefix . "settings WHERE property = " . $property . " LIMIT 1");
    while($row = $result->fetch_row()) {
        return $row['value'];
    }
}

function setSetting($property, $value) {
    global $db;
    global $db_tableprefix;
    $db->query("INSERT INTO " . $db_tableprefix . "settings (property, value) VALUES (" . $property . ", " . $value . ") ON DUPLICATE KEY UPDATE value =" . $value . " WHERE property = " . $property);
}

function checkUser($name, $password) {
    global $db;
    global $db_tableprefix;
    $result = $db->query("SELECT password FROM " . $db_tableprefix . "users WHERE username = " . $name . " OR LOWER(email) = LOWER(" . $name . ")");

    while($row = $result->fetch_assoc()) {
        if(password_verify($password, $row['password'])) {
            return true;
        } else {
            return false;
        }
    }
}


$db->close();
?>

Das mein aktueller Code und error_reporting zeigt auch ned mehr habs versucht :/
 
Oben