PHP Session arbeitet nicht richtig
Hallo Gemeinschaft,
hatte die Frage hier schon einmal gestellt - bin aber nicht weiter gekommen bis auf viele Fragezeichen
bitte schaut euch diese Kuriosität einmal an
nun zu dem problematischen Code - core.php
führe ich den code so aus, dann funktioniert er nicht, obwohl die session variable richtig übergeben wird
trage ich in der core.php es so ein,
dann funktieren die if Abfragen
hatte die Frage hier schon einmal gestellt - bin aber nicht weiter gekommen bis auf viele Fragezeichen
bitte schaut euch diese Kuriosität einmal an
<?php
session_start();
... Zugang Datenbank....
......
session_regenerate_id();
$_SESSION['loggedin'] = TRUE;
//$_SESSION['name'] = $_POST['surname'];
$_SESSION['name'] ="Piet"; //hier als test
$_SESSION['id_staff'] = $id_staff;
echo 'Welcome ' . $_SESSION['name'] . '!';
} else {...
nun zu dem problematischen Code - core.php
<?php
session_start();
echo $_SESSION['name'];
class Core {
......
public static function getStaffList() {
if ($_SESSION['name'] =="Olaf") {$sql = "SELECT * FROM staff where surname = 'Olaf'";}
if ($_SESSION['name'] =="Patrick") {$sql = "SELECT * FROM staff where surname = 'Patrick'";}
if ($_SESSION['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}
if ($_SESSION['name'] =="Steffi") {$sql = "SELECT * FROM staff where surname = 'Steffi'";}
if ($_SESSION['name'] =="Kira") {$sql = "SELECT * FROM staff where surname = 'Kira'";}
if ($_SESSION['name'] =="Claudia") {$sql = "SELECT * FROM staff where surname = 'Claudia'";}
if ($_SESSION['name'] =="Fango") {$sql = "SELECT * FROM staff where surname = 'Fango'";}
if ($_SESSION['name'] =="Philip") {$sql = "SELECT * FROM staff where surname = 'Philip'";}
if ($_SESSION['name'] =="Jennifer") {$sql = "SELECT * FROM staff where surname = 'Jennifer'";}
if ($_SESSION['name'] =="Tamara") {$sql = "SELECT * FROM staff where surname = 'Tamara'";}
if ($_SESSION['name'] =="Arndt") {$sql = "SELECT * FROM staff where surname = 'Arndt'";}
if ($_SESSION['name'] =="Miriam") {$sql = "SELECT * FROM staff where surname = 'Miriam'";}
if ($_SESSION['name'] =="Lea") {$sql = "SELECT * FROM staff where surname = 'Lea'";}
if ($_SESSION['name'] =="Alena") {$sql = "SELECT * FROM staff where surname = 'Alena'";}
if ($_SESSION['name'] =="Theresa") {$sql = "SELECT * FROM staff where surname = 'Theresa'";}
if ($_SESSION['name'] =="Inga") {$sql = "SELECT * FROM staff where surname = 'Inga'";}
if ($_SESSION['name'] =="Julia") {$sql = "SELECT * FROM staff where surname = 'Julia'";}
if ($_SESSION['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
if ($_SESSION['name'] =="admin") {$sql = "SELECT * FROM staff";}
führe ich den code so aus, dann funktioniert er nicht, obwohl die session variable richtig übergeben wird
trage ich in der core.php es so ein,
session_start();
$_SESSION['name'] ="Piet";
...
...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7289924802
Url: https://administrator.de/forum/php-session-arbeitet-nicht-richtig-7289924802.html
Ausgedruckt am: 22.12.2024 um 07:12 Uhr
212 Kommentare
Neuester Kommentar
Wie schon mal in deinem anderen Beitrag angemerkt beschäftige dich mal mit Klassen und static Functions dann wird auch dir klar warum es nicht funktioniert. Von Copy n Paste lernst du nichts....
Übergebe die Session-Variable als Parameter an die Funktion dann klappt das.
Und die Session startest du nicht in der Klassen-Definition sondern im Haupt-Skript aus dem du die Klasse aufrufst. Aus diesem übergibst du als eins von vielen Möglichkeiten die Session-Variable an die Funktion
Core-Klasse
Hauptskript
Gruß.
Übergebe die Session-Variable als Parameter an die Funktion dann klappt das.
Und die Session startest du nicht in der Klassen-Definition sondern im Haupt-Skript aus dem du die Klasse aufrufst. Aus diesem übergibst du als eins von vielen Möglichkeiten die Session-Variable an die Funktion
Core-Klasse
<?php
class Core {
public static function getStaffList($session) {
if ($session['name'] =="Olaf") {$sql = '.......';}
// .....
<?php
session_start();
$staff = Core::getStaffList($_SESSION);
Gruß.
s. ergänztes Beispiel o.
Klar klappt das ... aber tja wat soll man da noch sagen, da kann man dich nur noch an einen PHP-Kurs verweisen wenn du nicht willens bist selbst den Kopf in die Bücher zu stecken und noch nicht mal weist wie man PHP debuggt. Ansonsten sehe ich für dich in diesem leben schwarz. Ansonsten hol dir jemanden ins Boot der weis was er da tut. 🖖
Zitat von @martenk:
function getStaffListAction(){
Core::connectDB();
$staff = Core::getStaffList($_SESSION);
echo json_encode($staff);
//echo var_dump($patients);
Core::closeDB();
exit;
}
Tja da fehlt aber die Hälfte achte auch darauf wie die Variablen oben geschrieben wurden und wie man mit Parametern weiterarbeitet...!!
Moin,
Warum machst du das eigentlich für jeden Benutzer? Wieso benutzt du die SESSION Variable nicht in der Where-Klausel? Da du eh immer das gleiche abfragst reicht das völlig aus. Für den Admin kannst du es entweder nochmal so abfragen oder aber deine SQL Klausel entsprechend so erstellen, dass du beides mit einer abdeckst.
Und mit einem in der Function würdest du ganz schnell feststellen, ob du dort eine Ausgabe hast. Vermutlich nicht.
Versuchs doch mal mit PHP Debugging?
führe ich den code so aus, dann funktioniert er nicht, obwohl die session variable richtig übergeben wird
trage ich in der core.php es so ein,
dann funktieren die if Abfragen
Was funktioniert denn dann?
hatte die Frage hier schon einmal gestellt - bin aber nicht weiter gekommen bis auf viele Fragezeichen
bei dem Code verständlich...bitte schaut euch diese Kuriosität einmal an
nun zu dem problematischen Code - core.php
<?php
session_start();
... Zugang Datenbank....
......
session_regenerate_id();
$_SESSION['loggedin'] = TRUE;
//$_SESSION['name'] = $_POST['surname'];
$_SESSION['name'] ="Piet"; //hier als test
$_SESSION['id_staff'] = $id_staff;
echo 'Welcome ' . $_SESSION['name'] . '!';
} else {...
nun zu dem problematischen Code - core.php
Warum machst du das eigentlich für jeden Benutzer? Wieso benutzt du die SESSION Variable nicht in der Where-Klausel? Da du eh immer das gleiche abfragst reicht das völlig aus. Für den Admin kannst du es entweder nochmal so abfragen oder aber deine SQL Klausel entsprechend so erstellen, dass du beides mit einer abdeckst.
Und mit einem
echo $_SESSION['name'];
Versuchs doch mal mit PHP Debugging?
<?php
session_start();
echo $_SESSION['name'];
class Core {
......
public static function getStaffList() {
if ($_SESSION['name'] =="Olaf") {$sql = "SELECT * FROM staff where surname = 'Olaf'";}
if ($_SESSION['name'] =="Patrick") {$sql = "SELECT * FROM staff where surname = 'Patrick'";}
if ($_SESSION['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}
if ($_SESSION['name'] =="Steffi") {$sql = "SELECT * FROM staff where surname = 'Steffi'";}
if ($_SESSION['name'] =="Kira") {$sql = "SELECT * FROM staff where surname = 'Kira'";}
if ($_SESSION['name'] =="Claudia") {$sql = "SELECT * FROM staff where surname = 'Claudia'";}
if ($_SESSION['name'] =="Fango") {$sql = "SELECT * FROM staff where surname = 'Fango'";}
if ($_SESSION['name'] =="Philip") {$sql = "SELECT * FROM staff where surname = 'Philip'";}
if ($_SESSION['name'] =="Jennifer") {$sql = "SELECT * FROM staff where surname = 'Jennifer'";}
if ($_SESSION['name'] =="Tamara") {$sql = "SELECT * FROM staff where surname = 'Tamara'";}
if ($_SESSION['name'] =="Arndt") {$sql = "SELECT * FROM staff where surname = 'Arndt'";}
if ($_SESSION['name'] =="Miriam") {$sql = "SELECT * FROM staff where surname = 'Miriam'";}
if ($_SESSION['name'] =="Lea") {$sql = "SELECT * FROM staff where surname = 'Lea'";}
if ($_SESSION['name'] =="Alena") {$sql = "SELECT * FROM staff where surname = 'Alena'";}
if ($_SESSION['name'] =="Theresa") {$sql = "SELECT * FROM staff where surname = 'Theresa'";}
if ($_SESSION['name'] =="Inga") {$sql = "SELECT * FROM staff where surname = 'Inga'";}
if ($_SESSION['name'] =="Julia") {$sql = "SELECT * FROM staff where surname = 'Julia'";}
if ($_SESSION['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
if ($_SESSION['name'] =="admin") {$sql = "SELECT * FROM staff";}
führe ich den code so aus, dann funktioniert er nicht, obwohl die session variable richtig übergeben wird
trage ich in der core.php es so ein,
session_start();
$_SESSION['name'] ="Piet";
...
...
Was funktioniert denn dann?
Zitat von @Xaero1982:
Warum machst du das eigentlich für jeden Benutzer? Wieso benutzt du die SESSION Variable nicht in der Where-Klausel? Da du eh immer das gleiche abfragst reicht das völlig aus. Für den Admin kannst du es entweder nochmal
Habe ich ihm schon beim letzten Mal vorgeschlagen, inkl. prepared statements wegen SQL-Injection etc. ... wollte er nicht, warum auch immer 🙃. Sturer Bock halt.Warum machst du das eigentlich für jeden Benutzer? Wieso benutzt du die SESSION Variable nicht in der Where-Klausel? Da du eh immer das gleiche abfragst reicht das völlig aus. Für den Admin kannst du es entweder nochmal
Und wieso klappt es hier dann doch ?!
https://tio.run/##VY/BisJADIbPk6cIpVD1EezKHhYPguhhjiIyDpltYdqOMykK0mevca ...
Wire gesagt es fehlt dir die Hälfte Mach es richtig dann klappt das auch (Brille aufsetzen und genau hinschauen...)
https://tio.run/##VY/BisJADIbPk6cIpVD1EezKHhYPguhhjiIyDpltYdqOMykK0mevca ...
Wire gesagt es fehlt dir die Hälfte Mach es richtig dann klappt das auch (Brille aufsetzen und genau hinschauen...)
Zitat von @martenk:
okay - das ändere ich dann - Problem ist im Moment, dass ich die Session Variable nicht in die Funktion bekomme - auch leider nicht mit den Hinweisen von oben
okay - das ändere ich dann - Problem ist im Moment, dass ich die Session Variable nicht in die Funktion bekomme - auch leider nicht mit den Hinweisen von oben
Na dann poste uns doch mal den Code davon wie du es versucht hast?
Zitat von @martenk:
ja - wenn ich in der core.php im kopf die session erneut definiere, dann klappt die anschliessende Anzeige
ja - wenn ich in der core.php im kopf die session erneut definiere, dann klappt die anschliessende Anzeige
?? Was machst du?
Code! Mit Kommentaren, wenn du was machst, passiert was?
$_SESSION ≠ $session, schau dir mein Beispiel nochmal genau an dann siehst du das die Parameter-Variable anderst heißt, diese musst du dann natürlich auch in den IF-Abfragen anpassen und dort nicht $_SESSION verwenden ...
Zitat von @7010350221:
$_SESSION ≠ $session, schau dir mein Beispiel nochmal genau an dann siehst du das die Parameter-Variable anderst heißt, diese musst du dann natürlich auch in den IF-Abfragen anpassen und dort nicht $_SESSION verwenden ...
$_SESSION ≠ $session, schau dir mein Beispiel nochmal genau an dann siehst du das die Parameter-Variable anderst heißt, diese musst du dann natürlich auch in den IF-Abfragen anpassen und dort nicht $_SESSION verwenden ...
vielleicht hättest du den Parameter "Peter" nennen sollen oder so, damit es auffällt
Du wiederholst dich @martenk. Deswegen hatte ich ja gesagt schau dir die Definition einer Static Function einer Klasse beim Import an dann verstehst du das Verhalten und warum die Session-Variable dann leer ist.
Aber Copy n Paste scheint dir wohl wichtiger zu sein als das Verhalten dahinter zu verstehen. 🐟
Aber Copy n Paste scheint dir wohl wichtiger zu sein als das Verhalten dahinter zu verstehen. 🐟
Zitat von @martenk:
Wenn ich in der core.php diesen code eintrage
dann bekomme ich die korrekte Ausgabe bei der DB Abfrage
lasse ich den term weg
ist die Augabe leer
Wenn ich in der core.php diesen code eintrage
session_start();
$_SESSION['name'] ="Piet";
dann bekomme ich die korrekte Ausgabe bei der DB Abfrage
lasse ich den term weg
$_SESSION['name'] ="Piet";
ist die Augabe leer
Also wenn du dir den Code von Ultramatic angesehen hast und deinen entsprechend angepasst hast, dann poste ihn hier
Zitat von @Xaero1982:
vielleicht hättest du den Parameter "Peter" nennen sollen oder so, damit es auffällt
Im nachhinein wohl wahr .vielleicht hättest du den Parameter "Peter" nennen sollen oder so, damit es auffällt
Zitat von @martenk:
public static function getStaffList($_SESSION) {
if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
Falsch!!
Die Funktions-Defintion muss so aussehen die Parameter Variable hast du falsch geschrieben
public static function getStaffList($session) {
Zitat von @martenk:
public static function getStaffList($_SESSION) {
if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
Na da haben wir es doch. Du nennst den Parameter $_SESSION und rufst diesen dann auf mit $session -> das gibt es ja nun gar nicht.
public static function getStaffList($session) {
Zitat von @Xaero1982:
Na da haben wir es doch. Du nennst den Parameter $_SESSION und rufst diesen dann auf mit $session -> das gibt es ja nun gar nicht.
In dem Fall aber $session ohne Unterstrich.Na da haben wir es doch. Du nennst den Parameter $_SESSION und rufst diesen dann auf mit $session -> das gibt es ja nun gar nicht.
public static function getStaffList($_session) {
Der TO sollte sich mal Funktionsgrundlagen aneignen, das Verständnis dafür fehlt offensichtlich völlig.
https://www.php.net/manual/de/functions.arguments.php
Zitat von @7010350221:
Der TO sollte sich mal Funktionsgrundlagen aneignen
https://www.php.net/manual/de/functions.arguments.php
Zitat von @Xaero1982:
Na da haben wir es doch. Du nennst den Parameter $_SESSION und rufst diesen dann auf mit $session -> das gibt es ja nun gar nicht.
In dem Fall aber $session ohne Unterstrich.Na da haben wir es doch. Du nennst den Parameter $_SESSION und rufst diesen dann auf mit $session -> das gibt es ja nun gar nicht.
public static function getStaffList($session) {
Der TO sollte sich mal Funktionsgrundlagen aneignen
https://www.php.net/manual/de/functions.arguments.php
ach je ... natürlich!
Ach herjemineh mit dem Variablennamen habe ich im wahrsten Sinne des Wortes in die ###e gegriffen .
Irgendwie fühle ich mich bei diesem Thread hier an diese Szene erinnert😂
Zitat von @martenk:
nun so - ohne Änderung
nun so - ohne Änderung
public static function getStaffList($session) {
if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
class Core {
....
}
haste schon drin stehen?
Dann bitte nochmal den gesamten Code - danke
Zitat von @martenk:
gibt es noch eine andere Möglichkeit, wie ich die session var in die function bekomme?
gibt es noch eine andere Möglichkeit, wie ich die session var in die function bekomme?
poste doch nochmal deinen aktuellen Code bitte.
Aber ich hab doch oben gefragt ob du class core ... davor hast?
https://www.php.net/manual/en/function.error-reporting.php
Bitte aktivieren
https://www.php.net/manual/en/function.error-reporting.php
Bitte aktivieren
Der verarscht uns hier doch nur, so oft wie er sich wie ein Automat wiederholt ...
Sie suchen einen PHP Programmierer? Eine PHP Agentur, die mit MySQL und PHP programmieren kann? Einen PHP Entwickler, der Ihre PHP-Lösung programmiert, weiterentwickelt oder auch langfristig betreut? Gesucht – Gefunden! Wir programmieren für Sie PHP-Anwendungen mit PHP, Zend Framework und MySQL.
Sie suchen einen PHP Programmierer? Eine PHP Agentur, die mit MySQL und PHP programmieren kann? Einen PHP Entwickler, der Ihre PHP-Lösung programmiert, weiterentwickelt oder auch langfristig betreut? Gesucht – Gefunden! Wir programmieren für Sie PHP-Anwendungen mit PHP, Zend Framework und MySQL.
Zitat von @Xaero1982:
Woher kommt denn deine $_SESSION['name'] eigentlich?
Was sagt denn eigentlich ein var_dump($_SESSION)?
Woher kommt denn deine $_SESSION['name'] eigentlich?
Was sagt denn eigentlich ein var_dump($_SESSION)?
Im allerersten Beitrag steht es:
$_SESSION['name'] = $_POST['surname'];
Ich gehe davon aus, dass $_POST['surname'] leer oder sonstwas ist. Anders lässt es sich nicht erklären, dass, wenn man es mit $_SESSION['name'] ="Piet" testweise überschreibt, funktioniert.
Mit einem echo $_POST['surname'] lässt sich das ja leicht überprüfen.
https://tio.run/##VY/BisJADIbPk6cIpVD1EezKHhYPguhhjiIyDpltYdqOMykK0mevca ...
Works as designed ... RTFM.
Works as designed ... RTFM.
https://www.php.net/manual/en/function.session-regenerate-id.php
Das hast du doch da auch irgendwo drin - laut deinem ersten Beitrag. Vielleicht macht das Probleme?!
Das hast du doch da auch irgendwo drin - laut deinem ersten Beitrag. Vielleicht macht das Probleme?!
Fröhliche Ratestunde ☕☕ schon zwei Tassen intus.... nur das Popkorn geht langsam zur Neige, ich fahr dann mal Nachschub holen.
Warning: Undefined array key "action" in /is/htdocswww/kalender/actions.php on line 470
Fehler lesen => erste Devise!Ergo es wird kein Feld "action" per POST an das Skript übermittelt ... Also Formular checken das dieses PHP Skript aufruft.
Wetten werden bei mir angenommen wann der Thread die 100 Komentare Schwelle überschreitet.
In der Zeit die du hier damit verplemperst hättest du schon zwei mal das ganze PHP manual durchgelesen und wärst hinterher auch noch schlauer wie vorher 🤞.
Zitat von @martenk:
im Moment rufe ich die action.php ja auch separat auf - daher der Fehler mit dem Post
Aha, und wir sollen das hellsehen oder was??im Moment rufe ich die action.php ja auch separat auf - daher der Fehler mit dem Post
Warning: Undefined global variable $_SESSION in /is/htdocswww/kalender/actions.php on line 4
NULL
Warning: session_start(): Session cannot be started after headers have already been sent in /is/htdocswww/kalender/classes/Core.php on line 3
Fehlermeldung lesen hilft, du gibst schon etwas in der Datei aus bevor du die Session startest wenn also das PHP intro <?php nicht ganz am Anfang steht oder am Ende einer PHP Datei nach dem ?> noch eine Leerzeile kommt wird schon eine Ausgabe generiert und die Header sind schon generiert. Genau das sagt dir die Meldung.NULL
Warning: session_start(): Session cannot be started after headers have already been sent in /is/htdocswww/kalender/classes/Core.php on line 3
also läuft doch die session
aber zu spät.
Sag mal ... wie bekommst du eigentlich die Daten in das $_SESSION-Aray?
Woher kommen denn deine Logindaten? Doch sicher aus einem vorgelagerten Formular? Wie sieht das Formular aus? Wie und wo übergibst du die Formulardaten an das $_SESSION-Aray?
Was du mit der Meldung machst? Na du hast davor schon Daten gesendet. Also geht kein Session_start();
Woher kommen denn deine Logindaten? Doch sicher aus einem vorgelagerten Formular? Wie sieht das Formular aus? Wie und wo übergibst du die Formulardaten an das $_SESSION-Aray?
Was du mit der Meldung machst? Na du hast davor schon Daten gesendet. Also geht kein Session_start();
Zitat von @martenk:
wenn ich die core.php aufrufe
dann bekomme ich diesen vardump
array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(9) }
also läuft doch die session
wenn ich die core.php aufrufe
dann bekomme ich diesen vardump
array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(9) }
also läuft doch die session
Das läuft doch sicher nur, weil du wieder irgendwo was definiert hast oder nicht?
Poste doch mal alle deine Files bei https://pastebin.com rein und verlink hier. So kommt ja keiner mehr draus. Am besten auch das File mit dem html Formular.
Und weil das noch gerne eine Fehlerquelle ist, sollte man bei reinen PHP Files oder wenn am Ende die letzten Zeilen PHP Code sind, kein Closing Tag ?> mehr setzen.
Zitat von @7010350221: <?php nicht ganz am Anfang steht oder am Ende einer PHP Datei nach dem ?>
Und weil das noch gerne eine Fehlerquelle ist, sollte man bei reinen PHP Files oder wenn am Ende die letzten Zeilen PHP Code sind, kein Closing Tag ?> mehr setzen.
<?php
session_start();
echo $_SESSION['name'];
class Core {
......
public static function getStaffList() {
if ($_SESSION['name'] =="Olaf") {$sql = "SELECT * FROM staff where surname = 'Olaf'";}
if ($_SESSION['name'] =="Patrick") {$sql = "SELECT * FROM staff where surname = 'Patrick'";}
if ($_SESSION['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}
if ($_SESSION['name'] =="Steffi") {$sql = "SELECT * FROM staff where surname = 'Steffi'";}
if ($_SESSION['name'] =="Kira") {$sql = "SELECT * FROM staff where surname = 'Kira'";}
if ($_SESSION['name'] =="Claudia") {$sql = "SELECT * FROM staff where surname = 'Claudia'";}
if ($_SESSION['name'] =="Fango") {$sql = "SELECT * FROM staff where surname = 'Fango'";}
if ($_SESSION['name'] =="Philip") {$sql = "SELECT * FROM staff where surname = 'Philip'";}
if ($_SESSION['name'] =="Jennifer") {$sql = "SELECT * FROM staff where surname = 'Jennifer'";}
if ($_SESSION['name'] =="Tamara") {$sql = "SELECT * FROM staff where surname = 'Tamara'";}
if ($_SESSION['name'] =="Arndt") {$sql = "SELECT * FROM staff where surname = 'Arndt'";}
if ($_SESSION['name'] =="Miriam") {$sql = "SELECT * FROM staff where surname = 'Miriam'";}
if ($_SESSION['name'] =="Lea") {$sql = "SELECT * FROM staff where surname = 'Lea'";}
if ($_SESSION['name'] =="Alena") {$sql = "SELECT * FROM staff where surname = 'Alena'";}
if ($_SESSION['name'] =="Theresa") {$sql = "SELECT * FROM staff where surname = 'Theresa'";}
if ($_SESSION['name'] =="Inga") {$sql = "SELECT * FROM staff where surname = 'Inga'";}
if ($_SESSION['name'] =="Julia") {$sql = "SELECT * FROM staff where surname = 'Julia'";}
if ($_SESSION['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
if ($_SESSION['name'] =="admin") {$sql = "SELECT * FROM staff";}
Wieso stimmt der Code nicht mit dem Code aus deinen Links überein?
Wieso ist da noch eine Zuweisung am Ende?
$sql = "SELECT * FROM staff";
Damit sind sämtliche Zuweisungen mit $sql = die du abfragst obsolet, weil hier wieder $sql überschrieben wird mit dem vollständigen Datensatz.
Mal abgesehen davon, dass du ja wieder die Übergabe entfernt hast.
Zitat von @martenk:
wo sollte ich diesen code deiner Meinung nach einbauen
wo sollte ich diesen code deiner Meinung nach einbauen
Core::connectDB();
echo Core::getStaffList($_SESSION);
Core::closeDB();
Ich glaube das größte Problem wird mitunter sein, dass wir gar nicht wissen was du da versuchst zu entwickeln? Also nicht so richtig. Hast du das überhaupt geschrieben oder willst du es anpassen?
Zitat von @martenk:
es ist später ein Kalender - und die If Abfrage ist dafür da, das ein sql statement weiter verarbeitet wird
es ist später ein Kalender - und die If Abfrage ist dafür da, das ein sql statement weiter verarbeitet wird
Ist das echt dein Ernst?
Nach all den Kommentaren und Versuchen der Kollegen hier dir helfen zu wollen, ist das alles was du raus bringst?
Wie wäre es, wenn du mal versucht (du kannst übrigens auch den Eingangspost editieren) in ganzen Sätzen zu beschreiben was deine Aufgabe ist und wie du versuchst sie umzusetzen und den kompletten Code zur Verfügung stellst oder zumindest so viel, dass man das zusammenhängend versteht und nachvollziehen kann.
Also ich habe mir mal ein kleines Testprojekt mit diesen 3 Dateien gemacht. Schön wäre es aber noch gewesen, wenn man die index.php und ev. eine login.php o.ä. gehabt hatte ;)
Dein Ablauf ist doch folgender:
Login
1. Du bist auf einer Loginseite, gibst Name und Passwort ein und schickst die Formulardaten an auth.php.
2. auth.php startet eine Session mit session_start();
3. Wenn alles ok ist, wird eine neue Session-ID mit session_regenerate_id() kreiert.
4. Das Array $_SESSION hat nun 3 Felder loggedin, name und id_staff.
5. Danach geht es weiter zur index.php.
Index
1. Die index.php veranlasst einen POST Request auf die action.php
2. In action.php ist session_start(). Danach wird die Core.php eingebunden.
3. In der Core.php ist wieder session_start().
Womit im Log der Fehler erscheint: session_start(): A session had already been started - ignoring in /xxxx/classes/Core.php on line 2
Also kann man in action.php schon mal das session_start() entfernen.
Danach mach mal nach include folgende Zeilen rein:
Dann weisst du, was da angekommen ist.
Wenn es nicht das gewünschte ist, kann der Fehler auch in der index.php liegen, welche man halt auch noch auf pastebin hätte posten sollen.
PS: Grad gesehen, wenn man sich die Request Antwort in einem Chromium Browser anschaut, wäre es besser so zu formatieren (Firefox kann halt HTML in der Entwicklerkonsole):
Dein Ablauf ist doch folgender:
Login
1. Du bist auf einer Loginseite, gibst Name und Passwort ein und schickst die Formulardaten an auth.php.
2. auth.php startet eine Session mit session_start();
3. Wenn alles ok ist, wird eine neue Session-ID mit session_regenerate_id() kreiert.
4. Das Array $_SESSION hat nun 3 Felder loggedin, name und id_staff.
5. Danach geht es weiter zur index.php.
Index
1. Die index.php veranlasst einen POST Request auf die action.php
2. In action.php ist session_start(). Danach wird die Core.php eingebunden.
3. In der Core.php ist wieder session_start().
Womit im Log der Fehler erscheint: session_start(): A session had already been started - ignoring in /xxxx/classes/Core.php on line 2
Also kann man in action.php schon mal das session_start() entfernen.
Danach mach mal nach include folgende Zeilen rein:
include('classes/Core.php');
echo session_id() . '<br> POST: ';
var_dump($_POST);
echo '<br> SESSION: ';
var_dump($_SESSION);
exit;
Dann weisst du, was da angekommen ist.
Wenn es nicht das gewünschte ist, kann der Fehler auch in der index.php liegen, welche man halt auch noch auf pastebin hätte posten sollen.
PS: Grad gesehen, wenn man sich die Request Antwort in einem Chromium Browser anschaut, wäre es besser so zu formatieren (Firefox kann halt HTML in der Entwicklerkonsole):
include('classes/Core.php');
echo session_id() . "\nPOST: ";
var_dump($_POST);
echo "\nSESSION: ";
var_dump($_SESSION);
exit;
POST: array(0) { }
Das darf aber nicht sein.
Wie willst du den je hier weiterkommen ohne $_POST['action']?
Ausserdem fehlt die Ausgabe von session_id(), beziehungsweise ist leer. Damit hast du praktisch gar keine Session. Die Session-ID ist 26 Zeichen lang und muss gleich sein wie im Browser das Cookie PHPSESSID.
Allerdings staune ich, dass $_SESSION nicht leer ist, wenn keine Session ID vorhanden ist. Oder einfach vergessen hier reinzukopieren?
Nochmal den Testcode leicht verbessert
Das darf aber nicht sein.
Wie willst du den je hier weiterkommen ohne $_POST['action']?
switch($_POST['action']){
...
}
Ausserdem fehlt die Ausgabe von session_id(), beziehungsweise ist leer. Damit hast du praktisch gar keine Session. Die Session-ID ist 26 Zeichen lang und muss gleich sein wie im Browser das Cookie PHPSESSID.
Allerdings staune ich, dass $_SESSION nicht leer ist, wenn keine Session ID vorhanden ist. Oder einfach vergessen hier reinzukopieren?
Nochmal den Testcode leicht verbessert
include('classes/Core.php');
echo "Session ID: " . session_id() . "\nPOST: ";
var_dump($_POST);
echo "\nSESSION: ";
var_dump($_SESSION);
exit;
Die obigen Codezeilen dienen ja nur dem Debuging. Natürlich braucht man die Sesssion-ID später nicht. Aber sie muss hier vorhanden sein. Keine Session-ID, keine Session.
Es ist davon auszugehen, dass kein POST Request vorhanden war. Auch das sähe man übrigens im Browser in der Entwicklerkonsole unter Anfrage einwandfrei.
Mit dem Login hat das hier nichts mehr zu tun. Die action.php ist eine API, die auf POST Requests antworten soll und zwar entweder mit JSON Daten oder Plain Text Daten, je nach Funktion.
Hier am Anfang von action.php müssen 3 Sachen vorhanden sein: $_POST, $_SESSION und die Session ID. Wenn das nicht richtig da ist, braucht man nicht weiter zu schauen.
Das Problem liegt also wohl in der index.php, welche wir (noch) nicht kennen. Ich vermute mal dort hat es neben Formularen eventuell auch Javascript Fetch POST.
Es ist davon auszugehen, dass kein POST Request vorhanden war. Auch das sähe man übrigens im Browser in der Entwicklerkonsole unter Anfrage einwandfrei.
Mit dem Login hat das hier nichts mehr zu tun. Die action.php ist eine API, die auf POST Requests antworten soll und zwar entweder mit JSON Daten oder Plain Text Daten, je nach Funktion.
Hier am Anfang von action.php müssen 3 Sachen vorhanden sein: $_POST, $_SESSION und die Session ID. Wenn das nicht richtig da ist, braucht man nicht weiter zu schauen.
Das Problem liegt also wohl in der index.php, welche wir (noch) nicht kennen. Ich vermute mal dort hat es neben Formularen eventuell auch Javascript Fetch POST.
Nachtrag: Die action.php ist eine API. Die darf man nicht direkt im Browser aufrufen.
Zum Testen der API eine kleine Hilfsdatei erstellen und alles wird gut.
helper.html
Zum Testen der API eine kleine Hilfsdatei erstellen und alles wird gut.
helper.html
<h1>Helper</h1>
<form action="action.php" method="POST">
<input id="action" name="action" value="get_stafflist">
<button type="submit">Submit</button>
</form>
Zitat von @martenk:
Hallo Hans,
wenn ich den helper ausführe bekomme ich diese Meldung
Fatal error: Cannot declare class Core, because the name is already in use in /is/htdocs//www/kalender/classes/Core.php on line 24
das ist Zeile 24
gibts da weitere zeilen ?Hallo Hans,
wenn ich den helper ausführe bekomme ich diese Meldung
Fatal error: Cannot declare class Core, because the name is already in use in /is/htdocs//www/kalender/classes/Core.php on line 24
das ist Zeile 24
class Core {
pt2 mach mal ein übersicht mit allen eingebundenen dateien inkl quellcode ... sonst ist es unübersichtlich
Dies ist der 100ste Post. Herzlichen Glückwunsch, du hast den 99 Post erreicht, beim nächsten Post gewinnst du einen PHP-Grundkurs. 🖖
Also ich werd nicht schlau draus. Ich komme immer wieder auf das gleiche was wir dir schon vor 95 Beiträgen geschrieben haben. Du musst doch die Parameter übergeben wie in deinen anderen Funktionen auch?
action.php
core.php
Und was du wie übergeben sollst haben wir ganz oben schon beschrieben.
action.php
function getStaffListAction($PARAMETER){
Core::connectDB();
$staff = Core::getStaffList($PARAMETER);
echo json_encode($staff);
//echo var_dump($patients);
Core::closeDB();
exit;
}
core.php
public static function getStaffList($PARAMETER) { //wieder umgestellt - ohne session
if ($PARAMETER=="Olaf") {$sql = "SELECT * FROM staff where surname = 'Olaf'";}
....
if ($PARAMETER =="admin") {$sql = "SELECT * FROM staff";}
$sql = "SELECT * FROM staff"; <==== Die ist ja noch immer drin????
$result = Core::$link->query($sql);
if (!$result) {
return 'Error: ' . mysqli_error(Core::$link);
}
$return = array();
while ($myrow = mysqli_fetch_assoc($result)) {
if ($myrow['birthday'] !== '0000-00-00') {
$myrow['birthday'] = date("d.m.Y", strtotime($myrow['birthday']));
} else {
$myrow['birthday'] = '';
}
$return[] = $myrow;
}
//mysql_free_result($result);
//$result->close();
return $return;
}
Und was du wie übergeben sollst haben wir ganz oben schon beschrieben.
Achtung heute ist Freitag . Schon krass wie hartnäckig manch einer sich gibt ... Statt mal zwei Stunden in Lesen zu investieren tummelt man sich Tagelang in Foren *koppschüttel*.
Zitat von @7010350221:
Falsch!!
Die Funktions-Defintion muss so aussehen die Parameter Variable hast du falsch geschrieben
Ich sag ja, neue Brille ist fällig!!
Zitat von @martenk:
public static function getStaffList($_SESSION) {
if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
Falsch!!
Die Funktions-Defintion muss so aussehen die Parameter Variable hast du falsch geschrieben
public static function getStaffList($session) {
Ich gebe langsam auf....
Zitat von @martenk:
@evgnbz
ich habe eine session variable und möchte anhand einer function in der core.php ein sql statement ausgegeben bekommen
@evgnbz
ich habe eine session variable und möchte anhand einer function in der core.php ein sql statement ausgegeben bekommen
klingt für mich nach prepared statements -> pdo -> usw
https://www.php.net/manual/de/mysqli.quickstart.prepared-statements.php
Das gibt dieses Jahr nix mehr.
copypaste ist immer so ne sache ... meine empfehlung ist sowas selber zu schreiben setze dir kleine ziele wie zb
login
datensatz eintragen
datensatz auslesen
usw usw
https://www.php.net/manual/de/mysqli.quickstart.prepared-statements.php
ich hab mir deine o.g. geposteten links und bin mir sicher dass fast niemand hier in forum sich damit auseinander setzen möchte da es sehr grobe patchwork arbeit ist (gehe davon aus)
vtl wirst du glück haben aber mein tipp ist alles neuschreiben unter beachtung von parameterübergaben und anderen sachen
und for fck sake soviel wie möglich kommentieren
login
datensatz eintragen
datensatz auslesen
usw usw
https://www.php.net/manual/de/mysqli.quickstart.prepared-statements.php
ich hab mir deine o.g. geposteten links und bin mir sicher dass fast niemand hier in forum sich damit auseinander setzen möchte da es sehr grobe patchwork arbeit ist (gehe davon aus)
vtl wirst du glück haben aber mein tipp ist alles neuschreiben unter beachtung von parameterübergaben und anderen sachen
und for fck sake soviel wie möglich kommentieren
Füge das in dein PHP-Skript ein, dann ab ins Wochenende und Dienstag haben sich deine Probleme von selbst gelöst 👌
while(1);
Wenn ich mal nicht weiter wusste, habe ich einfach an jeder erdenklichen Stelle irgendein echo eingebaut und geschaut was passiert. Irgendwie bin ich so auch immer zum Ziel gekommen.
Du hast nun zwei Möglichkeiten:
1. Einer erklärt sich bereit sich den Kram remote anzusehen
2. Du stellst jemandem den kompletten Code (also alles), inkl. Datenbank(ohne personenbezogene Daten) zur Verfügung zum selbst testen.
So kommen wir nicht zu Ziel.
Du hast nun zwei Möglichkeiten:
1. Einer erklärt sich bereit sich den Kram remote anzusehen
2. Du stellst jemandem den kompletten Code (also alles), inkl. Datenbank(ohne personenbezogene Daten) zur Verfügung zum selbst testen.
So kommen wir nicht zu Ziel.
Also ich habe die geposteten Files von Pastebin ein bisschen ausprobiert. Und die funktionieren auch so.
Die funktionieren auch mit $_SESSION in der core.php. Das ist eine Superglobal Variable, die geht auch dort.
Das Problem ist, man sieht es dem Code an, dies ist die Art und Weise, wie man vor ca. 10-20 Jahren mit PHP programmiert hat.
Es macht gar keinen Sinn, diesen Code weiter zu verfolgen oder anzupassen. Es ist leichter alles neu zu schreiben. Eigentlich verwendet man heute nicht mehr wirklich PHP Sessions, sondern eher was mit Tokens, in der Profi-Variante JWT (JSON Web Token)
Moderne Webaps sind heute komplett geteilt in Frontend (das wird hier durch die index.php repräsentiert) und Backend API (das entspricht hier den Dateien action.php und core.php)
Backend, finde ich, ist leichter zu programmieren. Man kann PHP verwenden oder etwas anderes. Um das vernünftig in PHP zu realisieren, empfehle ich, sich mind. zu folgenden Punkten einzuarbeiten:
- Entwicklungsumgebung: z.B. Visual Studio Code mit enorm vielen Plugins inkl. SSH Zugriff auf eine Linux Konsole. Das Ding ist gratis und einfach der Hammer.
- Kein Mensch schreibt heute mehr alles von Grund auf. Dafür gibt es Pakete, hier z.B. von Pakete zu Datenbankanbindungen, Authentifikation, (REST) API, Router, Mail Versand, Ausgabe als PDF. Liste kann endlos weitergeführt werden
- Pakete in PHP werden mit Composer verwaltet. Und mit Composer kommt auch grad eine vernünftige Klasse zum Autoloading daher.
- Damit Autoloading funktioniert, muss man natürlich wissen, wie Klassen gehen, was abgeleitete Klassen sind, Namespaces etc.
- Dazu gibt es Vorgaben und Hilfestellung wie PHP Code zu schreiben ist: https://www.php-fig.org/psr/
- Loggen und Debuggen, ganz wichtig.
- etc. etc. etc
Frontend wird heute eher nicht mehr in PHP gemacht. Die neuen Webapps sind praktisch 100% Javascript, verbunden natürlich mit CSS und HTML in Templates. Dafür gibt es kostenlose Frameworks wie React, Vue oder Angular.
Und die Stichworte zum Suchen wären dann noch node.js, Paketmanager npm, Typescript statt Javascript, SASS statt CSS.
Aber nochmal, grundsätzlich hätten die präsentierten Quelldateien schon funktioniert, falls nicht, wurden sie falsch aufgerufen. Oder sonstwie verhunzt ;)
Letzte Hilfestellung zu dem Thema:
Ein verbesserter helper2.html. Der erste helper.html hat einfach per Formular ein POST Request an die action.php gesandt. Damit ist man dann aber auch im Browser in der action.php gelandet, siehe URL Browserzeile. Zum Debuggen war das ok.
Aber die action.php ist ja eigentlich eine Backend API. Und die ruft man per Javascript auf. Damit bleibt man im Brwoser am ursprünglichen Ort, normalerweise index.html, index.php oder wie hier dann halt helper2.html. Die Daten, welche action.php zurück gibt, werden dann von Javascript in das offene Browser Fenster geschrieben.
Der Helper ist zum Debuggen gedacht, für nix weiter.
helper2.html
Viel Spass damit.
Die funktionieren auch mit $_SESSION in der core.php. Das ist eine Superglobal Variable, die geht auch dort.
Das Problem ist, man sieht es dem Code an, dies ist die Art und Weise, wie man vor ca. 10-20 Jahren mit PHP programmiert hat.
Es macht gar keinen Sinn, diesen Code weiter zu verfolgen oder anzupassen. Es ist leichter alles neu zu schreiben. Eigentlich verwendet man heute nicht mehr wirklich PHP Sessions, sondern eher was mit Tokens, in der Profi-Variante JWT (JSON Web Token)
Moderne Webaps sind heute komplett geteilt in Frontend (das wird hier durch die index.php repräsentiert) und Backend API (das entspricht hier den Dateien action.php und core.php)
Backend, finde ich, ist leichter zu programmieren. Man kann PHP verwenden oder etwas anderes. Um das vernünftig in PHP zu realisieren, empfehle ich, sich mind. zu folgenden Punkten einzuarbeiten:
- Entwicklungsumgebung: z.B. Visual Studio Code mit enorm vielen Plugins inkl. SSH Zugriff auf eine Linux Konsole. Das Ding ist gratis und einfach der Hammer.
- Kein Mensch schreibt heute mehr alles von Grund auf. Dafür gibt es Pakete, hier z.B. von Pakete zu Datenbankanbindungen, Authentifikation, (REST) API, Router, Mail Versand, Ausgabe als PDF. Liste kann endlos weitergeführt werden
- Pakete in PHP werden mit Composer verwaltet. Und mit Composer kommt auch grad eine vernünftige Klasse zum Autoloading daher.
- Damit Autoloading funktioniert, muss man natürlich wissen, wie Klassen gehen, was abgeleitete Klassen sind, Namespaces etc.
- Dazu gibt es Vorgaben und Hilfestellung wie PHP Code zu schreiben ist: https://www.php-fig.org/psr/
- Loggen und Debuggen, ganz wichtig.
- etc. etc. etc
Frontend wird heute eher nicht mehr in PHP gemacht. Die neuen Webapps sind praktisch 100% Javascript, verbunden natürlich mit CSS und HTML in Templates. Dafür gibt es kostenlose Frameworks wie React, Vue oder Angular.
Und die Stichworte zum Suchen wären dann noch node.js, Paketmanager npm, Typescript statt Javascript, SASS statt CSS.
Aber nochmal, grundsätzlich hätten die präsentierten Quelldateien schon funktioniert, falls nicht, wurden sie falsch aufgerufen. Oder sonstwie verhunzt ;)
Letzte Hilfestellung zu dem Thema:
Ein verbesserter helper2.html. Der erste helper.html hat einfach per Formular ein POST Request an die action.php gesandt. Damit ist man dann aber auch im Browser in der action.php gelandet, siehe URL Browserzeile. Zum Debuggen war das ok.
Aber die action.php ist ja eigentlich eine Backend API. Und die ruft man per Javascript auf. Damit bleibt man im Brwoser am ursprünglichen Ort, normalerweise index.html, index.php oder wie hier dann halt helper2.html. Die Daten, welche action.php zurück gibt, werden dann von Javascript in das offene Browser Fenster geschrieben.
Der Helper ist zum Debuggen gedacht, für nix weiter.
helper2.html
<!DOCTYPE html>
<html>
<head>
<title>Helper mit Javascript Fetch</title>
</head>
<body>
<h1>Helper mit Javascript Fetch</h1>
<form id="myForm">
<input type="text" id="action" name="action" value="get_stafflist" placeholder="Gewünschte Funktion">
<button type="submit">Anfrage senden</button>
</form>
<pre id="messagebox"></pre>
<script>
async function sendData(event) {
event.preventDefault();
const data = {"action" : document.getElementById('action').value}
await fetch('action.php', {
method: "POST",
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: new URLSearchParams(data).toString()
})
.then((response) => response.text())
.then((text) => {document.getElementById('messagebox').innerHTML = text});
}
const myForm = document.getElementById("myForm")
myForm.addEventListener("submit", sendData);
</script>
</body>
</html>
Viel Spass damit.
Mein Beileid.
VM aufsetzen LAMP und deine Seite drauf klatschen und du bist schlauer!
Zitat von @martenk:
Das war ja ursprünglich mein Problem, dass es mit XAMPP funktionierte - also local
🙈 XAMPP ≠ LAMPDas war ja ursprünglich mein Problem, dass es mit XAMPP funktionierte - also local
Nabend,
ich habs mir mal gerade angesehen und mir war gar nicht bewusst, dass es doch ein wenig ein Durcheinander zwischen PHP und js gibt.
Habe ich so auch noch nie gemacht, aber es wird versucht aus js eine PHP Funktion aufzurufen - direkt. Was natürlich nicht geht. Dann gibt es zwei Funktionen: getStaffList - eine in PHP und eine in js.
Die Problematik ist hier also die $_SESSION Variable aus PHP nach js zu bringen und damit eine PHP Function aufzurufen
ich habs mir mal gerade angesehen und mir war gar nicht bewusst, dass es doch ein wenig ein Durcheinander zwischen PHP und js gibt.
Habe ich so auch noch nie gemacht, aber es wird versucht aus js eine PHP Funktion aufzurufen - direkt. Was natürlich nicht geht. Dann gibt es zwei Funktionen: getStaffList - eine in PHP und eine in js.
Die Problematik ist hier also die $_SESSION Variable aus PHP nach js zu bringen und damit eine PHP Function aufzurufen
Zitat von @Xaero1982:
Habe ich so auch noch nie gemacht, aber es wird versucht aus js eine PHP Funktion aufzurufen - direkt. Was natürlich nicht geht. Dann gibt es zwei Funktionen: getStaffList - eine in PHP und eine in js.
Die Problematik ist hier also die $_SESSION Variable aus PHP nach js zu bringen und damit eine PHP Function aufzurufen
Habe ich so auch noch nie gemacht, aber es wird versucht aus js eine PHP Funktion aufzurufen - direkt. Was natürlich nicht geht. Dann gibt es zwei Funktionen: getStaffList - eine in PHP und eine in js.
Die Problematik ist hier also die $_SESSION Variable aus PHP nach js zu bringen und damit eine PHP Function aufzurufen
Sorry, aber du hast keine Ahnung von moderner Webentwicklung. Selbstverständlich kann man per Javascript aus dem Frontend eine PHP Funktion im Backend aufrufen. Das ist ein ganz normaler POST Request. Die PHP-Session wurde mit dem Anmelden auf der Loginseite auf dem Server erstellt und mit einem Session-Cookie im Browser gespeichert.
Ja, das könnte eventuell sein. Das Session-Cookie ist ein sogenanntes Credential und die werden seit einiger Zeit von den Browsern nur noch sehr restriktiv weitergegeben. Es gilt allgemein die same-site Regel. Also Frontend (z.B. helper.html) und Backend (action.php) müssen auf der gleichen Domain sein.
Allgemein werden heutzutage kaum mehr PHP Session genutzt. Wie oben mal erwähnt, nutzt man heute eher ein Token und ganz andere Auth-Verfahren.
Zitat von @HansFenner:
Sorry, aber du hast keine Ahnung von moderner Webentwicklung. Selbstverständlich kann man per Javascript aus dem Frontend eine PHP Funktion im Backend aufrufen. Das ist ein ganz normaler POST Request. Die PHP-Session wurde mit dem Anmelden auf der Loginseite auf dem Server erstellt und mit einem Session-Cookie im Browser gespeichert.
Zitat von @Xaero1982:
Habe ich so auch noch nie gemacht, aber es wird versucht aus js eine PHP Funktion aufzurufen - direkt. Was natürlich nicht geht. Dann gibt es zwei Funktionen: getStaffList - eine in PHP und eine in js.
Die Problematik ist hier also die $_SESSION Variable aus PHP nach js zu bringen und damit eine PHP Function aufzurufen
Habe ich so auch noch nie gemacht, aber es wird versucht aus js eine PHP Funktion aufzurufen - direkt. Was natürlich nicht geht. Dann gibt es zwei Funktionen: getStaffList - eine in PHP und eine in js.
Die Problematik ist hier also die $_SESSION Variable aus PHP nach js zu bringen und damit eine PHP Function aufzurufen
Sorry, aber du hast keine Ahnung von moderner Webentwicklung. Selbstverständlich kann man per Javascript aus dem Frontend eine PHP Funktion im Backend aufrufen. Das ist ein ganz normaler POST Request. Die PHP-Session wurde mit dem Anmelden auf der Loginseite auf dem Server erstellt und mit einem Session-Cookie im Browser gespeichert.
php:
public static function getStaffList() { //wieder umgestellt - ohne session
if ($_SESSION['name'] =="Olaf") {$sql = "SELECT * FROM staff where surname = 'Olaf'";}
if ($_SESSION['name'] =="Patrick") {$sql = "SELECT * FROM staff where surname = 'Patrick'";}
if ($_SESSION['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}
if ($_SESSION['name'] =="Steffi") {$sql = "SELECT * FROM staff where surname = 'Steffi'";}
if ($_SESSION['name'] =="Kira") {$sql = "SELECT * FROM staff where surname = 'Kira'";}
if ($_SESSION['name'] =="Claudia") {$sql = "SELECT * FROM staff where surname = 'Claudia'";}
if ($_SESSION['name'] =="Fango") {$sql = "SELECT * FROM staff where surname = 'Fango'";}
if ($_SESSION['name'] =="Philip") {$sql = "SELECT * FROM staff where surname = 'Philip'";}
if ($_SESSION['name'] =="Jennifer") {$sql = "SELECT * FROM staff where surname = 'Jennifer'";}
if ($_SESSION['name'] =="Tamara") {$sql = "SELECT * FROM staff where surname = 'Tamara'";}
if ($_SESSION['name'] =="Arndt") {$sql = "SELECT * FROM staff where surname = 'Arndt'";}
if ($_SESSION['name'] =="Miriam") {$sql = "SELECT * FROM staff where surname = 'Miriam'";}
if ($_SESSION['name'] =="Lea") {$sql = "SELECT * FROM staff where surname = 'Lea'";}
if ($_SESSION['name'] =="Alena") {$sql = "SELECT * FROM staff where surname = 'Alena'";}
if ($_SESSION['name'] =="Theresa") {$sql = "SELECT * FROM staff where surname = 'Theresa'";}
if ($_SESSION['name'] =="Inga") {$sql = "SELECT * FROM staff where surname = 'Inga'";}
if ($_SESSION['name'] =="Julia") {$sql = "SELECT * FROM staff where surname = 'Julia'";}
if ($_SESSION['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}
if ($_SESSION['name'] =="admin") {$sql = "SELECT * FROM staff";}
$sql = "SELECT * FROM staff";
$result = Core::$link->query($sql);
if (!$result) {
return 'Error: ' . mysqli_error(Core::$link);
}
$return = array();
while ($myrow = mysqli_fetch_assoc($result)) {
if ($myrow['birthday'] !== '0000-00-00') {
$myrow['birthday'] = date("d.m.Y", strtotime($myrow['birthday']));
} else {
$myrow['birthday'] = '';
}
$return[] = $myrow;
}
//mysql_free_result($result);
//$result->close();
return $return;
}
php
function getStaffListAction(){
Core::connectDB();
$staff = Core::getStaffList();
echo json_encode($staff);
//echo var_dump($patients);
Core::closeDB();
exit;
}
js
staffList = getStaffList();
js
function getStaffList(){
let cached = yc_getCache('getStaffList');
if(cached && typeof cached !== "undefined") result = cached;
else{
result = ycAjaxCall({
type: 'POST',
async: false, // Wait for result from server.
url: 'actions.php',
data: ({
action: "get_stafflist"
}),
success: function(data) {
}
}).responseText;
yc_updateCache('getStaffList',result);
}
var _ycstafflist = $.parseJSON(result);
for (var i in _ycstafflist){
//alert(_ycstafflist[i].id_staff);
//yc_getCache('getStaffList');
var d = JSON.stringify(_ycstafflist[i])
yc_updateCache('getStaffById_'+_ycstafflist[i].id_staff,d);
}
//return result;
//alert(result);
return $.parseJSON(result);
}
Da du ja alles weißt und die Dateien ja oben verlinkt sind kannste es ihm ja sicherlich gerade ziehen
Das ganze wurde von jemand anderem entwickelt und er versucht es lediglich anzupassen, weil der ursprüngliche Entwickler nicht mehr erreichbar ist. D.h. neu entwickeln fällt raus.
@Xaero1982
Der Thread hier heisst "PHP Session arbeitet nicht richtig" und nicht "Wer kann mir eine App erstellen".
Ausserdem wurde hier der Eindruck vermittelt, dass der TO irgendwelchen Code zusammengesucht hat und jetzt eine Kalender App bauen möchte. Auch von anderen wurde ihm dazu geraten, den Code neu zu schreiben.
Der TO hat ein Problem mit der PHP-Session. Dazu muss man das Problem isolieren und das hab ich mit der helper2.html getan. Sie macht auf einfache Weise den POST Request auf die API.
Der TO ist jedoch nicht in der Lage nun exakt darzulegen, was bei der Kommunikation genau passiert. Ist der phpsessionid Cookie auch wirklich vorhanden? Wird er übermittelt? Kommt er an?
Es fehlt dem TO an elementarer Erfahrung im Debuggen von Code.
Und ganz sicher gehe ich ihm nicht kostenlos Code 'gerade ziehen'
Der Thread hier heisst "PHP Session arbeitet nicht richtig" und nicht "Wer kann mir eine App erstellen".
Ausserdem wurde hier der Eindruck vermittelt, dass der TO irgendwelchen Code zusammengesucht hat und jetzt eine Kalender App bauen möchte. Auch von anderen wurde ihm dazu geraten, den Code neu zu schreiben.
Der TO hat ein Problem mit der PHP-Session. Dazu muss man das Problem isolieren und das hab ich mit der helper2.html getan. Sie macht auf einfache Weise den POST Request auf die API.
Der TO ist jedoch nicht in der Lage nun exakt darzulegen, was bei der Kommunikation genau passiert. Ist der phpsessionid Cookie auch wirklich vorhanden? Wird er übermittelt? Kommt er an?
Es fehlt dem TO an elementarer Erfahrung im Debuggen von Code.
Und ganz sicher gehe ich ihm nicht kostenlos Code 'gerade ziehen'
Wobei wir wieder ganz am Anfang sind. Der Kreis schließt sich.
Fazit wie schon ganz zu Beginn angeboten: Lernen, Lernen, Lernen ...
Fazit wie schon ganz zu Beginn angeboten: Lernen, Lernen, Lernen ...
Zitat von @7010350221:
Wobei wir wieder ganz am Anfang sind. Der Kreis schließt sich.
Fazit wie schon ganz zu Beginn angeboten: Lernen, Lernen, Lernen ...
Wobei wir wieder ganz am Anfang sind. Der Kreis schließt sich.
Fazit wie schon ganz zu Beginn angeboten: Lernen, Lernen, Lernen ...
deswegen mein vorschlag oben das ganze von neu programmieren und zwar modular (zumindest mach ichs so)
plus er sollte sich die zeit nehmen die zukünftige software zu beschreiben das ist sehr hilfreich
public static function getStaffList() { //wieder umgestellt - ohne session
if ($_SESSION['name'] =="Olaf")
.
.
.
Wenn man an einem Problem nicht weiterkommt, muss man vereinfachen. Reduziere die beiden Dateien auf das Wesentliche und du wirst sicher eher drauf kommen, wo das Problem genau steckt.
Vorschlag:
action.php
core.php
Der Aufruf geht sogar auch mit meinem helper2.html
Vorschlag:
action.php
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include('classes/Core.php');
echo "Start der action.php:\n";
echo "Session ID: " . session_id() . "\nPOST: ";
var_dump($_POST);
echo "\nSESSION: ";
var_dump($_SESSION);
echo "\nCOOKIE: ";
var_dump($_COOKIE);
$session = $_SESSION;
$action = $_POST['action'] ?? 'undefiniert';
switch($action){
case 'get_stafflist':
echo Core::getStaffList($session);
break;
default:
echo "Das ist keine gültige Aktion: $action\n";
break;
}
core.php
<?php
declare(strict_types=1);
session_start();
class Core {
/**
* Funktion zum Testen
* @param array $sessionData Benutzerdaten aus Session
* @return string Irgendwas zum Zurückgeben
*/
public static function getStaffList(array $sessionData): string {
echo "\nStart der Funktion getStaffList() in core.php:\n";
echo "\nArray session: ";
var_dump($sessionData);
$userName = $sessionData['name'] ?? 'Undef. username';
If ($userName === 'admin' || $userName === 'Piet')
echo "Die Welt ist gut. User: $userName\n";
else
echo "Die Welt ist schlecht. User: $userName\n";
$data = 'Irgendwelche Daten';
return $data;
}
}
Der Aufruf geht sogar auch mit meinem helper2.html
Und da du in der Funktion getStaffList() eh nur den Benutzernamen braucht, macht man den Aufruf auch besser so:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include('classes/Core.php');
echo "Start der action.php:\n";
echo "Session ID: " . session_id() . "\nPOST: ";
var_dump($_POST);
echo "\nSESSION: ";
var_dump($_SESSION);
echo "\nCOOKIE: ";
var_dump($_COOKIE);
$userName = $_SESSION['name'] ?? 'undefiniert';
$action = $_POST['action'] ?? 'undefiniert';
switch($action){
case 'get_stafflist':
echo Core::getStaffList($userName);
break;
default:
echo "Das ist keine gültige Aktion: $action\n";
break;
}
<?php
declare(strict_types=1);
session_start();
class Core {
/**
* Funktion zum Testen
* @param string $userName Benutzername
* @return string Irgendwas zum Zurückgeben
*/
public static function getStaffList(string $userName): string {
echo "\nStart der Funktion getStaffList() in core.php:\n";
echo "Username: $userName\n";
if ($userName === 'admin' || $userName === 'Piet')
echo "Die Welt ist gut. User: $userName\n";
else
echo "Die Welt ist schlecht. User: $userName\n";
$data = 'Irgendwelche Daten';
return $data;
}
}
Zitat von @martenk:
"This site is temporarily down for maintenance."
lieben dank für den versuch - prost
"This site is temporarily down for maintenance."
lieben dank für den versuch - prost
sehe xammp oder lamp ... lokal programieren und dann hochladen
dann an hosting anbieter wenden und das problem klären
Du musst mal davon loskommen mit deinem sekundären Problem, sondern erst mal klären, warum dein Webserver so komisch reagiert.
Probierst du als nächsten Schritt:
Für die ini_set() braucht man nämlich auch Rechte dazu. Vielleicht sind die nicht vorhanden und das Script bricht ab.
Und was ist jetzt mit den Logs? Hast du überhaupt mal nachgeschaut?
Probierst du als nächsten Schritt:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
echo 'Wenn das nicht angezeigt wird, hat der Webserver oder PHP ein Problem.';
Für die ini_set() braucht man nämlich auch Rechte dazu. Vielleicht sind die nicht vorhanden und das Script bricht ab.
Und was ist jetzt mit den Logs? Hast du überhaupt mal nachgeschaut?
Zitat von @martenk:
[Fri Jun 02 16:52:17 2023] [php:error] [pid 19066] [client 2a02:8109:b40:39c0:b5d9:eea5:1522:c0f3] [host vv.de] PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function Core::getStaffList(), 0 passed in /is/htdocs/vv/www/kalender3/actions.php on line 392 and exactly 1 expected in /is/htdocs/vv/www/kalender3/classes/Core.php:251\nStack trace:\n#0 /is/htdocs/vv/www/kalender3/actions.php(392): Core::getStaffList()\n#1 /is/htdocs/vv/www/kalender3/actions.php(490): getStaffListAction()\n#2 {main}\n thrown in /is/htdocs/vv/www/kalender3/classes/Core.php on line 251
https://pastebin.com/GXhpJSWt -> core
https://pastebin.com/L9b1RhBU ->actions
[Fri Jun 02 16:52:17 2023] [php:error] [pid 19066] [client 2a02:8109:b40:39c0:b5d9:eea5:1522:c0f3] [host vv.de] PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function Core::getStaffList(), 0 passed in /is/htdocs/vv/www/kalender3/actions.php on line 392 and exactly 1 expected in /is/htdocs/vv/www/kalender3/classes/Core.php:251\nStack trace:\n#0 /is/htdocs/vv/www/kalender3/actions.php(392): Core::getStaffList()\n#1 /is/htdocs/vv/www/kalender3/actions.php(490): getStaffListAction()\n#2 {main}\n thrown in /is/htdocs/vv/www/kalender3/classes/Core.php on line 251
https://pastebin.com/GXhpJSWt -> core
https://pastebin.com/L9b1RhBU ->actions
Er wird es nie lernen, eine Funktion die einen Parameter erwartet ohne aufzurufen, ist schon sehr intelligent, haben wir oben ja schon hundert mal gepostet, er checkt es einfach nicht ...
Lesen kann er auch nicht denn genau das steht in der Fehlermeldung 🤬 . Holt mal einer den 🚑 bitte.
public static function getStaffList($session)
$staff = Core::getStaffList();
Ähm, ich wollte es eigentlich zur Sicherheit früher mal schreiben, aber meine Codebeispiele waren als komplette Files gedacht und nicht um es in den alten Code einzufügen. Dachte, das wäre klar.
https://pastebin.com/dx2h6BPv <- Hier ist ein Fehler drin, sorry
https://pastebin.com/zmT1Nceq
https://pastebin.com/dx2h6BPv <- Hier ist ein Fehler drin, sorry
https://pastebin.com/zmT1Nceq
Hoppla, ich hab einen Fehler bei mir entdeckt
Und zwar sieht man den im Errorlog:
AH01071: Got error 'PHP message: PHP Fatal error: Uncaught TypeError: ini_set() expects parameter 2 to be string, int given in langerpfad/action.php(4):
Es muss heissen:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
Also neues Paste:
https://pastebin.com/Rjw4UBdp
Der Fehler kommt übrigens durch die neue Zeile declare(strict_types=1);
Damit werden die Typen strikter geprüft, nomen est omen
Und zwar sieht man den im Errorlog:
AH01071: Got error 'PHP message: PHP Fatal error: Uncaught TypeError: ini_set() expects parameter 2 to be string, int given in langerpfad/action.php(4):
Es muss heissen:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
Also neues Paste:
https://pastebin.com/Rjw4UBdp
Der Fehler kommt übrigens durch die neue Zeile declare(strict_types=1);
Damit werden die Typen strikter geprüft, nomen est omen
Ok, das sieht ja schon mal sehr gut aus. Man weiss vor lauter Fehlern gar nicht, wo anfangen.
1)
Ich mach mal ein Beispiel:
Das geht schon nicht mehr
Das ist u.a. auch ein Grund, warum man am Ende kein closing ?> machen soll. https://stackoverflow.com/questions/4410704/why-would-one-omit-the-close ...
2)
POST: array(0) { }
Dein $_POST ist leer. Damit hast du action.php wahrscheinlich direkt aufgerufen und nicht mit dem helper. Und wenn du sie mit dem helper aufrufst, muss die Datei dann natürlich auch action.php heissen und nicht hans.php. Oder du änderst den Namen im helper.
3)
Warning: Undefined global variable $_SESSION. Das ist klar, weil session_start() nicht funktionierte.
4)
Cookies hast du ja wirklich genug Ich hoffe mal das PHPSESSID-Cookie ist nun auch wirklich von deinem Kalender Projekt und nicht etwa von WordPress, was ja offenbar auch noch nebenbei läuft. Du solltest dein Projekt isoliert testen. Das PHPSESSID-Cookie können sich auch nicht mehrere Anwendungen teilen.
5)
Das ist keine gültige Aktion: undefiniert
Du hast ein utf-8 Zeichensatz Problem. Entweder der Webserver unterstützt utf-8 nicht von Haus aus oder dein Editor hat da was umgewandelt.
Und wenn wir schon mal bei utf-8 sind, kennst Du den Unterschied zwischen utf-8 Sourcedateien mit BOM und ohne BOM? (-> Suchmaschine).
Deine Sourcedateien müssen utf-8 OHNE BOM sein. Denn dieses BOM kann ev. auch diesen Fehler in Punkt 1 erzeugen.
Damit hast du ja nun allerlei Sachen zu lösen
1)
Warning: session_start(): Session cannot be started after headers have already been sent in /is/htdocs/vvv/www/kalender3/classes/Core.php on line 2
Jetzt suchst du mal im Internet nach: Warning: session_start(): Session cannot be started after headers have already been sent um dich in dieses Thema einzuarbeiten. Der Fehler erscheint, wenn vor dem Befehl session_start() irgendwas ausgegeben wird. Das kann auch nur eine Leerzeile, ein einzelnes Zeichen oder html sein.Ich mach mal ein Beispiel:
<?php
session_start();
Das ist u.a. auch ein Grund, warum man am Ende kein closing ?> machen soll. https://stackoverflow.com/questions/4410704/why-would-one-omit-the-close ...
2)
POST: array(0) { }
Dein $_POST ist leer. Damit hast du action.php wahrscheinlich direkt aufgerufen und nicht mit dem helper. Und wenn du sie mit dem helper aufrufst, muss die Datei dann natürlich auch action.php heissen und nicht hans.php. Oder du änderst den Namen im helper.
3)
Warning: Undefined global variable $_SESSION. Das ist klar, weil session_start() nicht funktionierte.
4)
Cookies hast du ja wirklich genug Ich hoffe mal das PHPSESSID-Cookie ist nun auch wirklich von deinem Kalender Projekt und nicht etwa von WordPress, was ja offenbar auch noch nebenbei läuft. Du solltest dein Projekt isoliert testen. Das PHPSESSID-Cookie können sich auch nicht mehrere Anwendungen teilen.
5)
Das ist keine gültige Aktion: undefiniert
Du hast ein utf-8 Zeichensatz Problem. Entweder der Webserver unterstützt utf-8 nicht von Haus aus oder dein Editor hat da was umgewandelt.
Und wenn wir schon mal bei utf-8 sind, kennst Du den Unterschied zwischen utf-8 Sourcedateien mit BOM und ohne BOM? (-> Suchmaschine).
Deine Sourcedateien müssen utf-8 OHNE BOM sein. Denn dieses BOM kann ev. auch diesen Fehler in Punkt 1 erzeugen.
Damit hast du ja nun allerlei Sachen zu lösen
das ist mein core Anfang
Und warum verwendest du jetzt nicht die beiden Dateien, die ich dir zum Testen zur Verfügung gestellt habe?
Also meine core Datei hat keine 253 Zeilen.
https://pastebin.com/Rjw4UBdp
https://pastebin.com/zmT1Nceq
OK, dann sind wir jetzt (endlich) an dem Punkt angelangt, wo man sagen kann, dass dein Webserver noch irgendwas ausgibt, bevor deine eigene Ausgabe kommt. 1 Byte würde für den Fehler reichen.
Warning: session_start(): Session cannot be started after headers have already been sent in /is/htdocs/vv/www/kalender3/classes/Core.php on line 8
Und das prüfen wir jetzt nochmals in einem eigenen Testfile:
sessiontest.php
Warning: session_start(): Session cannot be started after headers have already been sent in /is/htdocs/vv/www/kalender3/classes/Core.php on line 8
Und das prüfen wir jetzt nochmals in einem eigenen Testfile:
sessiontest.php
<?php
/****************************************
// sessiontest.php
***************************************/
declare(strict_types=1);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
session_start();
echo 'Hallo';
Gut, ich habe in meiner action.php noch am Anfang 2 Zeilen vergessen auszukommentieren.
Die könnten den Fehler ausgelöst haben. Bei mir hat's komischerweise trotzdem funktioniert.
Also neue action.php:
https://pastebin.com/8UqTg3dB
Bitte nochmal testen.
Die könnten den Fehler ausgelöst haben. Bei mir hat's komischerweise trotzdem funktioniert.
Also neue action.php:
https://pastebin.com/8UqTg3dB
Bitte nochmal testen.
Ok, dann binden wir mal die Datenbank ein:
action.php
https://pastebin.com/NkvBYpYM
Core.php
https://pastebin.com/NacTeMdS
Wie du siehst, habe ich mir erlaubt, den Code etwas zu modernisieren.
action.php
https://pastebin.com/NkvBYpYM
Core.php
https://pastebin.com/NacTeMdS
Wie du siehst, habe ich mir erlaubt, den Code etwas zu modernisieren.
Das Resultat mag dir gefallen, die Klasse ist immer noch arschig, aber ich musste ja kompatibel bleiben ;)
Schauen wir uns mal 2 Sachen an:
Deine Zugangsdaten sind in einer conf.ini. Das ist ein potentielles Sicherheitsloch. Wenn diese Datei nicht in der .htaccess vor Zugriff geschützt ist, kann die jeder im Browser aufrufen.
Besser ist es diese Daten grad als PHP Datei zu machen. Damit ersparen wir uns auch das parsen der ini-Datei. Natürlich noch Werte ausfüllen:
conf.php
Das andere ist dein komisches Konstrukt in der Core etwas abhängig von den Usernamen 'Piet' und 'admin' zu machen. Sowas gehört nicht hardcoded in die Coreklasse. Im allgemeinen definiert man ein Rollen- bzw. Rechtesystem für die Benutzer. Z.b. Gast, User, Moderator, Admin. Sowas gehört eigentlich grad beim Authentifizieren gespeichert. Aber wir machen es jetzt in die action.php.
action.php
https://pastebin.com/uKtr5AH9
Core.php
https://pastebin.com/UeayxCyv
Schauen wir uns mal 2 Sachen an:
Deine Zugangsdaten sind in einer conf.ini. Das ist ein potentielles Sicherheitsloch. Wenn diese Datei nicht in der .htaccess vor Zugriff geschützt ist, kann die jeder im Browser aufrufen.
Besser ist es diese Daten grad als PHP Datei zu machen. Damit ersparen wir uns auch das parsen der ini-Datei. Natürlich noch Werte ausfüllen:
conf.php
<?php
$conf = [
'host' => '',
'user' => '',
'password' => '',
'name' => ''
];
Das andere ist dein komisches Konstrukt in der Core etwas abhängig von den Usernamen 'Piet' und 'admin' zu machen. Sowas gehört nicht hardcoded in die Coreklasse. Im allgemeinen definiert man ein Rollen- bzw. Rechtesystem für die Benutzer. Z.b. Gast, User, Moderator, Admin. Sowas gehört eigentlich grad beim Authentifizieren gespeichert. Aber wir machen es jetzt in die action.php.
action.php
https://pastebin.com/uKtr5AH9
Core.php
https://pastebin.com/UeayxCyv
Wenn wir es schon von Sicherheitslöchern haben, hier grad noch ein schlimmes. Schauen wir uns mal diesen Code an:
Wie man unschwer erkennen kann, wird hier eine oder mehrere komplette Tabellenreihen zurückgegeben, schlussendlich dann als JSON von der API.
Dies ist umso schlimmer, als die Abfrage mit "SELECT * ....." vorgenommen wurde. Solange die Tabelle nur Spalten enthält, welche für die Rückgabe vorgesehen sind, ist das nicht weiter kritisch. Aber mit Garantie wird irgend jemand irgendwann mal diese Tabelle um ein paar weitere Spalten erweitern, die dann halt eben vertrauliche Daten enthalten. Diese werden dann natürlich auch in der JSON Antwort sein. Ein klassisches Leck.
Da gibt es mind. 2 Abhilfen:
a) Nicht SELECT * verwenden, sondern die gewünschten Feldnamen explizit angeben. Aus meiner Erfahrung geht das eine Weile gut, bis mal ein Programmierer kommt und sagt, ach ###e, da sind ja schon 20 Feldnamen, komm ich mach das einfacher und mach wieder SELECT *
b) Sicherer ist folgende Variante (ich kenn ja nur 2 Feldnamen, halt einfach den Rest ergänzen):
Somit werden garantiert nur die benötigten Felder zurückgegeben.
$staff = [];
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
if ($row['birthday'] !== '0000-00-00')
$row['birthday'] = date("d.m.Y", strtotime($row['birthday']));
else
$row['birthday'] = '';
$staff[] = $row;
}
return $staff;
Wie man unschwer erkennen kann, wird hier eine oder mehrere komplette Tabellenreihen zurückgegeben, schlussendlich dann als JSON von der API.
Dies ist umso schlimmer, als die Abfrage mit "SELECT * ....." vorgenommen wurde. Solange die Tabelle nur Spalten enthält, welche für die Rückgabe vorgesehen sind, ist das nicht weiter kritisch. Aber mit Garantie wird irgend jemand irgendwann mal diese Tabelle um ein paar weitere Spalten erweitern, die dann halt eben vertrauliche Daten enthalten. Diese werden dann natürlich auch in der JSON Antwort sein. Ein klassisches Leck.
Da gibt es mind. 2 Abhilfen:
a) Nicht SELECT * verwenden, sondern die gewünschten Feldnamen explizit angeben. Aus meiner Erfahrung geht das eine Weile gut, bis mal ein Programmierer kommt und sagt, ach ###e, da sind ja schon 20 Feldnamen, komm ich mach das einfacher und mach wieder SELECT *
b) Sicherer ist folgende Variante (ich kenn ja nur 2 Feldnamen, halt einfach den Rest ergänzen):
$staff[] = [
'birthday' => $row['birthday'],
'surname' => $row['surname'],
];
Zitat von @martenk:
ich kann vermutlich mit dem alten code der index.php und der core und actions nichts mehr anfangen ?
Erstaunlicherweise solltest du die index.php theoretisch immer noch brauchen können. Sie macht ja nichts anderes als Anfragen an die action.php zu senden (wie der helper). Solange dann die gewünschten Daten zurück kommen, ist alles im Butter.ich kann vermutlich mit dem alten code der index.php und der core und actions nichts mehr anfangen ?
Eigentlich müsstest du jetzt nur noch wieder alle entfernten Funktionen Stück für Stück wieder hinzufügen und schauen wie es sich verhält.
Ich habe geschaut, dass der Code kompatibel bleibt. Kompatibel vor allem hinsichtlich darauf, dass man hier eine Klasse als Funktionsbibliothek missbraucht hat und alles statisch gemacht hat.
Hier (hoffentlich die letzten) Pastebins, wie eigentlich eine Klasse eher zu nutzen ist. Grad auch noch mit einem Namespace. Allerdings ist das nicht mehr kompatibel zu den bestehenden Funktionen. Ich empfehle sie aber trotzdem zu nutzen und die Funktionen einfach anzupassen. So viel Aufwand ist es eigentlich nicht.
https://pastebin.com/pSsvYEqD
https://pastebin.com/VXyPRhfR
noch eine Frage - es gab doch keine andere Möglichkeit bei dem alten Script die Session Variable in getStaffListAction zu bekommen oder?
Ich denke, das hätte grundsätzlich schon funktioniert. Aber niemand wusste, was du da genau machst und vor allem hat es niemandem Spass gemacht, in diesem hässlichen Code was zu suchen.Mich hat's nun nochmal gerissen und ich hab nun noch ein paar Sachen verbessert:
- Die action.php in den Namespace Kalender getan, spart unten etwas Schreibarbeit
- Die Rollen als Klassen-Konstanten definiert.
- Die Zugangsdaten der DB lesen wir in der action.php und übergeben sie der Klasse. Das hält die Klasse universell nutzbar.
- Jetzt wo wir eine schöne Klasse haben, verpassen wir dieser Klasse einen Konstruktor und öffnen die Datenbank gleich dort. Denn alle Methoden brauchen diese Datenbank. So muss man sie nicht jedesmal öffnen.
- Die Methode closeDB() gelöscht, weil man sie hier schlicht nicht braucht.
- Da es recht viele Methoden gibt, die dieses Birthday Feld fixen, eine Funktion dafür erstellt.
- Eine Funktion erstellt für das Extrahieren der Stafffelder, welche zurückgegeben werden sollen.
- Der API die Action get_staff() hinzugefügt. Und dort natürlich mit auch prepared statements gearbeitet.
https://pastebin.com/nUB0UL9K
https://pastebin.com/3UUibpYF
Man sieht also, dass man mit deutlich weniger Code viel mehr erreichen kann und das erst noch sicherer. Zumindest hast du da nun Code, bei dem man sich nicht mehr grad schämen muss.
Ja, solltest du können. Allerdings sollte die action.php richtigerweise actions.php heissen. Und du hast ja nun erst 2 Funktionen drin. Insgesamt sind es doch etwa 30.
Ich hab mal die index.php geöffnet und da kommen halt schon viele Fehler. z.B. Zeile 1547 und 1549, da fehlen Klammern.
Diesen Fehler sieht man einerseits in der Konsole vom Browser oder aber auch wenn man Microsoft Visual Code als Editor verwenden würde (was du auch unbedingt machen solltest). Und es ist bei weitem nicht der einzige Fehler.
Ich glaube nicht, dass du genügend Kenntnisse hast, um eine Datei mit 5600 Codezeilen zu debuggen.
Ich hab mal die index.php geöffnet und da kommen halt schon viele Fehler. z.B. Zeile 1547 und 1549, da fehlen Klammern.
var inputDate = new date);
//alert(inputDate);
var startDate = new date);
Diesen Fehler sieht man einerseits in der Konsole vom Browser oder aber auch wenn man Microsoft Visual Code als Editor verwenden würde (was du auch unbedingt machen solltest). Und es ist bei weitem nicht der einzige Fehler.
Ich glaube nicht, dass du genügend Kenntnisse hast, um eine Datei mit 5600 Codezeilen zu debuggen.
Was du hochgeladen hast:
https://pastebin.com/X2i68M8R
https://pastebin.com/X2i68M8R
Und da haben wir auch genau das Hauptproblem. Du hast einfach keinerlei Kenntnisse, wie man Fehlern auf den Grund geht.
Ich meine, was hat dich jetzt gehindert, in einem x-beliebigen Editor mit Ctrl-F (Suche) nach new date) zu suchen? Dann hättest du gesehen, dass es 6x vorkommt (wobei 2x in auskommentierten Zeilen.)
Und auch beide Browser (Firefox und Chromium) werfen sofort einen Fehler aus: Uncaught SyntaxError: Unexpected token ')'
Und echt, die 5600 Zeilen Datei ist einfach der Horror. Selbst für jemand mit Erfahrung. Das war vor 10-15 Jahren ok, aber heute nicht mehr.
Ich meine, was hat dich jetzt gehindert, in einem x-beliebigen Editor mit Ctrl-F (Suche) nach new date) zu suchen? Dann hättest du gesehen, dass es 6x vorkommt (wobei 2x in auskommentierten Zeilen.)
Und auch beide Browser (Firefox und Chromium) werfen sofort einen Fehler aus: Uncaught SyntaxError: Unexpected token ')'
Und echt, die 5600 Zeilen Datei ist einfach der Horror. Selbst für jemand mit Erfahrung. Das war vor 10-15 Jahren ok, aber heute nicht mehr.
Ich hab keine Ahnung, was du machst
Aber:
https://pastebin.com/y652RtLF
Zeile 1543, 1548, 1550, 4106, 4111, 4113
Da steht doch klar new date) und heissen muss es new date()
Und die Zeiten für notepad++ sind zum Entwickeln auch vorüber.
https://code.visualstudio.com/ Kostenlos!
Aber:
https://pastebin.com/y652RtLF
Zeile 1543, 1548, 1550, 4106, 4111, 4113
Da steht doch klar new date) und heissen muss es new date()
Und die Zeiten für notepad++ sind zum Entwickeln auch vorüber.
https://code.visualstudio.com/ Kostenlos!
wenns unbedingt notepad++ sein soll suche nach "notepad++ php autocomplete plugin" https://github.com/StanDog/npp-phpautocompletion zb
Zitat von @martenk:
Hallo Hans - z.b. 1550 steht bei mir das in der index.php
var startDate = new Date(date);
Hallo Hans - z.b. 1550 steht bei mir das in der index.php
var startDate = new Date(date);
So geil Mein Firefox Browser verschluckt Zeichen
Ich muss ein Addon habe, dass irgendwas hier herausfiltert. In einem anderen Browser ohne Addon lese ich auch new Date(date);
Aber mit meinen Standardbrowser lese ich überall (auch hier im Forum) new Date); Sogar in der Forumvorschau wird grad wieder weggefiltert ;)
Und somit hab ich den Code natürlich auch von pastebin falsch auf meinen Webserver übernommen.
Sorry, mein Fehler.
Nachtrag:
Haha, gefunden. Das Addon Binnen-I be gone (gegen den Genderwahnsinn) filtert das raus Sachen gibt's.
Funktioniert für mich einwandfrei.
Mit dem helper2.html getestet und eine Liste der Staffmitglieder als JSON bekommen.
Also so etwas:
[{"id_staff":"1","surname":"Piet","birthday":"21.06.2023"},{"id_staff":"2","surname":"Hans","birthday":"03.06.2023"},{"id_staff":"3","surname":"Bart","birthday":"01.01.2001"}]
Meine Tabelle ist natürlich viel kleiner als deine.
Mit dem helper2.html getestet und eine Liste der Staffmitglieder als JSON bekommen.
Also so etwas:
[{"id_staff":"1","surname":"Piet","birthday":"21.06.2023"},{"id_staff":"2","surname":"Hans","birthday":"03.06.2023"},{"id_staff":"3","surname":"Bart","birthday":"01.01.2001"}]
Meine Tabelle ist natürlich viel kleiner als deine.
Funktioniert für mich. Zum Testen:
ergibt:
Superglobale Variablen, die sind überall:
https://www.php.net/manual/de/language.variables.superglobals.php
public static function getStaffList($session){
var_dump($session);
var_dump($_SESSION);
.....
ergibt:
array(2) {
["name"]=>
string(4) "Piet"
["loggedin"]=>
bool(true)
}
array(2) {
["name"]=>
string(4) "Piet"
["loggedin"]=>
bool(true)
}
[{"id_staff":"1","surname":"Piet","birthday":"21.06.2023"},{"id_staff":"2","surname":"Hans","birthday":"03.06.2023"},{"id_staff":"3","surname":"Bart","birthday":"01.01.2001"}]
Superglobale Variablen, die sind überall:
https://www.php.net/manual/de/language.variables.superglobals.php
Einen Verdacht hab ich noch. Probier mal die beiden Files, die sind ohne Ending PHP Tag.
https://pastebin.com/fHNHSR3L
https://pastebin.com/pHAZGzQV
https://pastebin.com/fHNHSR3L
https://pastebin.com/pHAZGzQV
Also mal der Reihe nach:
1)
NULL
NULL
[]
Also bei mir sieht das so aus:
array(0) {
}
array(0) {
}
[]
Vielleicht je nach PHP Version etwas anders. Auf jeden Fall wäre das normal, wenn halt einfach keine Session da ist und du nicht eingeloggt bist.
2)
NULL
NULL
[{"id_staff":"9","surname":"Piet","prename":"Peter","birthda
Das kann ja wohl nicht sein ;) Ausser du hast da wieder was überschrieben mit $session['name']='Piet'. Bloss hast du das ja um 15:05 verschwiegen.
Jetzt machen wir mal folgendes:
Ich habe ein Datei, welche dich sofort einloggt, bzw. eine Session erstellt. Das rufst du vor dem helper einmal auf.
quicklogin.php
Und in der actions.php nehmen wir session_start an den Anfang der Datei und aktivieren die Fehlermeldungen wieder:
https://pastebin.com/hi6C3R0x
https://pastebin.com/ydM4t9Qc
https://pastebin.com/Jcm3pPR9
Nachtrag:
Und die Funktion, welche du oben abgebildet hast, ist NICHT die Funktion aus der Core.php. Da wurde was abgeändert!
1)
NULL
NULL
[]
Also bei mir sieht das so aus:
array(0) {
}
array(0) {
}
[]
Vielleicht je nach PHP Version etwas anders. Auf jeden Fall wäre das normal, wenn halt einfach keine Session da ist und du nicht eingeloggt bist.
2)
NULL
NULL
[{"id_staff":"9","surname":"Piet","prename":"Peter","birthda
Das kann ja wohl nicht sein ;) Ausser du hast da wieder was überschrieben mit $session['name']='Piet'. Bloss hast du das ja um 15:05 verschwiegen.
Jetzt machen wir mal folgendes:
Ich habe ein Datei, welche dich sofort einloggt, bzw. eine Session erstellt. Das rufst du vor dem helper einmal auf.
quicklogin.php
<?php
/*
* Achtung: Diese Datei wieder löschen, wenn man sie nicht mehr braucht!!!
*/
session_start();
session_regenerate_id(true);
$_SESSION['name'] = 'Piet';
$_SESSION['loggedin'] = TRUE;
var_dump($_SESSION);
echo '<br>Session als <b>' . $_SESSION['name'] . '</b> erstellt.';
Und in der actions.php nehmen wir session_start an den Anfang der Datei und aktivieren die Fehlermeldungen wieder:
https://pastebin.com/hi6C3R0x
https://pastebin.com/ydM4t9Qc
https://pastebin.com/Jcm3pPR9
Nachtrag:
Und die Funktion, welche du oben abgebildet hast, ist NICHT die Funktion aus der Core.php. Da wurde was abgeändert!
Dein Problem liegt klar darin, dass du überhaupt keine Variable $_SESSION in der Zeile 397 hast. Das ist also noch bevor du die Funktion in der Core aufrufst. Das Schlimme ist, dass $_SESSION nicht etwa leer ist, sondern gar nicht da ist. Das ist nicht normal.
Das Einzige was man jetzt noch machen kann, ist die actions.php etwas gesprächiger zu machen und am Anfang ein paar Ausgaben einfügen.
https://pastebin.com/kcwGxR1c
Und auch immer das Server error log anschauen, ob da was ist.
Das Einzige was man jetzt noch machen kann, ist die actions.php etwas gesprächiger zu machen und am Anfang ein paar Ausgaben einfügen.
https://pastebin.com/kcwGxR1c
Und auch immer das Server error log anschauen, ob da was ist.
Das ist nun hart
Das $_POST ist richtig. Das $_COOKIE mit der PHP-Session-ID ist auch richtig.
Aber du hast einfach keine Session. Es fehlt die sessionid (aus der Zeile 10) und somit auch das $_SESSION (aus den Zeilen 12 und 404).
Das ist mir leider echt ein Rätsel. Die Session erstellen wir ja in Zeile 2 mit session_start() und im Error Log steht auch nichts davon, dass es zu einem Problem gekommen ist.
Letzter Testvorschlag, sonst muss ich passen. Erstell eine Datei mit folgendem Inhalt und ruf sie auf:
sessiontest.php
PS: Bitte entferne oben in deinem Post im errorlog noch deine IP Adresse und Domainnamen aus Gründern des Privatsphärenschutzes.
Das $_POST ist richtig. Das $_COOKIE mit der PHP-Session-ID ist auch richtig.
Aber du hast einfach keine Session. Es fehlt die sessionid (aus der Zeile 10) und somit auch das $_SESSION (aus den Zeilen 12 und 404).
Das ist mir leider echt ein Rätsel. Die Session erstellen wir ja in Zeile 2 mit session_start() und im Error Log steht auch nichts davon, dass es zu einem Problem gekommen ist.
Letzter Testvorschlag, sonst muss ich passen. Erstell eine Datei mit folgendem Inhalt und ruf sie auf:
sessiontest.php
<?php
session_start();
echo 'Wir testen die Session:<br>';
var_dump($_SESSION);
PS: Bitte entferne oben in deinem Post im errorlog noch deine IP Adresse und Domainnamen aus Gründern des Privatsphärenschutzes.
Da ist die Session vorhanden. Ich bin baff.
Jetzt hilft ja nur noch Zeile für Zeile ausprobieren. Brechen wir in der actions.php mal in der Zeile 17 mit exit ab.
Also so:
https://pastebin.com/xHBNJfnw
Jetzt hilft ja nur noch Zeile für Zeile ausprobieren. Brechen wir in der actions.php mal in der Zeile 17 mit exit ab.
Also so:
https://pastebin.com/xHBNJfnw
Die Textdaei conf.ini könnte ev. jeder im Browser aufrufen. Eine conf.php nicht, weil sie ja nur Code enthält.
So könntest du sie aufbauen:
In der Core und in der index.php (und da wo es vielleicht sonst noch vorkommt) ersetzt du die Zeile
mit
So könntest du sie aufbauen:
<?php
/**
* Konfigurationsdaten
*/
$conf = [
'host' => 'host.com',
'user' => 'sombeody',
'password' => 'geheim',
'name' => 'namederdatenbank',
'Settings' => [
'title' => 'irgend_ein_titel',
'day_begin_hour' => '8',
'andererKram' => 'abcd',
]
];
In der Core und in der index.php (und da wo es vielleicht sonst noch vorkommt) ersetzt du die Zeile
$conf = parse_ini_file(Core::$config_file);
bzw.
$conf = parse_ini_file("conf.ini", true);
require('conf.php');
Zitat von @martenk:
oder kann ich es auch so machen
<FilesMatch "\.(ini)$">
Order Deny,Allow
Deny from all
</FilesMatch>
oder kann ich es auch so machen
<FilesMatch "\.(ini)$">
Order Deny,Allow
Deny from all
</FilesMatch>
ja (zwar nicht geprüft) oder in der .htaccess.
Aber die Variante mit php ist wesentlich eleganter, weil es keine Serverkonfiguration braucht. Auch immer dran denken, dass du das Projekt mal auf einen anderen Server schieben könntest und dann vergisst die Konfiguration zu machen.