Webseite programmieren (Schulprojekt); Übertragung von der PHP-Datei zur Datenbank geht nicht?

2 Antworten

Xampp habe ich auch komischerweise dreimal auf meinem Laptop (...)

Es sollte nur ein Installationsverzeichnis von XAMPP geben. Schau also nach, auf welches Programmverzeichnis deine drei XAMPP-Versionen zeigen. Solltest du tatsächlich mehrere XAMPP-Installationen auf dem Rechner haben, würde ich sie alle deinstallieren und eine neue Installation der aktuellsten XAMPP-Version starten.

(...) und ich glaube, dass die Sachen auch falsch abgespeichert sind.

Im Installationsverzeichnis von XAMPP gibt es ein Unterverzeichnis htdocs. Dieses dient als Rootverzeichnis des Webservers. Das heißt, alle Dateien deiner Webseiten müssen in diesem Verzeichnis liegen.

Um die Webseite aufzurufen, musst du den Apache Server starten, der im XAMPP-Paket enthalten ist. Öffne dazu das XAMPP Control Panel und starte das Apache-Modul. Wenn es grün markiert wird, war der Start erfolgreich. Unter der Spalte Ports siehst du, unter welchem Port die Seite läuft. 443 wäre klassisch für das HTTPS-Protokoll, 80 für HTTP.

Wenn du nun unter htdocs bspw. einen Ordner meinewebseite hast, der eine index.php beinhaltet, dann kannst du sie im Browser so aufrufen:

http://localhost/meinewebseite/index.php

Bei abweichendem Port (z.B. 8080 statt 80 für HTTP), solltest du den in der Adresse mit anhängen:

http://localhost:8080/meinewebseite/index.php
(...) und irgendwie funktioniert gar nichts.

Mit dieser schwammigen Beschreibung kann man kaum etwas anfangen.

Ich denke ein valider Startpunkt sollte zunächst so aussehen:

  • Du kannst eine Seite im Browser via localhost-Adresse aufrufen
  • PHP wird ausgeführt; das heißt, bei folgender Seite (example.php) wird dir auf der Seite nur Hello world! ausgegeben:
<!doctype html>
<head>
  <title>Example</title>
  <meta charset="utf-8">
</head>
<body>
  <?php print "Hello world!"; ?>
</body>

Im zweiten Schritt solltest du prüfen, ob du eine einfache Verbindung zu deinem Datenbankserver vornehmen kannst. Im XAMPP Control Panel muss das MySQL-Modul aktiviert sein.

dbtest.php:

<?php

  ini_set('display_errors', 1);
  ini_set('display_startup_errors', 1);
  error_reporting(E_ALL);

  $mysqli = new mysqli('localhost', 'your_username', 'your_password', 'your_database');

  if ($mysqli->connect_errno) {
    print 'Error: ' . $mysqli->connect_error);
  }

  $mysqli->set_charset('utf8mb4');
  printf $mysqli->host_info;

Die Verbindungsdaten (Nutzername, Passwort, Datenbankname) musst du natürlich noch anpassen. Du kannst für den Anfang entweder den Standardnutzer ("root", "") nutzen oder du legst via phpMyAdmin einen neuen Nutzer an. Die Datenbank solltest du zuvor ebenso via phpMyAdmin kreieren.

Wenn die obige Seite schlussendlich keine Fehlermeldung liefert, bist du wieder einen Schritt weiter. Da die ersten drei Zeilen explizit die Ausgabe aller Fehler aktiviert, solltest du im Fehlerfall ausreichend Informationen dazu erhalten.

Und meine Daten (...) werden nicht in die Datenbank (...) gespeichert (...)

