# PHP Speichert Daten nicht mehr in MySQL Datenbank



## italofreak (7. Juli 2015)

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
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
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


----------



## Icephoen1x (7. Juli 2015)

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)


----------



## xActionx (7. Juli 2015)

Icephoen1x schrieb:


> ... (Du hast sicherheitslücken im php code, jemand könnte diese ausgenutzt haben um die datenbank zu löschen)



Löschen geht nicht... MySqli deaktiviert wie die meisten anderen den <Drop database;> Befehl.


----------



## DKK007 (7. Juli 2015)

Kommt eine Fehlermeldung oder wird einfach nichts eingetragen?


----------



## TessaKavanagh (7. Juli 2015)

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.

```
$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.


----------



## italofreak (7. Juli 2015)

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


----------



## TessaKavanagh (8. Juli 2015)

Na dann mach doch an den Anfang des Scriptes mal ein 
	
	



```
error_reporting(-1);
```
  und hinter die query doch mal ein 
	
	



```
var_dump($eintragen);
```


----------



## OutOfMemory (8. Juli 2015)

Oder direkt über mysqli die Fehlermeldung abfragen: PHP: mysqli::$error - Manual


----------



## xActionx (8. Juli 2015)

TessaKavanagh schrieb:


> 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 ^^


----------



## TessaKavanagh (8. Juli 2015)

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":

```
$zeit = $_POST["zeit"];
```
Beispiel 2 "ganz ganz Böse":

```
$zeit = @$_POST["zeit"];
```
Beispiel 3 "In Ordnung":

```
if(isset($_POST["zeit"])){$zeit = $_POST["zeit"];}else{$zeit = "";}
```
Beispiel 4 "3 in kürzer":

```
$zeit = isset($_POST["zeit"]) ? $_POST["zeit"] : "";
```


----------



## ZAM (8. Juli 2015)

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.


----------



## TessaKavanagh (8. Juli 2015)

Ähm eigentlich ist PDO weit verbreitet und wird vom großteil derer die mehr mit PHP machen genutzt.  
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.


----------



## ZAM (9. Juli 2015)

TessaKavanagh schrieb:


> Ähm eigentlich ist PDO weit verbreitet und wird vom großteil derer die mehr mit PHP machen genutzt.
> 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*


----------



## TessaKavanagh (9. Juli 2015)

Dann bin ich vermutlich einfach in einer PDO verliebten Community aktiv. Wobei sich natürlich prepared Statements auch mit mysqli_* umsetzen lassen würden.


----------



## italofreak (15. Juli 2015)

Danke für die Hilfe, es lag an einem einfachen schreib Fehler der mir nicht aufgefallen ist  
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.


----------



## milesdavis (24. Juli 2015)

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!


----------



## DarkMo (25. Juli 2015)

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


----------

