PHP Speichert Daten nicht mehr in MySQL Datenbank

italofreak

Schraubenverwechsler(in)
Hey,

ich habe folgendes Problem: Ich habe ein Script welches ein normales Formular abfragen soll und dann in die Datenbank eintragen soll. Nur komischerweise funktioniert das seit einigen Tagen plötzlich nicht mehr und ich weis nicht warum..

Hier das Formular:

PHP:
<?php
session_start();
if($_SESSION["login"] != 1)
{
    echo "Um diese Funktion nutzen zu können musst du dich einloggen.";
    exit;
}
else
{}
?>
<html>
<head>
<link rel="stylesheet" type="text/css" href="../style/main.css">
</head>
<body>
<div class="farmen">
<table>
<form action="xy.php" method="post">
<tr>
    <td>Name:</td><td> <?php echo $_SESSION["name"];?></td> 
</tr>
<tr>
<td>Was wurde gefarmt?:</td><td> <select name="material" size="1" value;> 
                        <option value="Heroin">Heroin</option>
                        <option value="Kokain">Kokain</option>
                        <option value="Turtle">Turtle</option>
                        <option value="LSD">LSD</option>
                        <option value="Weed">Weed</option>
                        <option value="Froschschenkel">Froschschenkel</option>
                        <option value="Kupfer">Kupfer</option>
                        <option value="Diamant">Diamant</option>
                        <option value="Eisen">Eisen</option>
                        <option value="Oel">Öl</option>
                        <option value="Salz">Salz</option>
                        </select></td>
</tr>
<tr>
<td>Dauer:</td><td> <input type="text" name="zeit">Stunden</td>
</tr>
<tr>
<td>Fahrzeug:</td><td> <select name="fahrzeug" size="1" value;> 
                        <option value="HEMTT">HEMTT</option>
                        <option value="Tempest">Tempest</option>
                        <option value="Zamak">Zamak</option>
                        <option value="Offroader">Offroader</option>
                        <option value="Boxer">Truck Boxer</option>
                        <option value="Hummingbird">Hummingbird</option>
                        </select></td>
</tr>
<tr>
<td>Wurdest du ausgeraubt?: </td><td>Ja<input type="radio" name="ausgeraubt" value="Ja">Nein<input type="radio" name="ausgeraubt" value="Nein"></td> 
</tr>
<tr>
<td>Verdienst:</td><td> <input type="text" name="verdienst"></td> 
</tr>
<tr>
<td>Anmerkung: </td><td><input type="text" name="anmerkung"></td> 
</tr>
<tr>
<td>Verluste:</td><td> <input type="text" name="verluste"></td> 
</tr>
<tr>
<td><input type="submit" value="Eintragen"></td>
</form>
<form action="hin.php">
<td><input type="submit" value="Einträge"></td>
</form>
<form action="ausloggen.php">
<td><input type="submit" value="Ausloggen"></td>
</form>
</td>
</tr>
</table>
</div>
</body>
</html>

Und hier der Code zum speichern:

PHP:
<?php
session_start();
if($_SESSION["login"] != 1)
{
    echo "Um diese Funktion nutzen zu können musst du dich einloggen.";
    exit;
}
else
{}

$verbindung = mysqli_connect ("localhost", "xxxxxxx", "xxxxxxxx")
or die("Fehler im System");

mysqli_select_db($verbindung, "xxxxxxxx")
or die("Konnte nicht die Datenbank oeffnen.");