Ausgehend davon, dass die Datenbankverbindung klappt, kannst du dich folgendermaßen weiterhangeln:

  1. Erweitere das obige Testskript um einen INSERT-Query für deine Datenbanktabelle (die du inzwischen in deiner Datenbank angelegt haben solltest). Lass dir jeden Rückgabewert mit var_dump oder print_r ausgeben. So gut wie jede MySQLi-Funktion liefert einen Rückgabewert. Nach Laden der Seite lädst du die Ansicht in phpMyAdmin nochmal.
  2. In deinem Registrationsskript sollte es keine Fehler geben. Aktiviere am Skriptanfang das Error Reporting so wie ich es im obigen Testskript getan habe.
  3. Der Datenversand muss geprüft werden. Schau, ob dein PHP-Skript alle erwarteten Werte aus deinem HTML-Formular bekommt.
  4. Prüfe den Programmfluss, füge Zwischenausgaben ein (mit var_dump/print_r). Möglicherweise hast du einen Logikfehler, der verhindert, dass Daten überhaupt an die Datenbank geschickt werden.
  5. Prüfe vor Versand an die Datenbank, welche Werte eingesetzte Daten haben und ob die Syntax der SQL-Queries stimmt. SQL-Fehler (Syntax, falsche Tabellen-/Spaltennamen, u.ä.) müssten an sich schon in den vorherigen Schritten auffällig werden.
Nomlihp 
Fragesteller
 07.04.2024, 14:37

Hey, vielen Dank für deine Antwort. Also die Datenbankverbindung funktioniert jetzt. Allerdings jetzt folgendes Problem: wenn man die Daten in der html-Datei eingibt, soll es ja über die php Datei (wo die Verbindung mit der Datenbank phpmyadmin aufbaut), dann in die Datenbank eingetragen werden. Dies funktioniert aber nicht (wenn ich den Befehl direkt bei phpmyadmin eingebe, geht es) und es kommt auch keine richtige Fehlermeldung, sondern es bricht einfach beim Verbindungsaufbau ab und gibt dann den restlichen Code wieder. Habe eigentlich alles ausprobiert was du und NiZi112 beschriebn hat aber habe irgendwo wohl noch einen Fehler reingehauen. Ich stelle hier in den Anhang mal meine html und php Datei ein, sowie einen Überblick über die Datenbank und dem Speicherort:

Html Datei -index.html

<!DOCTYPE html>

<html lang="de">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Registrierung</title>

</head>

<body>

<h2>Daten eingeben</h2>

<form action="datenbankaufbau.php" method="post">

<label for="vorname">Vorname:</label><br>

<input type="text" id="vorname" name="vorname" required><br><br>

<label for="nachname">Nachname:</label><br>

<input type="text" id="nachname" name="nachname" required><br><br>

<label for="benutzername">Benutzername:</label><br>

<input type="text" id="benutzername" name="benutzername" required><br><br>

<label for="email">E-Mail:</label><br>

<input type="email" id="email" name="email" required><br><br>

<input type="submit" value="Daten speichern">

</form>

</body>

</html>

php Datei - datenbankaufbau.php

<?php

//Fehlermeldungen anzeigen lassen

ini_set('display_errors', 1);

ini_set('display_startup_errors', 1);

error_reporting(E_ALL);

// Verbindung zur Datenbank herstellen

$servername = "localhost";

$username = "root";

$password = "";

$database = "db_mercklph_blaubook";

$verbindung = new mysqli($servername, $username, $password, $database);

// Verbindung überprüfen

if ($verbindung->connect_error) {

die("Es konnte keine Verbindung zur Datenbank hergestellt werden: " . $verbindung->connect_error);

} else { echo

"Verbindung zur Datenbank erfolgreich hergestellt!<br>";

}

// Werte aus dem Formular abrufen

$vorname = $_POST['vorname'];

$nachname = $_POST['nachname'];

$benutzername = $_POST['benutzername'];

$email = $_POST['email'];

// SQL-Abfrage / Einfügen der Daten in die Datenbank

$sql = "INSERT INTO `kurssprecher` (vorname, nachname, benutzername, email) VALUES ('$vorname', '$nachname', '$benutzername', '$email')";

if ($verbindung->query($sql) === TRUE) {

echo "Die Daten wurden erfolgreich in die Datenbank eingefügt.";

} else {

echo "Fehler beim Einfügen der Daten: " . $verbindung->error;

}

$verbindung->close();

var_dump($verbindung->affected_rows);

?>

Überblick Speicherort versuche ich gleich noch als Bild hochzuladen

Vielen Dank für deine Hilfe!

