martenk
Goto Top

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

<?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";  
...
...
dann funktieren die if Abfragen

Content-ID: 7289924802

Url: https://administrator.de/forum/php-session-arbeitet-nicht-richtig-7289924802.html

Ausgedruckt am: 22.12.2024 um 07:12 Uhr

7010350221
7010350221 24.05.2023 aktualisiert um 16:29:16 Uhr
Goto Top
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
<?php
class Core {
    public static function getStaffList($session) {
         if ($session['name'] =="Olaf") {$sql = '.......';}  
         // .....
Hauptskript
<?php
session_start();
$staff = Core::getStaffList($_SESSION);

Gruß.
martenk
martenk 24.05.2023 um 16:04:59 Uhr
Goto Top
Übergebe die Session-Variable als Parameter an die Funktion dann klappt das?

kannst du mir das bitte erklären
7010350221
7010350221 24.05.2023 aktualisiert um 16:07:31 Uhr
Goto Top
s. ergänztes Beispiel o.
martenk
martenk 24.05.2023 um 16:15:15 Uhr
Goto Top
alles so gemacht wie du geschrieben hast - klappt nicht - ohne Meldung
7010350221
7010350221 24.05.2023 aktualisiert um 16:28:39 Uhr
Goto Top
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. 🖖
martenk
martenk 24.05.2023 um 16:27:35 Uhr
Goto Top
function getStaffListAction(){

    Core::connectDB();
    $staff = Core::getStaffList($_SESSION);
    echo json_encode($staff);
    //echo var_dump($patients);
    Core::closeDB();
    exit;
}
7010350221
7010350221 24.05.2023 aktualisiert um 16:30:31 Uhr
Goto Top
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...!!
Xaero1982
Xaero1982 24.05.2023 um 16:30:53 Uhr
Goto Top
Zitat von @martenk:

Hallo Gemeinschaft,

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

<?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'];   
in der Function würdest du ganz schnell feststellen, ob du dort eine Ausgabe hast. Vermutlich nicht.
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";  
...
...
dann funktieren die if Abfragen

Was funktioniert denn dann?
7010350221
7010350221 24.05.2023 aktualisiert um 16:34:12 Uhr
Goto Top
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.
martenk
martenk 24.05.2023 um 16:34:16 Uhr
Goto Top
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
7010350221
7010350221 24.05.2023 aktualisiert um 16:37:36 Uhr
Goto Top
Und wieso klappt es hier dann doch face-wink?!
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...)
Xaero1982
Xaero1982 24.05.2023 um 16:39:28 Uhr
Goto Top
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

Na dann poste uns doch mal den Code davon wie du es versucht hast?
MirkoKR
MirkoKR 24.05.2023 um 16:39:30 Uhr
Goto Top
hi.

... mal eime Verständnisfrage:

In deinem Code listest du Vornamen. in deiner Query surname.

surname ist aber übersetzt Nachname ...
... sicher das du das richtige Datenfeld der DB abfragst?
.
martenk
martenk 24.05.2023 um 16:41:47 Uhr
Goto Top
ja - wenn ich in der core.php im kopf die session erneut definiere, dann klappt die anschliessende Anzeige
Xaero1982
Xaero1982 24.05.2023 um 16:43:12 Uhr
Goto Top
Zitat von @martenk:

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?
7010350221
7010350221 24.05.2023 aktualisiert um 16:46:38 Uhr
Goto Top
$_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 ...
martenk
martenk 24.05.2023 um 16:45:59 Uhr
Goto Top
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
martenk
martenk 24.05.2023 aktualisiert um 16:47:57 Uhr
Goto Top
@7010350221 - hatte ich gemacht
public static function getStaffList($_SESSION) {


		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
Xaero1982
Xaero1982 24.05.2023 um 16:47:47 Uhr
Goto Top
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 ...

vielleicht hättest du den Parameter "Peter" nennen sollen oder so, damit es auffällt face-smile
7010350221
7010350221 24.05.2023 aktualisiert um 16:50:59 Uhr
Goto Top
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. 🐟
Xaero1982
Xaero1982 24.05.2023 um 16:48:51 Uhr
Goto Top
Zitat von @martenk:

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 face-smile
7010350221
7010350221 24.05.2023 aktualisiert um 16:49:55 Uhr
Goto Top
Zitat von @Xaero1982:
vielleicht hättest du den Parameter "Peter" nennen sollen oder so, damit es auffällt face-smile
Im nachhinein wohl wahr face-big-smile.
martenk
martenk 24.05.2023 um 16:51:06 Uhr
Goto Top
public static function getStaffList($_SESSION) {


		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
7010350221
7010350221 24.05.2023 aktualisiert um 16:53:11 Uhr
Goto Top
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 sag ja, neue Brille ist fällig!!
martenk
martenk 24.05.2023 um 16:52:15 Uhr
Goto Top
function getStaffListAction(){

    Core::connectDB();
    $staff = Core::getStaffList($_SESSION);
    echo json_encode($staff);
    //echo var_dump($patients);
    Core::closeDB();
    exit;
}
Xaero1982
Xaero1982 24.05.2023 um 16:53:00 Uhr
Goto Top
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) { 
7010350221
7010350221 24.05.2023 aktualisiert um 16:56:35 Uhr
Goto Top
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.
public static function getStaffList($_session) { 
In dem Fall aber $session ohne Unterstrich.

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
Xaero1982
Xaero1982 24.05.2023 um 16:56:25 Uhr
Goto Top
Zitat von @7010350221:

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.
public static function getStaffList($session) { 
In dem Fall aber $session ohne Unterstrich.

Der TO sollte sich mal Funktionsgrundlagen aneignen
https://www.php.net/manual/de/functions.arguments.php

ach je ... natürlich!
7010350221
7010350221 24.05.2023 aktualisiert um 16:57:57 Uhr
Goto Top
Ach herjemineh mit dem Variablennamen habe ich im wahrsten Sinne des Wortes in die ###e gegriffen face-big-smile.
martenk
martenk 24.05.2023 um 16:59:14 Uhr
Goto Top
nun so - ohne Änderung
 public static function getStaffList($session) {

		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
7010350221
7010350221 24.05.2023 aktualisiert um 17:01:15 Uhr
Goto Top
Irgendwie fühle ich mich bei diesem Thread hier an diese Szene erinnert😂

Xaero1982
Xaero1982 24.05.2023 um 17:02:28 Uhr
Goto Top
Zitat von @martenk:

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?
martenk
martenk 24.05.2023 um 17:03:59 Uhr
Goto Top
jupp
Xaero1982
Xaero1982 24.05.2023 um 17:04:35 Uhr
Goto Top
Zitat von @martenk:

jupp

Dann bitte nochmal den gesamten Code - danke face-smile
martenk
martenk 24.05.2023 um 17:05:43 Uhr
Goto Top
gibt es noch eine andere Möglichkeit, wie ich die session var in die function bekomme?
Xaero1982
Xaero1982 24.05.2023 um 17:12:59 Uhr
Goto Top
Zitat von @martenk:

gibt es noch eine andere Möglichkeit, wie ich die session var in die function bekomme?

poste doch nochmal deinen aktuellen Code bitte.
martenk
martenk 24.05.2023 aktualisiert um 17:16:26 Uhr
Goto Top
<?php
session_start();

include('classes/Core.php');  
function getStaffListAction(){

    Core::connectDB();
    $staff = Core::getStaffList($_SESSION);
    echo json_encode($staff);
    //echo var_dump($patients);
    Core::closeDB();
    exit;
}

public static function getStaffList($session) {


		if ($session['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}  
		
		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
	
Xaero1982
Xaero1982 24.05.2023 um 17:18:13 Uhr
Goto Top
Und das ist der gesamte Code? Besonders im unteren Teil? Damit meine ich jetzt nicht die "fehlenden" IF-Anweisungen.
Davor nichts? Danach nichts?
martenk
martenk 24.05.2023 um 17:20:10 Uhr
Goto Top
 
public static function getStaffList($session) {


		if ($session['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}  
		
		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
$result = Core::$link->query($sql);
Xaero1982
Xaero1982 24.05.2023 um 17:21:26 Uhr
Goto Top
Aber ich hab doch oben gefragt ob du class core ... davor hast?

https://www.php.net/manual/en/function.error-reporting.php

Bitte aktivieren
martenk
martenk 24.05.2023 um 17:21:32 Uhr
Goto Top
ich verstehe nur nicht,

dass wenn ich in der core.php mit
session_start();
$_SESSION['name'] ="Piet";  

starte, dass dann die if Abfrage funktioniert
7010350221
7010350221 24.05.2023 aktualisiert um 17:24:53 Uhr
Goto Top
martenk
martenk 24.05.2023 um 17:25:26 Uhr
Goto Top
auf keine Fall - ich habe nun in jeder Datei
error_reporting(E_ALL);
eingefügt - ich bekomme keine Meldungen
martenk
martenk 24.05.2023 um 17:27:25 Uhr
Goto Top
class Core {
public static function getStaffList($session) {


		if ($session['name'] =="Susanne") {$sql = "SELECT * FROM staff where surname = 'Susanne'";}  
		
		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
$result = Core::$link->query($sql);

...
}
michi1983
michi1983 24.05.2023 um 18:34:13 Uhr
Goto Top
🍿 mampf
Xaero1982
Xaero1982 24.05.2023 um 19:08:12 Uhr
Goto Top
Woher kommt denn deine $_SESSION['name'] eigentlich?
Was sagt denn eigentlich ein var_dump($_SESSION)?
HansFenner
HansFenner 25.05.2023 um 00:55:32 Uhr
Goto Top
Zitat von @Xaero1982:

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.
martenk
martenk 25.05.2023 um 07:52:42 Uhr
Goto Top
Hallo Hans - der vardump gibt den Wert Piet aus - auch der Post, wenn ich mich mit Piet anmelde ebenfalls
martenk
martenk 25.05.2023 um 07:54:39 Uhr
Goto Top
das ist der vardump ->array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(13) }
martenk
martenk 25.05.2023 um 08:31:44 Uhr
Goto Top
die session var kommt einfach nicht in die function an
7010350221
7010350221 25.05.2023 aktualisiert um 08:35:31 Uhr
Goto Top
Zitat von @martenk:

die session var kommt einfach nicht in die function an
https://tio.run/##VY/BisJADIbPk6cIpVD1EezKHhYPguhhjiIyDpltYdqOMykK0mevca ...
Works as designed ... RTFM.
martenk
martenk 25.05.2023 um 09:15:56 Uhr
Goto Top
Ich habe nun diesen Code in der actions.php drin
<?php
session_start();
//$_SESSION['name'] = 'Piet'; 

include('classes/Core.php');  
Core::connectDB();
echo Core::getStaffList($_SESSION);
Core::closeDB();

bekomme aber nur "array" angezeigt
Xaero1982
Xaero1982 25.05.2023 um 09:30:38 Uhr
Goto Top
Mach doch mal nach session_start(); ein var_dump($_SESSION);
martenk
martenk 25.05.2023 um 09:35:26 Uhr
Goto Top
Fatal error: Uncaught ValueError: mysqli::query(): Argument #1 ($query) cannot be empty in /is/htdocswww/kalender/classes/Core.php:281 Stack trace: /is/htdocswww/kalender/classes/Core.php(281): mysqli->query('') #1 /is/htdocswww/kalender/actions.php(8): Core::getStaffList(NULL) #2 {main} thrown in /is/htdocswww/kalender/classes/Core.php on line 281

 public static function getStaffList($session) {
		...
		if ($session['name'] =="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
		
		//$sql = "SELECT * FROM staff"; 
		
                $result = Core::$link->query($sql); //das ist die Zeite 281
Xaero1982
Xaero1982 25.05.2023 um 09:37:41 Uhr
Goto Top
Du musst uns schon bissel erklären was du gemacht hast?
Hast du ein var_dump... eingefügt oder warum bekommst du nun diesen Fehler?
martenk
martenk 25.05.2023 um 09:39:50 Uhr
Goto Top
genau - habe es so gemacht, wie du gesagt hast

<?php
session_start();
var_dump($_SESSION);
//$_SESSION['name'] = 'Piet'; 

include('classes/Core.php');  
Core::connectDB();
echo Core::getStaffList($_SESSION);
Core::closeDB();
martenk
martenk 25.05.2023 um 09:40:57 Uhr
Goto Top
schreibe ich das in die core.php
<?php
session_start();

//var_dump($_SESSION);
$_SESSION['name']="Piet"  

bekomme ich NULL
Xaero1982
Xaero1982 25.05.2023 um 09:50:00 Uhr
Goto Top
und var_dump gibt dir keine Ausgabe? Dann kommt doch deine Session da gar nicht an.
Xaero1982
Xaero1982 25.05.2023 um 09:52:32 Uhr
Goto Top
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?!
7010350221
7010350221 25.05.2023 aktualisiert um 09:54:51 Uhr
Goto Top
Fröhliche Ratestunde face-big-smile ☕☕ schon zwei Tassen intus.... nur das Popkorn geht langsam zur Neige, ich fahr dann mal Nachschub holen.
martenk
martenk 25.05.2023 um 10:10:16 Uhr
Goto Top
wenn ich in der action.php das errorreporting einschalte

<?php
session_start();
error_reporting(E_ALL);
var_dump($_SESSION);

bekomme ic hdas
Warning: Undefined global variable $_SESSION in /is/htdocswww/kalender/actions.php on line 4
NULL
Warning: Undefined array key "action" in /is/htdocs
www/kalender/actions.php on line 470
martenk
martenk 25.05.2023 um 10:11:22 Uhr
Goto Top
das ist zeite 470
switch($_POST['action']){  
7010350221
7010350221 25.05.2023 aktualisiert um 10:28:03 Uhr
Goto Top
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 🤞.
martenk
martenk 25.05.2023 um 10:30:23 Uhr
Goto Top
im Moment rufe ich die action.php ja auch separat auf - daher der Fehler mit dem Post

ich hatte kurzzeitig in der core.php start_session rausgenommen - wenn ich es wieder aktiviere erhalte ich diese Meldung

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/htdocs
www/kalender/classes/Core.php on line 3

Warning: Undefined global variable $_SESSION in /is/htdocs//www/kalender/classes/Core.php on line 6
NULL
martenk
martenk 25.05.2023 aktualisiert um 10:32:18 Uhr
Goto Top
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
7010350221
7010350221 25.05.2023 aktualisiert um 10:35:43 Uhr
Goto Top
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??
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/htdocs
www/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.
also läuft doch die session
aber zu spät.
martenk
martenk 25.05.2023 um 10:47:06 Uhr
Goto Top
habe nun die php Dateien überprüft bzgl. Anfang und Ende

was mache ich denn mit dieser Meldung
Warning: session_start(): Session cannot be started after headers have already been sent in /is/htdocs//www/kalender/classes/Core.php on line 2
Xaero1982
Xaero1982 25.05.2023 um 10:52:20 Uhr
Goto Top
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();
Xaero1982
Xaero1982 25.05.2023 um 10:53:08 Uhr
Goto Top
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

Das läuft doch sicher nur, weil du wieder irgendwo was definiert hast oder nicht?
martenk
martenk 25.05.2023 aktualisiert um 11:07:00 Uhr
Goto Top
das ist die auth.php - hier wird die session definiert - ich habe jetzt überall die manuelle Definition rausgenommen

<?php
session_start();

$DATABASE_HOST = 'localhost';  
$DATABASE_USER = '-ts';  
$DATABASE_PASS = '#';  
$DATABASE_NAME = '-timescheduler';  

$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if ( mysqli_connect_errno() ) {
	
	exit('Failed to connect to MySQL: ' . mysqli_connect_error());  
}

// Now we check if the data from the login form was submitted, isset() will check if the data exists.
if ( !isset($_POST['surname'], $_POST['password']) ) {  
	// Could not get the data that should have been sent.
	exit('Please fill both the username and password fields!');  
}

// Prepare our SQL, preparing the SQL statement will prevent SQL injection.
if ($stmt = $con->prepare('SELECT id_staff, password FROM staff WHERE surname = ?')) {  
	// Bind parameters (s = string, i = int, b = blob, etc), in our case the username is a string so we use "s" 
	$stmt->bind_param('s', $_POST['surname']);  
	$stmt->execute();
	// Store the result so we can check if the account exists in the database.
	$stmt->store_result();
if ($stmt->num_rows > 0) {
	$stmt->bind_result($id_staff, $password);
	$stmt->fetch();
	// Account exists, now we verify the password.
	// Note: remember to use password_hash in your registration file to store the hashed passwords.
	if (password_verify($_POST['password'], $password)) {  
		// Verification success! User has logged-in!
		// Create sessions, so we know the user is logged in, they basically act like cookies but remember the data on the server.
		session_regenerate_id();
		$_SESSION['loggedin'] = TRUE;  
		$_SESSION['name'] = $_POST['surname'];  
		$_SESSION['id_staff'] = $id_staff;  
		//echo 'Welcome ' . $_SESSION['name'] . '!'; 
	} else {
		// Incorrect password
		echo 'Incorrect username and/or password!';  
	}
} else {
	// Incorrect username
	echo 'Incorrect username and/or password!';  
}

	$stmt->close();
}
?>
hier gehts weiter <a href="index.php">Kalender</a>  
martenk
martenk 25.05.2023 um 11:08:52 Uhr
Goto Top
wenn ich dort ein vardump mache
array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(9) }
HansFenner
HansFenner 25.05.2023 um 11:18:03 Uhr
Goto Top
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.

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.
martenk
martenk 25.05.2023 aktualisiert um 11:34:51 Uhr
Goto Top
Xaero1982
Xaero1982 25.05.2023 um 11:27:18 Uhr
Goto Top
Das sieht gut aus und hilft dann hier leider auch nicht weiter.

Schließe mich HansFenner an.
Xaero1982
Xaero1982 25.05.2023 um 11:40:42 Uhr
Goto Top
<?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.
martenk
martenk 25.05.2023 um 11:42:25 Uhr
Goto Top
die Zuweisung hatte ich nur testeweise drin - ist wieder raus

nur die If´s werden nicht beachtet
martenk
martenk 25.05.2023 um 11:46:18 Uhr
Goto Top
wo sollte ich diesen code deiner Meinung nach einbauen

Core::connectDB();
echo Core::getStaffList($_SESSION);
Core::closeDB();
Xaero1982
Xaero1982 25.05.2023 um 11:47:34 Uhr
Goto Top
Zurück zum Anfang: Die IF-Anweisungen werden nicht beachtet? Das ist das Problem?
Was passiert, wenn du innerhalb der Funktion ein echo $_SESSION['name']; machst?
Xaero1982
Xaero1982 25.05.2023 um 11:49:00 Uhr
Goto Top
Zitat von @martenk:

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?
martenk
martenk 25.05.2023 aktualisiert um 11:56:27 Uhr
Goto Top
es ist später ein Kalender - und die If Abfrage ist dafür da, das ein sql statement weiter verarbeitet wird

wenn ich innerhalb der function ein echo erstelle bricht die Verarbeitung ab

ja genau - die session in der function wird nicht beachtet
Xaero1982
Xaero1982 25.05.2023 um 11:59:39 Uhr
Goto Top
If = Anweisung face-smile = If-Anweisung

Was heißt es bricht ab? Was passiert genau?
michi1983
michi1983 25.05.2023 um 12:02:27 Uhr
Goto Top
Zitat von @martenk:

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.
martenk
martenk 25.05.2023 um 12:03:14 Uhr
Goto Top
dann kommt kein statement raus - nehme ich die Kommentierung raus, dann fuzt das script nicht mehr und der kalender bekommt keine Daten

    public static function getStaffList() {
//echo $_SESSION['name']; 
//echo "NAME"; 
		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";  
martenk
martenk 25.05.2023 aktualisiert um 12:06:02 Uhr
Goto Top
@michi - habe die drei Dateien oben eingestellt
an dieser function hängt es

public static function getStaffList - ich bekomme die session variable nicht in die function
Xaero1982
Xaero1982 25.05.2023 um 12:10:05 Uhr
Goto Top
WAS geht denn dann nicht? Fehlermeldung? Wenn ja, welche?
martenk
martenk 25.05.2023 um 12:13:35 Uhr
Goto Top
Ich bekomme keine Fehlermeldung -

ich habe nun in allen Dateien error_reporting(E_ALL); eingetragen
HansFenner
HansFenner 25.05.2023 aktualisiert um 17:52:19 Uhr
Goto Top
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:

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;
martenk
martenk 25.05.2023 um 18:06:48 Uhr
Goto Top
hi - lieben dank für deine Hilfe

das kommt dabei raus
POST: array(0) { }
SESSION: array(1) { ["name"]=> string(4) "Piet" }
martenk
martenk 25.05.2023 um 18:12:33 Uhr
Goto Top
nur wie bekomme ich die variable in die function in der core.php?
Xaero1982
Xaero1982 25.05.2023 um 18:27:15 Uhr
Goto Top
Das haben wir dir doch ganz oben schon erklärt und du hast es entweder nie drin gehabt oder wieder entfernt.
HansFenner
HansFenner 25.05.2023 um 18:42:38 Uhr
Goto Top
POST: array(0) { }

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 face-smile
include('classes/Core.php');  

echo "Session ID: " . session_id() . "\nPOST: ";  
var_dump($_POST);
echo "\nSESSION: ";  
var_dump($_SESSION);
exit;
Xaero1982
Xaero1982 25.05.2023 um 18:56:16 Uhr
Goto Top
POST ist leer, weil es ja gar nicht übergeben wird an die nächste Datei. Also ich kenne seine Logindatei nicht face-smile

Die Session id brauchst du nicht. Die wird erstellt, aber grds. brauchst du sie nur, wenn du kontrollieren willst, ob eine Session erstellt wurde bzw. vorhanden ist.
HansFenner
HansFenner 26.05.2023 um 00:03:29 Uhr
Goto Top
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.
HansFenner
HansFenner 26.05.2023 um 00:28:09 Uhr
Goto Top
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
<h1>Helper</h1>
<form action="action.php" method="POST">  
<input id="action" name="action" value="get_stafflist">  
<button type="submit">Submit</button>  
</form>
martenk
martenk 26.05.2023 um 08:03:55 Uhr
Goto Top
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 {
evgnbz
evgnbz 26.05.2023 aktualisiert um 09:07:27 Uhr
Goto Top
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
class Core {
gibts da weitere zeilen ?

pt2 mach mal ein übersicht mit allen eingebundenen dateien inkl quellcode ... sonst ist es unübersichtlich
martenk
martenk 26.05.2023 um 09:58:45 Uhr
Goto Top
Xaero1982
Xaero1982 26.05.2023 um 10:17:23 Uhr
Goto Top
Also ich sehe da kein Loginformular in der Index? Wo loggst du dich denn ein?
martenk
martenk 26.05.2023 um 10:25:03 Uhr
Goto Top
sorry - vergessen
https://pastebin.com/nd1SP9eK -> index1.html
7010350221
7010350221 26.05.2023 aktualisiert um 10:28:42 Uhr
Goto Top
Dies ist der 100ste Post. Herzlichen Glückwunsch, du hast den 99 Post erreicht, beim nächsten Post gewinnst du einen PHP-Grundkurs. 🖖
Xaero1982
Xaero1982 26.05.2023 um 11:11:30 Uhr
Goto Top
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
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.
martenk
martenk 26.05.2023 um 11:26:53 Uhr
Goto Top
habs genauso eingefügt wie du geschrieben hast - der sql dump ist dann leer obwohl ich mich mit Olaf angemeldet habe
Xaero1982
Xaero1982 26.05.2023 um 12:07:36 Uhr
Goto Top
Du hast da jetzt aber nicht $PARAMETER eingetragen oder? face-smile
7010350221
7010350221 26.05.2023 um 12:11:46 Uhr
Goto Top
Achtung heute ist Freitag face-smile. 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*.
martenk
martenk 26.05.2023 aktualisiert um 12:38:06 Uhr
Goto Top
nein - ich habe in der action.php und core es so eingetragen
$_SESSION['name']
Xaero1982
Xaero1982 26.05.2023 um 12:48:59 Uhr
Goto Top
Zitat von @martenk:

nein - ich habe in der action.php und core es so eingetragen
$_SESSION['name']

Zitat von @7010350221:

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 sag ja, neue Brille ist fällig!!

Ich gebe langsam auf....
evgnbz
evgnbz 26.05.2023 um 12:58:25 Uhr
Goto Top
was willst du mit diesen script erreichen ?
bitte die aufgabe dieses projekts beschreiben
martenk
martenk 26.05.2023 aktualisiert um 13:05:20 Uhr
Goto Top
Lieben DAnk für deine Mühe
in der core.php
public static function getStaffList($session){

if ($session=="Piet") {$sql = "SELECT * FROM staff where surname = 'Piet'";}  
if ($session=="Olaf") {$sql = "SELECT * FROM staff where surname = 'Olaf'";}  
...

und in der action.php 
function getStaffAction($_SESSION['name']){  
 Core::connectDB();
    $staff = Core::getStaffList($_SESSION['name']);  
    echo json_encode($staff);
    //echo var_dump($patients);
    Core::closeDB();
    exit;
}
martenk
martenk 26.05.2023 um 13:01:51 Uhr
Goto Top
@evgnbz
ich habe eine session variable und möchte anhand einer function in der core.php ein sql statement ausgegeben bekommen
evgnbz
evgnbz 26.05.2023 um 13:05:15 Uhr
Goto Top
Zitat von @martenk:

@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
7010350221
7010350221 26.05.2023 um 13:08:47 Uhr
Goto Top
Das gibt dieses Jahr nix mehr.
evgnbz
evgnbz 26.05.2023 um 13:11:25 Uhr
Goto Top
Zitat von @7010350221:

Das gibt dieses Jahr nix mehr.

bin mit meinen latein am ende , einfach ignorieren
martenk
martenk 26.05.2023 um 13:16:18 Uhr
Goto Top
Ist denn die action.php so richtig?

function getStaffAction($_SESSION['name']){  
Core::connectDB();
$staff = Core::getStaffList($_SESSION['name']);  
echo json_encode($staff);
//echo var_dump($patients);
Core::closeDB();
exit;
}
martenk
martenk 26.05.2023 um 14:11:59 Uhr
Goto Top
... aber die action.php kann doch so garnicht funktionieren - da sollte ich doch den session_start() rausnehmen
evgnbz
evgnbz 26.05.2023 aktualisiert um 14:52:13 Uhr
Goto Top
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
7010350221
7010350221 26.05.2023 aktualisiert um 16:23:19 Uhr
Goto Top
Füge das in dein PHP-Skript ein, dann ab ins Wochenende und Dienstag haben sich deine Probleme von selbst gelöst 👌
while(1);
Xaero1982
Xaero1982 26.05.2023 um 16:24:58 Uhr
Goto Top
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.
HansFenner
HansFenner 26.05.2023 um 17:36:35 Uhr
Goto Top
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 face-smile

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.
martenk
martenk 29.05.2023 um 10:41:33 Uhr
Goto Top
guten morgen - nach Ausführung der neuen helper passiert leider nichts
7010350221
7010350221 29.05.2023 um 11:34:26 Uhr
Goto Top
Mein Beileid.
martenk
martenk 30.05.2023 um 10:52:36 Uhr
Goto Top
kann es evtl am Provider liegen, dass es bei Hans geht und bei mir nicht?
7010350221
7010350221 30.05.2023 aktualisiert um 10:56:20 Uhr
Goto Top
Zitat von @martenk:

kann es evtl am Provider liegen, dass es bei Hans geht und bei mir nicht?
VM aufsetzen LAMP und deine Seite drauf klatschen und du bist schlauer!
martenk
martenk 30.05.2023 um 13:18:52 Uhr
Goto Top
Das war ja ursprünglich mein Problem, dass es mit XAMPP funktionierte - also local
7010350221
7010350221 30.05.2023 um 13:19:35 Uhr
Goto Top
Zitat von @martenk:

Das war ja ursprünglich mein Problem, dass es mit XAMPP funktionierte - also local
🙈 XAMPP ≠ LAMP
Xaero1982
Xaero1982 30.05.2023 um 21:35:49 Uhr
Goto Top
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 face-smile
HansFenner
HansFenner 30.05.2023 um 22:40:31 Uhr
Goto Top
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 face-smile

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.
HansFenner
HansFenner 30.05.2023 um 22:49:50 Uhr
Goto Top
Zitat von @martenk:

kann es evtl am Provider liegen, dass es bei Hans geht und bei mir nicht?

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.
Xaero1982
Xaero1982 31.05.2023 um 09:11:50 Uhr
Goto Top
Zitat von @HansFenner:

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

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

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.
HansFenner
HansFenner 31.05.2023 um 10:26:07 Uhr
Goto Top
@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' face-smile
7010350221
7010350221 31.05.2023 aktualisiert um 10:36:05 Uhr
Goto Top
Wobei wir wieder ganz am Anfang sind. Der Kreis schließt sich. face-smile
Fazit wie schon ganz zu Beginn angeboten: Lernen, Lernen, Lernen ...
evgnbz
evgnbz 31.05.2023 aktualisiert um 15:28:33 Uhr
Goto Top
Zitat von @7010350221:

Wobei wir wieder ganz am Anfang sind. Der Kreis schließt sich. face-smile
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 ich schon solche aufzählungen sehe denke ich an schleifen u array und ich bin bei weiten kein programierer....
martenk
martenk 02.06.2023 um 09:02:46 Uhr
Goto Top
Liebe Antworter ich möchte mich erst einmal bedanken für eure bisherige Mühe mir zu helfen - ich habe noch eine abschliessende Frage, die ich nicht verstehe

es geht um die Datei core.php in der u.a. diser für mich im moment wichtige code steht

 public static function getStaffList($session){

          if ($session['name'] =="admin" || $session['name'] =="Piet") {  
                $sql = "SELECT * FROM staff";  
          }
          else {
                $sql = "SELECT * FROM staff where surname = '".$session['name']."'";  
          }

        $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;
        }

        return $return;
    }

mache ich einen var_dump auf die session bekomme ich das
das ist der vardump ->array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(13) }

und die Funktion gibt kein result
trage ich der Kopfzeile der Datei diesen term ein - dann funktioniert es
$_SESSION = array("loggedin"=> true, "name"=>"Piet", "id_staff"=> 13);  
HansFenner
HansFenner 02.06.2023 aktualisiert um 10:56:41 Uhr
Goto Top
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
<?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 face-smile
HansFenner
HansFenner 02.06.2023 aktualisiert um 11:18:33 Uhr
Goto Top
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;
    }
}
martenk
martenk 02.06.2023 um 11:14:27 Uhr
Goto Top
Hallo Hans - wenn ich es mit dem helper aufrufe bekomme ich diese Meldung
Die von Ihnen gewünschte Seite ist aufgrund von Wartungsarbeiten temporär nicht erreichbar.


Bitte versuchen Sie es zu einem späteren Zeitpunkt noch einmal.


This site is temporarily down for maintenance.


Please try again later.
HansFenner
HansFenner 02.06.2023 um 11:21:45 Uhr
Goto Top
Oh mein Gott face-smile

Was hat das nun mit PHP zu tun? face-smile face-smile

Jetzt brauch ich einen Schnaps und geb auf.
martenk
martenk 02.06.2023 um 11:26:37 Uhr
Goto Top
lieben dank für den versuch - prost face-smile
evgnbz
evgnbz 02.06.2023 um 11:43:35 Uhr
Goto Top
Zitat von @martenk:
"This site is temporarily down for maintenance."
lieben dank für den versuch - prost face-smile

sehe xammp oder lamp ... lokal programieren und dann hochladen
martenk
martenk 02.06.2023 um 11:44:32 Uhr
Goto Top
jetzt kommt zumindest die Meldung nicht mehr - aber auch keine Textmeldungen, wie im script zu vermuten wären
martenk
martenk 02.06.2023 aktualisiert um 11:45:54 Uhr
Goto Top
evgnbz: local geht es ja - das gesamte script funktioniert local korrekt
evgnbz
evgnbz 02.06.2023 um 12:31:33 Uhr
Goto Top
Zitat von @martenk:

evgnbz: local geht es ja - das gesamte script funktioniert local korrekt

dann an hosting anbieter wenden und das problem klären
martenk
martenk 02.06.2023 um 12:44:51 Uhr
Goto Top
Schon gemacht - die können sich das nicht erklären
HansFenner
HansFenner 02.06.2023 aktualisiert um 13:08:27 Uhr
Goto Top
Problem weiter vereinfachen face-smile
ausgabe.php
<?php
echo 'Wenn das nicht angezeigt wird, hat der Webserver oder PHP ein Problem.';  

Und natürlich Serverlogs kontrollieren, sowohl das access.log als auch das error.log.
martenk
martenk 02.06.2023 um 13:11:21 Uhr
Goto Top
das geht face-smile

mir ist nach wie vor das nicht klar

...
mache ich einen var_dump auf die session bekomme ich das
das ist der vardump ->array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(13) }

und die Funktion gibt kein result
trage ich der Kopfzeile der Datei diesen term ein - dann funktioniert es
$_SESSION = array("loggedin"=> true, "name"=>"Piet", "id_staff"=> 13);
martenk
martenk 02.06.2023 um 13:24:59 Uhr
Goto Top
anderen webserver verwendet von ionos - gleiches Problem
HansFenner
HansFenner 02.06.2023 um 16:26:18 Uhr
Goto Top
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:
<?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?
martenk
martenk 02.06.2023 um 17:00:15 Uhr
Goto Top
[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
7010350221
7010350221 02.06.2023 aktualisiert um 17:13:31 Uhr
Goto Top
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

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();
HansFenner
HansFenner 02.06.2023 aktualisiert um 17:47:24 Uhr
Goto Top
Ä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
HansFenner
HansFenner 02.06.2023 aktualisiert um 17:46:01 Uhr
Goto Top
Hoppla, ich hab einen Fehler bei mir entdeckt face-smile

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
martenk
martenk 05.06.2023 um 08:40:24 Uhr
Goto Top
guten morgen - das ist die Ausgabe
display_errors = 1 display_startup_errors =
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
Wenn das nicht angezeigt wird, hat der Webserver oder PHP ein Problem.Start der action.php: Session ID: POST: array(0) { } SESSION:
Warning: Undefined global variable $_SESSION in /is/htdocs/vv/www/kalender3/hans.php on line 21
NULL COOKIE: array(10) { ["cmplz_consented_services"]=> string(0) "" ["cmplz_policy_id"]=> string(2) "16" ["cmplz_functional"]=> string(5) "allow" ["cmplz_marketing"]=> string(4) "deny" ["cmplz_statistics"]=> string(4) "deny" ["cmplz_preferences"]=> string(4) "deny" ["wp-settings-1"]=> string(36) "editor=tinymce&libraryContent=browse" ["wp-settings-time-1"]=> string(10) "1681831593" ["cmplz_banner-status"]=> string(9) "dismissed" ["PHPSESSID"]=> string(32) "d5fe7db49f6abb34c0676b4c1549d9a4" } Das ist keine gültige Aktion: undefiniert
HansFenner
HansFenner 05.06.2023 aktualisiert um 10:36:30 Uhr
Goto Top
Ok, das sieht ja schon mal sehr gut aus. Man weiss vor lauter Fehlern gar nicht, wo anfangen.

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 geht schon nicht mehr face-smile

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 face-smile 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 face-smile
martenk
martenk 05.06.2023 um 10:45:25 Uhr
Goto Top
Hallo Hans,

zu Punkt 1

das ist mein core Anfang
<?php
session_start();
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.';  
class Core {
martenk
martenk 05.06.2023 um 10:48:29 Uhr
Goto Top
das erhalte ich mit der helper.html
display_errors = 1
display_startup_errors = 


Warning:  session_start(): Session cannot be started after headers have already been sent in /is/htdocs/wp1159669_71MX4I9V6J/www/kalender3/classes/Core.php on line 2

Wenn das nicht angezeigt wird, hat der Webserver oder PHP ein Problem.Start der action.php:
Session ID: 
POST: array(1) {
  ["action"]=>  
  string(13) "get_stafflist"  
}

SESSION: 

Warning:  Undefined global variable $_SESSION in /is/htdocs/vv/www/kalender3/hans.php on line 21

NULL

COOKIE: array(10) {
  ["cmplz_consented_services"]=>  
  string(0) ""  
  ["cmplz_policy_id"]=>  
  string(2) "16"  
  ["cmplz_functional"]=>  
  string(5) "allow"  
  ["cmplz_marketing"]=>  
  string(4) "deny"  
  ["cmplz_statistics"]=>  
  string(4) "deny"  
  ["cmplz_preferences"]=>  
  string(4) "deny"  
  ["wp-settings-1"]=>  
  string(36) "editor=tinymce&libraryContent=browse"  
  ["wp-settings-time-1"]=>  
  string(10) "1681831593"  
  ["cmplz_banner-status"]=>  
  string(9) "dismissed"  
  ["PHPSESSID"]=>  
  string(32) "d5fe7db49f6abb34c0676b4c1549d9a4"  
}


Fatal error:  Uncaught TypeError: Cannot access offset of type string on string in /is/htdocs/vv/www/kalender3/classes/Core.php:253
Stack trace:
#0 /is/htdocs/vv/www/kalender3/hans.php(41): Core::getStaffList('undefiniert') 
#1 {main}
  thrown in /is/htdocs/vv/www/kalender3/classes/Core.php on line 253
HansFenner
HansFenner 05.06.2023 um 11:19:11 Uhr
Goto Top
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
martenk
martenk 05.06.2023 um 11:23:49 Uhr
Goto Top
hier das Ergebnis
display_errors = 1
display_startup_errors =


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

Start der action.php:
Session ID:
POST: array(1) {
["action"]=>
string(13) "get_stafflist"
}

SESSION:

Warning: Undefined global variable $_SESSION in /is/htdocs/vv/www/kalender3/hans.php on line 21

NULL

COOKIE: array(10) {
["cmplz_consented_services"]=>
string(0) ""
["cmplz_policy_id"]=>
string(2) "16"
["cmplz_functional"]=>
string(5) "allow"
["cmplz_marketing"]=>
string(4) "deny"
["cmplz_statistics"]=>
string(4) "deny"
["cmplz_preferences"]=>
string(4) "deny"
["wp-settings-1"]=>
string(36) "editor=tinymce&libraryContent=browse"
["wp-settings-time-1"]=>
string(10) "1681831593"
["cmplz_banner-status"]=>
string(9) "dismissed"
["PHPSESSID"]=>
string(32) "d5fe7db49f6abb34c0676b4c1549d9a4"
}

Start der Funktion getStaffList() in core.php:
Username: undefiniert
Die Welt ist schlecht. User: undefiniert
Irgendwelche Daten
HansFenner
HansFenner 05.06.2023 aktualisiert um 12:27:46 Uhr
Goto Top
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
<?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';  
martenk
martenk 05.06.2023 um 12:43:17 Uhr
Goto Top
kommt nun "Hallo"
HansFenner
HansFenner 05.06.2023 um 14:41:58 Uhr
Goto Top
Gut, ich habe in meiner action.php noch am Anfang 2 Zeilen vergessen auszukommentieren. face-smile
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.
martenk
martenk 05.06.2023 um 15:08:48 Uhr
Goto Top
nun bekomme ich endlich was gutes face-smile
Start der action.php:
Session ID: d5fe7db49f6abb34c0676b4c1549d9a4
POST: array(1) {
["action"]=>
string(13) "get_stafflist"
}

SESSION: array(3) {
["loggedin"]=>
bool(true)
["name"]=>
string(4) "Piet"
["id_staff"]=>
int(9)
}

COOKIE: array(10) {
["cmplz_consented_services"]=>
string(0) ""
["cmplz_policy_id"]=>
string(2) "16"
["cmplz_functional"]=>
string(5) "allow"
["cmplz_marketing"]=>
string(4) "deny"
["cmplz_statistics"]=>
string(4) "deny"
["cmplz_preferences"]=>
string(4) "deny"
["wp-settings-1"]=>
string(36) "editor=tinymce&libraryContent=browse"
["wp-settings-time-1"]=>
string(10) "1681831593"
["cmplz_banner-status"]=>
string(9) "dismissed"
["PHPSESSID"]=>
string(32) "d5fe7db49f6abb34c0676b4c1549d9a4"
}

Start der Funktion getStaffList() in core.php:
Username: Piet
Die Welt ist gut. User: Piet
Irgendwelche Daten
HansFenner
HansFenner 05.06.2023 aktualisiert um 16:03:08 Uhr
Goto Top
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.
martenk
martenk 05.06.2023 um 16:40:09 Uhr
Goto Top
super klasse - kommt auch ein gutes db result
martenk
martenk 05.06.2023 um 17:16:14 Uhr
Goto Top
ich kann vermutlich mit dem alten code der index.php und der core und actions nichts mehr anfangen ?
HansFenner
HansFenner 05.06.2023 aktualisiert um 17:40:25 Uhr
Goto Top
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
<?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
HansFenner
HansFenner 05.06.2023 um 18:53:52 Uhr
Goto Top
Wenn wir es schon von Sicherheitslöchern haben, hier grad noch ein schlimmes. Schauen wir uns mal diesen Code an:
            $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 * face-smile
b) Sicherer ist folgende Variante (ich kenn ja nur 2 Feldnamen, halt einfach den Rest ergänzen):
                $staff[] = [
                    'birthday' => $row['birthday'],  
                    'surname' => $row['surname'],  
                ];
Somit werden garantiert nur die benötigten Felder zurückgegeben.
HansFenner
HansFenner 05.06.2023 aktualisiert um 19:46:17 Uhr
Goto Top
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.
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
martenk
martenk 06.06.2023 um 11:58:13 Uhr
Goto Top
Lieben Dank für deine top Ausführungen - ich versuche dann mal die functions umzuschreiben

noch eine Frage - es gab doch keine andere Möglichkeit bei dem alten Script die Session Variable in getStaffListAction zu bekommen oder?
HansFenner
HansFenner 06.06.2023 um 14:21:09 Uhr
Goto Top
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.
martenk
martenk 06.06.2023 um 14:38:26 Uhr
Goto Top
Hallo Hans - lieben Dank nochmals für deine Mühe - bekomme nur leider die index.php hinten und vorne nicht mehr zum Laufen - du sagtest doch, generell kann ich diese weiter verwenden - oder?
HansFenner
HansFenner 06.06.2023 um 16:26:41 Uhr
Goto Top
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.
                    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.
martenk
martenk 06.06.2023 aktualisiert um 17:08:45 Uhr
Goto Top
das fürchte ich auch - verstehe nur nicht die Fehler - in meiner index.php finde ich die nicht
HansFenner
HansFenner 06.06.2023 um 17:58:38 Uhr
Goto Top
Was du hochgeladen hast:
https://pastebin.com/X2i68M8R
martenk
martenk 06.06.2023 um 22:13:46 Uhr
Goto Top
martenk
martenk 07.06.2023 um 09:20:13 Uhr
Goto Top
sehe auch bei der ersten index nicht deine gezeigten fehler
HansFenner
HansFenner 07.06.2023 um 10:59:19 Uhr
Goto Top
Zitat von @martenk:

sehe auch bei der ersten index nicht deine gezeigten fehler
Und da haben wir auch genau das Hauptproblem. Du hast einfach keinerlei Kenntnisse, wie man Fehlern auf den Grund geht. face-smile

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.
martenk
martenk 07.06.2023 um 11:26:11 Uhr
Goto Top
habe die index.php in note++ kopiert - und finde nach wie vor deinen angezeigten Fehler nicht
HansFenner
HansFenner 07.06.2023 um 12:48:00 Uhr
Goto Top
Ich hab keine Ahnung, was du machst face-smile

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!
evgnbz
evgnbz 07.06.2023 um 12:56:55 Uhr
Goto Top
wenns unbedingt notepad++ sein soll suche nach "notepad++ php autocomplete plugin" https://github.com/StanDog/npp-phpautocompletion zb
martenk
martenk 07.06.2023 um 12:57:35 Uhr
Goto Top
Hallo Hans - z.b. 1550 steht bei mir das in der index.php

var startDate = new Date(date);
martenk
martenk 07.06.2023 um 13:05:30 Uhr
Goto Top
habe mit das studio runtergeladen - lieben Dank für den Tip

aber auch dort sehe ich nicht den fehler

         var dayCount = null;
                if(dayview === true || $("#day-view-check:checked").val()){  
                    //var myDate = new Date(date);
                    updateWeekDayDiv(date);
                }
                else{
                    //alert(date);
                    var inputDate = new Date(date);
                    //alert(inputDate);
                    var startDate = new Date(date);
HansFenner
HansFenner 07.06.2023 aktualisiert um 14:26:05 Uhr
Goto Top
Zitat von @martenk:

Hallo Hans - z.b. 1550 steht bei mir das in der index.php

var startDate = new Date(date);

So geil face-smile Mein Firefox Browser verschluckt Zeichen face-smile
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 face-smile Sachen gibt's.
martenk
martenk 07.06.2023 um 14:27:16 Uhr
Goto Top
kein Thema - ich bin dir so unendlich dankbar für deine Geduld und wissen - aber u hast recht - es wäre natürlich absolt toll gewesen, wenn man es hinbekommen hätte, dass in den alten core code die session var in die function gekommen wäre face-smile
HansFenner
HansFenner 07.06.2023 um 14:36:36 Uhr
Goto Top
Dann paste halt nochmals deine 2 orginalen actions.php und Core.php. Dann schau ich es halt nochmal an. Spielt jetzt auch keine Rolle mehr.
martenk
martenk 07.06.2023 um 14:44:43 Uhr
Goto Top
HansFenner
HansFenner 07.06.2023 um 15:09:23 Uhr
Goto Top
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.
martenk
martenk 07.06.2023 um 15:14:29 Uhr
Goto Top
bekomme die session var aber nicht in die funktion in der core.php
HansFenner
HansFenner 07.06.2023 aktualisiert um 15:50:11 Uhr
Goto Top
Funktioniert für mich. Zum Testen:
    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
martenk
martenk 07.06.2023 um 16:36:26 Uhr
Goto Top
beim Aufruf der helper.html bekomme ich ein leeres array

[ ]
martenk
martenk 07.06.2023 um 16:41:19 Uhr
Goto Top
bei dir startet die core.php doch auch so

<?php
//session_start();
 
class Core {
HansFenner
HansFenner 07.06.2023 um 17:10:06 Uhr
Goto Top
Hast du denn die 2 Zeilen var_dump wie oben angegeben zum Testen in die Funktion eingefügt ?
Weil dann hätte es Minimum so aussehen sollten, falls keine Session da wäre.

array(0) {
}
array(0) {
}
[]

Und ja, ich habe deine Dateien 1:1 übernommen.
HansFenner
HansFenner 07.06.2023 um 17:33:30 Uhr
Goto Top
Einen Verdacht hab ich noch. Probier mal die beiden Files, die sind ohne Ending PHP Tag.
https://pastebin.com/fHNHSR3L
https://pastebin.com/pHAZGzQV
martenk
martenk 07.06.2023 um 21:36:00 Uhr
Goto Top
jertzt bekomme ich beim helper das

NULL
NULL
[]
martenk
martenk 08.06.2023 um 15:05:13 Uhr
Goto Top
nun bekomme ich das angezeigt

NULL
NULL
[{"id_staff":"9","surname":"Piet","prename":"Peter","birthday":"04.09.2014","telephone":"","description_text":"","modified":"202.......
martenk
martenk 08.06.2023 aktualisiert um 16:25:25 Uhr
Goto Top
magst du mir bitte dann noch einmal erklären, wie ich denn nun diese function zu ändern habe

 public static function getStaffList(){
   var_dump($session);
   var_dump($_SESSION);
//$session['name']='Piet'; 
 
          if ($session['surname'] =="admin" || $session['surname'] =="Piet") {  
                $sql = "SELECT * FROM staff";  
          }
          else {
                $sql = "SELECT * FROM staff where surname = '".$session['surname']."'";  
          }
 
        $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;
        }
 
        return $return;
    }
martenk
martenk 08.06.2023 um 16:26:28 Uhr
Goto Top
es ist doch richtig, dass die session leer ist, wenn ich die helper aufrufe - oder?

var_dump($session);
var_dump($_SESSION);

NULL
NULL
[{"id_staff":"9","surname":"Piet","prename":"Peter","birthday":"04.09.2014","telephone":"","description_text":"","modified":"202
HansFenner
HansFenner 08.06.2023 aktualisiert um 19:39:32 Uhr
Goto Top
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
<?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!
martenk
martenk 09.06.2023 aktualisiert um 09:20:12 Uhr
Goto Top
guten morgen

nach Ausführung der Anmeldung bekomme ich
array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(9) }
Session als Piet erstellt.

helper ->
Warning: Undefined global variable $_SESSION in /is/htdocs/vv/www/nissen4/actions.php on line 397


Warning: Trying to access array offset on value of type null in /is/htdocs/vv/www/nissen4/classes/Core.php on line 251


Warning: Trying to access array offset on value of type null in /is/htdocs/vv/www/nissen4/classes/Core.php on line 251


Warning: Trying to access array offset on value of type null in /is/htdocs/vv/www/nissen4/classes/Core.php on line 255
HansFenner
HansFenner 09.06.2023 um 11:08:43 Uhr
Goto Top
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.
martenk
martenk 09.06.2023 um 13:09:14 Uhr
Goto Top
das result
apache2handler
8.1.16-he.0

Session ID: 
POST: array(1) {
  ["action"]=>  
  string(13) "get_stafflist"  
}

SESSION: 

Warning:  Undefined global variable $_SESSION in /is/htdocs/vv/www/nissen4/actions.php on line 13

NULL

COOKIE: array(10) {
  ["cmplz_consented_services"]=>  
  string(0) ""  
  ["cmplz_policy_id"]=>  
  string(2) "16"  
  ["cmplz_functional"]=>  
  string(5) "allow"  
  ["cmplz_marketing"]=>  
  string(4) "deny"  
  ["cmplz_statistics"]=>  
  string(4) "deny"  
  ["cmplz_preferences"]=>  
  string(4) "deny"  
  ["wp-settings-1"]=>  
  string(36) "editor=tinymce&libraryContent=browse"  
  ["wp-settings-time-1"]=>  
  string(10) "1681831593"  
  ["cmplz_banner-status"]=>  
  string(9) "dismissed"  
  ["PHPSESSID"]=>  
  string(32) "5f7a67cfeaf3839313058f5ece091c1c"  
}


Warning:  Undefined global variable $_SESSION in /is/htdocs/vv/www/nissen4/actions.php on line 404



Warning:  Trying to access array offset on value of type null in /is/htdocs/vv/www/nissen4/classes/Core.php on line 251



Warning:  Trying to access array offset on value of type null in /is/htdocs/vv/vv/nissen4/classes/Core.php on line 251



Warning:  Trying to access array offset on value of type null in /is/htdocs/vv/www/nissen4/classes/Core.php on line 255

[]
martenk
martenk 09.06.2023 aktualisiert um 16:33:51 Uhr
Goto Top
error log
martenk
martenk 09.06.2023 um 13:53:31 Uhr
Goto Top
das ist die Zeile 404
$staff = Core::getStaffList($_SESSION);
HansFenner
HansFenner 09.06.2023 um 15:45:42 Uhr
Goto Top
Das ist nun hart face-sad

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.
martenk
martenk 09.06.2023 um 15:52:14 Uhr
Goto Top
Wir testen die Session:
array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(9) }
HansFenner
Lösung HansFenner 09.06.2023 um 16:08:50 Uhr
Goto Top
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
martenk
martenk 09.06.2023 um 16:15:29 Uhr
Goto Top
Hallo Hans - ich mag es gar nicht schreiben - nun scheint es zu funktionieren - magst du mir erklären warum
martenk
martenk 09.06.2023 um 16:24:38 Uhr
Goto Top
oder lag es dann doch an hosteurope - hatte noch zwei tickets laufen - ich hatte es mit der actions ohne exit getestet - anscheinend habe die etwas geändert
HansFenner
HansFenner 09.06.2023 um 16:30:38 Uhr
Goto Top
Ja funktioniert es denn nun komplett? Wenn ja, ist es toll. Bei mir hat es immer funktioniert face-smile

Und in deinem Errorlog oben hast du zwar die IP Addresse gekürzt, aber den Domainnamen drin gelassen, der sollte auch noch weg ;)
martenk
martenk 09.06.2023 um 16:40:07 Uhr
Goto Top
magst du mir das nochmal erklären mit dem Schutz der conf.ini - bzw. die Umstellung zur php Datei
martenk
martenk 09.06.2023 um 16:47:25 Uhr
Goto Top
oder kann ich es auch so machen

<FilesMatch "\.(ini)$">
Order Deny,Allow
Deny from all
</FilesMatch>
HansFenner
HansFenner 09.06.2023 um 17:14:41 Uhr
Goto Top
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:
<?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);  
mit
require('conf.php');  
HansFenner
HansFenner 09.06.2023 um 17:20:02 Uhr
Goto Top
Zitat von @martenk:

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.
martenk
martenk 09.06.2023 um 21:12:52 Uhr
Goto Top
Okay - bei dem select soll ich das * rausnehmen und die Felder direkt ansprechen