$name = $_SESSION["name"];
$zeit = $_POST["zeit"];
$material = $_POST["material"];
$ausgeraubt = $_POST["ausgeraubt"];
$verdienst = $_POST["verdienst"];
$anmerkung = $_POST["anmerkung"];
$verluste = $_POST["verluste"];
$fahrzeug = $_POST["fahrzeug"];
if($name == "")
{
    echo "Du hast deinen Namen vergessen..";
} else if($zeit == "") {
    echo "Wie lange warst du unterwegs?";
} else if($material == "") {
    echo "Womit hast du dich denn bereichert?";
} else if($ausgeraubt == "") {
    echo "Wurdest du ausgeraubt?";
} else if($verdienst == "") {
    echo "Wie viel hast du verdient?";
} else if ($fahrzeug == "") {
    echo "Welches Fahrzeug bist du gefahren?";
} else
{
    $eintrag = "INSERT INTO farmen
    (name, zeit, material, ausgeraubt, verdienst, anmerkung, verluste, fahrzeug)
    
    VALUES
    ('$name', '$zeit', '$material', '$ausgeraubt', '$verdienst', '$anmerkung', '$verluste', '$fahrzeug')";
    
$eintragen = mysqli_query($verbindung, $eintrag);

if($eintragen == true){
    header('Location: ende.php');
} else {
    echo "Konnte nicht gespeichert werden, kontaktiere den Admin.";
}
}

mysqli_close($verbindung);
?>

Sieht jemand den Fehler? Und ich muss dazu sagen das ich Laie bin, deswegen bitte verständlich erklären :)
 
Zuletzt bearbeitet von einem Moderator:
Was für ein fehler kommt beim eintragen? Poste mal das error.log des webservers. Ob die datei fehler zurückgibt kannst du auch mit zb. httpfox nachschauen.
Existiert die mysql datenbank noch? (Du hast sicherheitslücken im php code, jemand könnte diese ausgenutzt haben um die datenbank zu löschen)
 
Ich hoffe dieser Code ist so nichtüber das Internet erreichbar. Dein Code ist anfällig gegen SQL Incetions https://de.wikipedia.org/wiki/SQL-Injection . Du speicherst Daten ungeprüft in deine Datenbank, wenn dieser Code im Internet erreichbar ist riskierst du hier das jemand deinen Server übernimmt.
Löschen geht übrigends sehr wohl, wenn er für die Datenbankverbindung einen Admin Account nimmt könnte sich der Böse Bube hier nämlich sogar einen eigenen User mit vollen rechten anlegen und dann geht er mit den Logindaten direkt an die Datenbank ohne den Umweg über PHP.
In dem Code werden elementare Grundlagen und Sicherheitsregeln nicht beachtet.
PHP:
$name = $_SESSION["name"];
$zeit = $_POST["zeit"];
$material = $_POST["material"];
$ausgeraubt = $_POST["ausgeraubt"];
$verdienst = $_POST["verdienst"];
$anmerkung = $_POST["anmerkung"];
$verluste = $_POST["verluste"];
$fahrzeug = $_POST["fahrzeug"];
Wenn jemand die Seite ohne das Formular aufruft bekommst du für jede Variable ne Notice: geworfen, da die variablen nicht existieren. Bevor du zuweist musst du erst prüfen ob die Variable überhaupt existierst.
 
Also nein die Seite ist nicht über das Internet erreichbar, und bevor ich da irgendwelche Sicherheitsmaßnahmen einbaue würde ich gerne zuerst die Funktionsfähigkeit garantieren.
Es wird kein Fehler ausgegeben sondern einfach die Meldung das es nicht gespeichert wird. Also dieser Part wird ausgegeben:
else {
echo "Konnte nicht gespeichert werden, kontaktiere den Admin.";

Und ja die Datenbank existiert noch
 
Na dann mach doch an den Anfang des Scriptes mal ein
PHP:
error_reporting(-1);
und hinter die query doch mal ein
PHP:
 var_dump($eintragen);
 
Löschen geht übrigends sehr wohl, wenn er für die Datenbankverbindung einen Admin Account nimmt könnte sich der Böse Bube hier nämlich sogar einen eigenen User mit vollen rechten anlegen und dann geht er mit den Logindaten direkt an die Datenbank ohne den Umweg über PHP.

Wer die Datenbankverbindung über den Admin Account aufbaut, dem ist so oder so nicht mehr zu helfen.... So viel Grips habe ich dem OP zugetraut ;). Auf allen anderen Verbindungen ist der Drop-Befehl nämlich deaktiviert habs grade selbst getestet ^^
 
