Einzelne Datenabfrage

02/24/2021 15:03 creativeIDE#1
Hallo, ich taste mich langsam an PHP ran, bin gerade dabei ein kleines System zu programmieren.

Ich habe eine Datenbanktabelle (users) mit der spalte (super) dieser Wert ist auf Standard also 0.

Nun möchte ich abfragen welchen wert $userid = $_SESSION['userid'] in der Tabelle super hat.

Das gleiche habe ich mit Guthaben gemacht, es hat funktioniert.
Mit der Super Tabelle klappt es aber leider nicht.

Code:
$userid = $_SESSION['userid'];
$id = 0;


$stats = $pdo->prepare("SELECT super FROM users WHERE id = {$userid}");
$stats->execute(array($id));
$admin = $stats->fetch();

echo $admin['id'];
Kann mir jemand mal bitte helfen? Wie gesagt, ich will nur eine einzige spalte Abfragen...

Notice: Undefined index: id in C:\projects\htdocs\admin.php on line 12

Obwohl ich id gesetzt habe..
02/24/2021 15:08 SyntaxBreaker#2
Du holst dir nur das Feld "super" und versuchst danach vom Array das Feld mit dem Index "id" abzufragen.

=> echo $admin['super'];

Alternativ musst du deinen SQL Befehl bearbeiten von "[...] super [...]" zu "[...] super, id [...]"
02/24/2021 15:14 creativeIDE#3
Quote:
Originally Posted by SyntaxBreaker View Post
Du holst dir nur das Feld "super" und versuchst danach vom Array das Feld mit dem Index "id" abzufragen.

=> echo $admin['super'];

Alternativ musst du deinen SQL Befehl bearbeiten von "[...] super [...]" zu "[...] super, id [...]"

ich suche schon knapp 1 Std. nach diesem Fehler ^^, dankeee!!
hast du vielleicht noch paar Seiten was ich mir durchlesen könnte, versuche gerade die Logik zu verstehen von allem...


Hab das jetzt mal so gemacht...

Code:
$userid = $_SESSION['userid'];
$status = 0;

//Abfrage von Admin
$stats = $pdo->prepare("SELECT super FROM users WHERE id = {$userid}");
$stats->execute(array($status));
$admin = $stats->fetch();
$status = $admin['super'];

if($status == 1){
    echo "Herzlich Willkommen im Adminbereich!";
} else {
    echo "Du bist kein Admin!";
}
Muss ich z.B bei execute diesen Wert als array abspeichern?
02/24/2021 15:25 SyntaxBreaker#4
Gerne :)
Konkrete Links habe ich nicht, aber du kannst ja einfach mal nach "PHP pdo" Google befragen.

Hilfreich ist auch immer sowas wie "print_r([variable]);". Damit wird sie dir ausgegeben und du kannst schauen woran es scheitert.
02/24/2021 18:31 Legithos#5
Quote:
Originally Posted by SyntaxBreaker View Post
Gerne :)
Konkrete Links habe ich nicht, aber du kannst ja einfach mal nach "PHP pdo" Google befragen.

Hilfreich ist auch immer sowas wie "print_r([variable]);". Damit wird sie dir ausgegeben und du kannst schauen woran es scheitert.
Statt print_r($variable) bietet sich var_dump($variable) noch besser an.

Wenn du mit PDO arbeiten willst, dann würde ich es so machen:

Code:
$userid = $_SESSION['userid'];
$status = 0;

//Abfrage von Admin
$stats = $pdo->prepare("SELECT super FROM users WHERE id = :uid");
$stats->execute([
 "uid" => htmlspecialchars($userid)
]);
$admin = $stats->fetch();
$status = $admin['super'];

if($status == 1){
    echo "Herzlich Willkommen im Adminbereich!";
} else {
    echo "Du bist kein Admin!";
}
PDO hat den Vorteil der Prepaired Statements. Das is unter Anderem ein riesiger Vorteil was die Sicherheit deiner Anwendung angeht. Zur praktischen und wirklich einfach gehaltenen Erklärung:

Prinzipiell ist dein SQL-Query wie folgt aufgebaut

Code:
"SELECT super FROM users WHERE id = " . $userid;
Nachteil hieran ist, dass sobald ein User die userid in irgendeiner Art und Weise beeinflussen kann (eher bei anderen Abfragen relevant), der SQL-Query durch einen User erweitert werden kann.

Code:
$userid = $_SESSION["userid"];

//User kann die Variable beeinflussen und gibt an:

$userid = "105 OR 1=1; SELECT * FROM users"
Das ist eine extreme Sicherheitslücke (SQL injection) und soll natürlich vermieden werden. Dies passiert bei PDO mit prepaired statements.

Statt

Code:
"SELECT super FROM users WHERE id = " . $userid;
schreiben wir

Code:
"SELECT super FROM users WHERE id = :userid";
Wie du ja eh schon richtig gemacht hast. Hintergrund hierbei ist, dass SQL einfach ausgedrückt AUSSCHLIEßLICH deine Variable auch als Variable liet und nicht ggf deinen SQL-Query erweitert (wie es bei SQL injection der Fall ist).

Jetzt müssen wir nurnoch :userid auch definieren bzw eine Variable zuweisen. Das passiert im $stats->execute(); also wie folgt:

Code:
$stats->execute([
   "userid" => $userid
])
Wichtig! Kein Komma nach $userid. Einzige Ausnahme, wenn du mehrere Variablen zuweist, wie zb

Code:
$stats->execute([
   "userid" => $userid,
   "name" => $username
])
Hier wird mit einem einfachen Komma getrennt und die letzte Zeile hat kein Komma.

Letzte Anmerkung - Die PHP-Funktion htmlspecialchars() verhindert, dass html-Code ausgeführt wird.

Sollte ein User einen Html-Tag als Benutzername verwenden, zB "<html>" und du holst dir den Benutzer aus der Datenbank und willst ihn anzeigen lassen, wirst du nichts sehen, da der HTML-Befehlt auch als Befehl ausgeführt wird. Wenn du den Text des Benutzernamens des Benutzers haben willst, dann mit htmlspecialchars().

Sinnvoll vor dem Speichern in die Datenbank UND auch, wenn der Wert wieder abgerufen und angezeigt werden soll.
02/25/2021 09:45 False#6
Quote:
Originally Posted by Legithos View Post
Statt print_r($variable) bietet sich var_dump($variable) noch besser an.

Wenn du mit PDO arbeiten willst, dann würde ich es so machen:

Code:
$userid = $_SESSION['userid'];
$status = 0;

//Abfrage von Admin
$stats = $pdo->prepare("SELECT super FROM users WHERE id = :uid");
$stats->execute([
 "uid" => htmlspecialchars($userid)
]);
$admin = $stats->fetch();
$status = $admin['super'];

if($status == 1){
    echo "Herzlich Willkommen im Adminbereich!";
} else {
    echo "Du bist kein Admin!";
}
PDO hat den Vorteil der Prepaired Statements. Das is unter Anderem ein riesiger Vorteil was die Sicherheit deiner Anwendung angeht. Zur praktischen und wirklich einfach gehaltenen Erklärung:

Prinzipiell ist dein SQL-Query wie folgt aufgebaut

Code:
"SELECT super FROM users WHERE id = " . $userid;
Nachteil hieran ist, dass sobald ein User die userid in irgendeiner Art und Weise beeinflussen kann (eher bei anderen Abfragen relevant), der SQL-Query durch einen User erweitert werden kann.

Code:
$userid = $_SESSION["userid"];

//User kann die Variable beeinflussen und gibt an:

$userid = "105 OR 1=1; SELECT * FROM users"
Das ist eine extreme Sicherheitslücke (SQL injection) und soll natürlich vermieden werden. Dies passiert bei PDO mit prepaired statements.

Statt

Code:
"SELECT super FROM users WHERE id = " . $userid;
schreiben wir

Code:
"SELECT super FROM users WHERE id = :userid";
Wie du ja eh schon richtig gemacht hast. Hintergrund hierbei ist, dass SQL einfach ausgedrückt AUSSCHLIEßLICH deine Variable auch als Variable liet und nicht ggf deinen SQL-Query erweitert (wie es bei SQL injection der Fall ist).

Jetzt müssen wir nurnoch :userid auch definieren bzw eine Variable zuweisen. Das passiert im $stats->execute(); also wie folgt:

Code:
$stats->execute([
   "userid" => $userid
])
Wichtig! Kein Komma nach $userid. Einzige Ausnahme, wenn du mehrere Variablen zuweist, wie zb

Code:
$stats->execute([
   "userid" => $userid,
   "name" => $username
])
Hier wird mit einem einfachen Komma getrennt und die letzte Zeile hat kein Komma.

Letzte Anmerkung - Die PHP-Funktion htmlspecialchars() verhindert, dass html-Code ausgeführt wird.

Sollte ein User einen Html-Tag als Benutzername verwenden, zB "<html>" und du holst dir den Benutzer aus der Datenbank und willst ihn anzeigen lassen, wirst du nichts sehen, da der HTML-Befehlt auch als Befehl ausgeführt wird. Wenn du den Text des Benutzernamens des Benutzers haben willst, dann mit htmlspecialchars().

Sinnvoll vor dem Speichern in die Datenbank UND auch, wenn der Wert wieder abgerufen und angezeigt werden soll.
Allgemein richtig zusammengefasst, bis auf diesen Part:
Quote:
Letzte Anmerkung - Die PHP-Funktion htmlspecialchars() verhindert, dass html-Code ausgeführt wird.
[...]
Sinnvoll vor dem Speichern in die Datenbank UND auch, wenn der Wert wieder abgerufen und angezeigt werden soll.
Die Funktion verhindert nicht das ausführen von html-Code, die Funktion wandelt enige Zeichen in html tags um z.B. wird aus "<" "<".
Durch die umwandlung erkennt der Browser nur noch text und keine Html Tags mehr.

Daher ist es auch nicht nötig und Sinnvoll htmlspecialchars in SQL's zu verwenden egal ob SELECT, UPDATE, INSERT INTO, etc...
Musst du mal manuell Sachen in der Datenbank nachgucken würdest du dir damit nur die Arbeit erschweren, daher reicht es einfach nur bei der Ausgabe htmlspecialchars zu verwenden.