0
Nomlihp 
Fragesteller
 07.04.2024, 14:41
@Nomlihp

Hier auch die "Fehlermeldung" (ist einfach der Code ab dem Zeitpunkt wo versucht wird den Datenbankaufbau herzustellen) nach abschicken der html Datei:

connect_error) { die("Es konnte keine Verbindung zur Datenbank hergestellt werden: " . $verbindung->connect_error); } else { echo "Verbindung zur Datenbank erfolgreich hergestellt!

"; } // Werte aus dem Formular abrufen $vorname = $_POST['vorname']; $nachname = $_POST['nachname']; $benutzername = $_POST['benutzername']; $email = $_POST['email']; // SQL-Abfrage / Einfügen der Daten in die Datenbank $sql = "INSERT INTO `kurssprecher` (vorname, nachname, benutzername, email) VALUES ('$vorname', '$nachname', '$benutzername', '$email')"; if ($verbindung->query($sql) === TRUE) { echo "Die Daten wurden erfolgreich in die Datenbank eingefügt."; } else { echo "Fehler beim Einfügen der Daten: " . $verbindung->error; } $verbindung->close(); var_dump($verbindung->affected_rows);

0
regex9  07.04.2024, 16:58
@Nomlihp

Deine Fehlermeldung erweckt eher den Anschein, als würde der PHP-Bereich vorzeitig beendet werden.

Speichere die Datei einmal neu mit UTF-8-Zeichenkodierung ab. Das klappt auch ganz einfach über den Windows Texteditor (Notepad) im Speichern unter-Dialog. Öffne anschließend die Datei und gebe die Zeichen für den Pfeil in dieser Zeile

if ($verbindung->connect_error) 

neu ein (manuell/nicht von irgendwo kopieren). Immerhin ist das die Stelle, an der der Interpreter abbricht.

Wenn das nichts bewirkt, würde mich einmal interessieren, ob sich das Verhalten (bzw. die Fehlermeldung) ändert, wenn du stattdessen die mysqli_connect_error-Funktion nutzt:

if (mysqli_connect_error()) 

oder einen anderen Aufruf mit Pfeil weiter vorschiebst. Zum Beispiel:

$verbindung->close();

if ($verbindung->connect_error) {

Noch ein paar andere Anmerkungen:

1) Verwende für Queries, in die Daten, die von außen kommen, eingefügt werden, nicht String-Konkatenation und query-Funktion. So wäre es für einen Nutzer einfach, fremden SQL-Code einzuschleusen. Zum Beispiel könnte er in das Eingabefeld für den Vornamen SQL einsetzen:

', '', '', ''); select table_name from information_schema.tables;--

Der INSERT-Befehl wird einfach abgeschlossen, der eigene SQL-Code dahinter gesetzt und folgender Code auskommentiert.

So eine Art an Injection kann mit einem Prepared Statement verhindert werden.

$anweisung = $verbindung->prepare('INSERT INTO kurssprecher (vorname, nachname, benutzername, email) VALUES (?, ?, ?, ?)');
$anweisung->bind_param("ssss", $vorname, $nachname, $benutzername, $email);

if ($anweisung->execute()) {
  // success ...
} 

In dem Query werden vier Platzhalter (?) definiert. Mit bind_param wird jedem ein Typ (s = String) sowie ein Wert zugeordnet. Es wird somit implizit ein korrekter, sicherer Query zusammengebaut. Für die Datenbankverbindung sollte zudem eine stabile Zeichenkodierung (wie utf8mb4 = UTF-8; siehe oben) festgelegt werden.

2) Rufe affected_rows auf, bevor du die Verbindung schließt (und somit gebundene Ressourcen aus dem Speicher entlässt).

3) Eine begriffliche Aufklärung hierzu:

(...) mit der Datenbank phpmyadmin aufbaut (...)

XAMPP verwendet eine MariaDB (ein Ableger von MySQL). MariaDB und MySQL sind jeweils Datenbanken(-systeme). Bei phpMyAdmin wiederum handelt es sich um eine separate PHP-Webanwendung, die für MySQL/MariaDB eine grafische Oberfläche bereitstellt. Letzten Endes schickt die also genauso wie du über PHP-Skripte Aufrufe an die Datenbank.

