Wolfmann
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
Hallo, habe mal wieder eine Frage zu php/sql. Ich möchte mir einen kleinen Loin-Bereich programmieren und bin bis jetzt ganz gut klargekommen. Jetzt möchte ich, dass nach erfolgreichem Login die Seite ui.php aufgerufen wird, wo halt der Bereich für eingeloggte Benutzer ist. Leider verlinkt der Befehl require_once() nicht, sondern es passiert eigentlich gar nichts. Was mache ich da falsch? Habe den betreffenden Codeblock mal angehängt. Die ui.php soll bislang testweise nur die Session-Variable ausgeben. Ich danke schonmal für die hilfe. | if ($search_result->num_rows == 1) {
echo "Hallo ".$_POST['user'].", du hast dich erfolgreich eingeloggt";
$reihe = $search_result->fetch_assoc();
$_SESSION['upload'] = $reihe['name'];
echo $_SESSION['upload'];
require_once('ui.php');
}else{
echo "Name oder Passwort falsch";
}
|
|
MathiasM_T
Anmeldungsdatum: 16. Juli 2020
Beiträge: Zähle...
|
Hallo, require bzw. in deinem Fall require_once wirft im Fehlerfall einen E_COMPILE_ERROR und beendet die Programmausführung. Wenn also beim Einbinden der externen php-Datei mit require etwas schief geht, sollte auch im ErrorLog was geschrieben werden. Liegt die ui.php denn im gleichen Verzeichnis wie die aufrufende php? Zugriffsrechte auf die ui.php vorhanden? ui.php syntaktisch korrekt?
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
Danke erstmal für deine Antwort. zu deinen Fragen: -Zugriffsrechte sind vorhanden, Datei liegt auch im selben Verzeichnis. Was meinst du mit syntaktisch korrekt? Es steht lediglich eine Testausgabe drin:
| <?php
echo $_SESSION['upload'];
?>
|
|
MathiasM_T
Anmeldungsdatum: 16. Juli 2020
Beiträge: 3
|
Mit syntaktisch korrekt meinte ich ob es Sytaxfehler in der einzubindenden php-Datei gibt. Das können wir aber jetzt ausschließen. Am sichersten wird es sein, du schaust im ErrorLog ob die php abbricht.
Alles andere wäre Spekulation. Du kannst dir zusätzlich auch noch in den Entwicklertools des Browsers anschauen welcher HTTP-Responsecode vom Server zurückkommt und wie die Response-Daten aussehen. Falls der Fehler serverseitig passiert wird ein HTTP-500 an den Browser zurückgegeben.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Wolfmann schrieb: Es steht lediglich eine Testausgabe drin:
| <?php
echo $_SESSION['upload'];
?>
|
Schreib da doch mal ein bisschen mehr als eine Variable rein - nicht dass die z.B. nur einen Leeren String enthält...
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
Entschuldigt meine späte Rückmeldung. Wie kann ich mir den php-log anzeigen lassen? Kann man da in der php.ini was einstellen? Bei mir ist das so, dass bei einem Syntaxfehler (fehlendes Semikolon zum Beispiel) im browser lediglich eine weiße Fläche zu sehen ist. In die Datei könnte ich mal was anderes ausgeben lassen - wobei es weniger um die Datei geht, sondern, dass nicht dorthin verlinkt wird...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
require_once() verlinkt nicht, sondern bindet die Datei an der Stelle im Ablauf des PHP-Skripts ein, wenn es das erste mal im Skriptablauf ist, dass die Methode (oder require()) mit dem Argument aufgerufen wird. Wie sieht denn die Umgebung des gezeigten Code-Stücks aus? Steckt das eventuell in einer Schleife oder einem sonstigen wiederholt aufgerufenen Codestück?
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
Also, ich habe das Ganze jetzt mal umgeschrieben ohne das require_once(). Ergebnis aber wieder wie oben beschrieben (leeres Dokument). Ich poste am besten mal das gesamte Skript, wie es derzeit steht: Die Datei mit dem Formular: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 | <?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>Adminbereich</title>
<link rel="stylesheet" href="style.css" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes">
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript"></script>
</head>
<body>
<header>
<section id="containerbild1">
<img src="feuerwerk.jpeg" id="bild1">
</section>
<section id="ueberschrift">
<h1 class="Standardueberschrift">Uploadbereich</h1>
<h1 class="Ersatzueberschrift">Upload</h1>
</section>
<section id="containerbild2">
<img src="feuerwerk.jpeg" id="bild2">
</section>
</header>
<nav>
<ul class="dropdown">
<li> <img src="menu.jpeg" alt="Bild aktivieren">
<ul class ="Standard">
<li><a href="index.php">Home</a></li>
<li><a href="photos.php">Photos</a></li>
<li> <a href="downloads.php">Downloads</a></li>
<li><a href="gaestebuch.php">Gästebuch</a></li>
<li><a href="upload.php">Adminbereich</a></li>
<li><a href="impressum.php">Impressum</a></li>
</ul>
</nav>
<form method="post" action="/Includes/login.inc.php";?>">
<input type="text" name="user" placeholder= "Gib deinen Namen ein"> <br />
<input type="text" name="pw" placeholder="Gib dein Passwort ein"> <br />
<input type="submit" name="submit" value="anmelden">
</form>
|
Und hier die login.inc.php, auf die jetzt durch das Formular weitergeleitet wird... 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | <?php
if (isset($_POST['submit'])) {
echo "Test!";
echo $_POST['user'];
require 'dbh.inc.php';
if (empty($_POST['user']) || empty($_POST['pw'])) {
header("Location: ../upload.php?error=emptyfields");
exit();
}else{
$sql=$verbindung->prepare("SELECT * FROM homepage WHERE name=? AND password=?");
$sql->bind_param('ss', $_POST['user'], $_POST['pw']);
$sql->execute();
$result = $sql->get_result();
if ($row = $result->fetch_assoc()) {
$pwdCheck = password_verify($_POST['pw'], $row['password']);
if ($pwdCheck == false) {
header("Location: ../upload.php?error=wrongpw");
exit();
}elseif ($pwdCheck == true) {
session_start();
$_SESSION['adminname'] = $row['name'];
header("Location: ../upload.php?login=success");
}
else{
header("Location: ../upload.php?error=nouser");
exit();
}
}
}else{
header("Location: ../upload.php");
exit();
}
}
?>
|
Die dbh.inc.php, in der die Datenbankverbindung gespeichert ist, sieht so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
$server = "localhost";
$user= "root";
$kennwort="";
$datenbank="personen";
$verbindung = new mysqli($server, $user, $kennwort, $datenbank);
if ($verbindung->connect_error) {
echo "Einloggen derzeit nicht möglich"."<br />";
}
?>
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Wolfmann schrieb: Die Datei mit dem Formular: | <form method="post" action="/Includes/login.inc.php";?>">
|
Da passt IMHO das Quoting nicht, der Syntax-Highlighter des Forums stolpert da auch drüber - wenn ich mich nicht stark täusche, sollte das so aussehen:
| <form method="post" action="/Includes/login.inc.php">
|
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
seahawk1986 schrieb: Wolfmann schrieb: Die Datei mit dem Formular: | <form method="post" action="/Includes/login.inc.php";?>">
|
Da passt IMHO das Quoting nicht, der Syntax-Highlighter des Forums stolpert da auch drüber - wenn ich mich nicht stark täusche, sollte das so aussehen:
| <form method="post" action="/Includes/login.inc.php">
|
Ja, das kann man wegmachen, aber das war das Problem nicht. Er hat ja zu der entsprechenden Datei verbunden, bloß zeigt er da immer nur einen weißen screen an. In der Adressleiste steht schon die richtige Datei drin... Edit: Habe mal die php-fehlerausgabe loggen lassen. Bei der login.inc.php kam auch keinerlei Fehlermeldung - die Datei müsste sysntaktisch daher eigentlich richtig sein - aber irgendwie klappt das mit dem Weiterleiten oder mit der session nicht so ganz. Keine Ahnung mehr, was ich da flasch mache. wie würdet ihr vorgehen?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Wolfmann schrieb: Edit: Habe mal die php-fehlerausgabe loggen lassen. Bei der login.inc.php kam auch keinerlei Fehlermeldung - die Datei müsste sysntaktisch daher eigentlich richtig sein - aber irgendwie klappt das mit dem Weiterleiten oder mit der session nicht so ganz. Keine Ahnung mehr, was ich da flasch mache. wie würdet ihr vorgehen?
Ich würde das mit flask, aiohttp oder falls eine extensive Datenbank-Anbindung genutzt wird mit django und Python3 statt PHP machen... - aber wenn ich die Dokumentation zu session_start() richtig verstehe, musst du auf der Seite, die auf den POST-Request reagiert, ebenfalls session_start() aufrufen, bevor du dem Client andere Daten schickst.
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
Danke erstmal für deine Rückmeldung. Das, was du sagst, stimmt. Sobald ich auf dem zweiten php-Dokument auch eine session gestartet habe, konnte die $_SESSION-Variable auch ausgelesen werden. Ich bin nunmal einen Schritt weiter und habe einen Teil des Codes als Skriptes mit require_once eingebunden. Das sieht jetzt so aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | <?php
$server = "localhost";
$user= "root";
$kennwort="Netzwerk";
$datenbank="personen";
$verbindung = new mysqli($server, $user, $kennwort, $datenbank);
if ($verbindung->connect_error) {
echo "Einloggen derzeit nicht möglich"."<br />";
}
if (isset($_POST['submit'])) {
$abfrage = $verbindung->prepare("SELECT * FROM homepage WHERE name = ? AND password = ?");
$abfrage->bind_param('ss', $_POST['user'], $_POST['pw']);
$abfrage->execute();
$search_result = $abfrage->get_result();
if ($search_result->num_rows == 1) {
//echo "Hallo ".$_POST['user'].", du hast dich erfolgreich eingeloggt";
$reihe = $search_result->fetch_assoc();
session_start();
$_SESSION['upload'] = $reihe['name'];
if (isset($_SESSION['upload'])) {
require_once '../Includes/login.inc.php';
exit();
?>
}
}
}
|
In der php-Fehlerausgabe habe ich folgende Fehlermeldung erhalten:
| PHP Fatal error: require_once(): Failed opening required '../Includes/login.inc.php' (include_path='.:/usr/share/php') in /var/www/homepage/upload.php on line 99
|
die login.inc-php liegt in folgendem Pfad: /var/www/homepage/Includes/login.inc.php. Kann man da was machen, dass die Datei "gefunden" wird? Dann dürfte das Problem gelöst sein...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 332
|
Vielen Dank @seahawk1986. Habe nach deiner Anleitung den Pfad angepasst und jetzt funktioniert das Ganze. Kann man auch mehrere include-Pfade angeben, wenn man z.B. mehrere virtuelle Hosts auf einem Server hat?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Wolfmann schrieb: Kann man auch mehrere include-Pfade angeben, wenn man z.B. mehrere virtuelle Hosts auf einem Server hat?
Laut der verlinkten Dokumentation ist das möglich: Das Format ist ähnlich zur PATH-Umgebungsvariablen des jeweiligen Systems: Eine Liste von Verzeichnissen, getrennt durch einen Doppelpunkt unter Unix oder ein Semikolon unter Windows.
|