Na ich wette im o.g. Fall auf Admin Account, da das Vorhandensein von Sicherheitslücken SQL Injection / XSS Anfälligkeit nicht bekannt war. Du kannst hier kein umfassendes Vorwissen voraussetzen. Es handelt sich m.E. entweder um zusammenkopierten Code oder um erste Erfahrungen in Richtung Programierung, da elementare Grundlagen weitgehend noch nicht bekannt und beachtet wurden.
Wie gesagt rufst du die Adresse ohne Umweg über das Formular ab haut er dir je nach errorreporting reihenweise Notices an die Rübe. Der TE greift auf Variablen zu die in diesem Fall nicht definiert wurden.

Beispiel 1 "Böse":
PHP:
$zeit = $_POST["zeit"];
Beispiel 2 "ganz ganz Böse":
PHP:
$zeit = @$_POST["zeit"];
Beispiel 3 "In Ordnung":
PHP:
if(isset($_POST["zeit"])){$zeit = $_POST["zeit"];}else{$zeit = "";}
Beispiel 4 "3 in kürzer":
PHP:
$zeit = isset($_POST["zeit"]) ? $_POST["zeit"] : "";
 
Zuletzt bearbeitet:
Interessant wäre übrigens mal die CREATE-Struct der Tabelle, vor allem bzgl. NOT Null-Felder. Wenn du Fehler unterdrückst, könnte es hier einfach wegen leeren Feldern in ein Invalides Statement laufen und du siehst es nicht.

Aber noch eine andere Frage: Warum benutzt eigentlich kaum jemand PDO und prepared statements? *g* Das löst vor allem gleich mal die Sicherheitsprobleme zum größten Teil.
 
Ähm eigentlich ist PDO weit verbreitet und wird vom großteil derer die mehr mit PHP machen genutzt. :D
Das Problem ist ehr am Anfang zu finden da der Großteil von "Tutorials" im Internet auf dem Stand von 1830 ist und noch auf das deprecated mysql_* setzt. Hier ein mysqli_* zulesen empfand ich insoweit schon als positive Überraschung.
 
Ähm eigentlich ist PDO weit verbreitet und wird vom großteil derer die mehr mit PHP machen genutzt. :D
Das Problem ist ehr am Anfang zu finden da der Großteil von "Tutorials" im Internet auf dem Stand von 1830 ist und noch auf das deprecated mysql_* setzt. Hier ein mysqli_* zulesen empfand ich insoweit schon als positive Überraschung.

Glaub mir, so verbreitet ist die Verwendung nicht. *g*
 
Dann bin ich vermutlich einfach in einer PDO verliebten Community aktiv. Wobei sich natürlich prepared Statements auch mit mysqli_* umsetzen lassen würden.
 
Danke für die Hilfe, es lag an einem einfachen schreib Fehler der mir nicht aufgefallen ist :D
Und wie gesagt das mit der Sicherheit ist mir momentan egal, ich habe nur versucht es irgendwie zum laufen zu bekommen da es sowieso nur privat genutzt wird, und erst später hochgeladen wird..
Und ja ihr habt schon recht das ich neu im Programmieren bin, weshalb mir vorerst die Sicherheit auch egal ist, wie oben genannt.
 
Wusstest du, dass dein Code höchst anfällig gegen SQL-Injections ist? Das lässt sich aber sehr einfach beheben. Das findest du schon selbst raus.

Als nächstes solltest du mal die PHP-Version überprüfen, damit nicht irgendwelche deiner Funktionen als Deprecated gekennzeichnet sind und dich später wieder hier melden musst. Das Problem kriegst du einfach hin, indem du mal bei php.net nach den Funktionen suchst.

Alles in allem ist php.net eine sehr gute Anlaufstelle!
 
den post vor dir (zu deinem lese-zeitpunkt der letzte post) haste nich gelesen oder? >< dann wäre dein erster satz gleich mal überflüssig gewesen :P
 
  • Like
Reaktionen: ZAM
Zurück