0

Hallöchen,

vorab: Eclipse hat damit höchstwahrscheinlich gar nichts zu tun.

Ich denke ein sauberes Setup ist am wichtigesten, daher:

  • deninstalliere alle XAMPP-Programme
  • installiere sie einmal neu
  • starte die Datenbank
  • versuche die SQL-Befehle erstmal über phpMyAdmin auszuführen
  • wenn das klappt dann versuch es via PHP und achte auf Fehlermeldungen

Bei Fragen lass nen Kommentar dar und denk dran, so gut wie jede Fehlermeldung kann man googlen :D

Grüße

Woher ich das weiß:Hobby – seit 2020 Erfahrung mit PHP, Laravel, Vue sowie Javsscript
Nomlihp 
Fragesteller
 07.04.2024, 14:39

Hey, vielen Dank für deine Antwort. Habe es nochmal versucht und deine Empfehlungen befolgt. Der Datenbankaufbau ging dann aber das übertragen von der html Datei, über die php Datei in die Datenbank bei phpmyadmin hat nicht funktioniert (innerhalb von phpmyadmin hat die Abfrage aber funktioniert). Fehlermeldung kommt leider auch keine sinnvolle. Die genaue beschreibung und den Code findest du oben unter dem anderen Kommentar. Über deine Hilfe würde ich mich sehr freuen

0
Nomlihp 
Fragesteller
 07.04.2024, 15:49
@NiZi112

Hallo, danke für deine Rückmeldung. Als echo bzw. AUsgabe kommt leider keine Richtige Fehlermeldung sondern einfach ein Teil des php Codes: connect_error) { die("Es konnte keine Verbindung zur Datenbank hergestellt werden: " . $verbindung->connect_error); } else { echo "Verbindung zur Datenbank erfolgreich hergestellt!

"; } // Werte aus dem Formular abrufen $vorname = $_POST['vorname']; $nachname = $_POST['nachname']; $benutzername = $_POST['benutzername']; $email = $_POST['email']; // SQL-Abfrage / Einfügen der Daten in die Datenbank $sql = "INSERT INTO `kurssprecher` (vorname, nachname, benutzername, email) VALUES ('$vorname', '$nachname', '$benutzername', '$email')"; if ($verbindung->query($sql) === TRUE) { echo "Die Daten wurden erfolgreich in die Datenbank eingefügt."; } else { echo "Fehler beim Einfügen der Daten: " . $verbindung->error; } $verbindung->close(); var_dump($verbindung->affected_rows);

Das mit der Sicherheitslücke ist glaube ich nicht so schlimm, da die Webseite nur intern für ein Projekt genutzt wird, wenn ich Zeit habe schaue ich es mir aber an. Vielen Dank!

0
NiZi112  07.04.2024, 16:02
@Nomlihp

Aber der die kommt, nh? Was steht dann da hinter dem Doppelpunkt? Einfach ncihts?

0
Nomlihp 
Fragesteller
 07.04.2024, 16:10
@NiZi112

Ich verstehe nicht ganz, wie meinst du?

0
NiZi112  07.04.2024, 16:23
@Nomlihp

wird denn "Es konnte keine Verbindung zur Datenbank hergestellt werden" ausgegeben? Wenn ja, was steht hinter dem Doppelpunkt?

0
Nomlihp 
Fragesteller
 07.04.2024, 16:24
@NiZi112

Achso, danke. Nein leider nicht, es erscheint keine richtige Fehlermledung, sondern der Code wird einfach ab dieser Stelle wiedergegeben, wie oben im Kommentar gezeigt. Es kommt also leider keine Fehlermeldung nach dem Doppelpunkt, sondern einfach der restliche Code

0
NiZi112  07.04.2024, 16:31
@Nomlihp

Ja, das ist merkwürdig. Hast du MySQL denn nebenbei gestartet und das läuft auch?

0
Nomlihp 
Fragesteller
 07.04.2024, 16:32
@NiZi112

Ja, mysql und apache laufen über xampp

0