MWojt Posted May 26, 2014 Share Posted May 26, 2014 (edited) Hi Leute, ich habe ein Problem: Ich lasse ein Skript aus einem Unterordner des Ordners, in dem sich die Hauptseite befindet, in einem iFrame durchlaufen und erzeuge so eine Session-Variable. Jetzt habe ich allerdings das Problem, dass sich diese Variable scheinbar nicht von der Hauptseite aus abrufen lässt. Nun zur Frage: Habe ich einen Fehler in dem Skript, das die Variable abrufen soll, oder liegt das Problem im Skript, das die Session-Variable erstellt? Mit freundlichen Grüßen, MWojt //Edit: Ich bin so dumm. Natürlich muss nicht JavaScript in den Titel . Edited May 26, 2014 by MWojt Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 26, 2014 Share Posted May 26, 2014 (edited) Ohne den Code zu sehen, kann man nur raten, wo der Fehler liegt. Was du beschreibst, ist auf jeden Fall machbar. Ich vermute, der Fehler liegt in dem PHP-Skript, das die Variable aus dem Unterordner nutzen soll. Edited May 26, 2014 by Beefsteakwerfer Link to comment Share on other sites More sharing options...
MWojt Posted May 26, 2014 Author Share Posted May 26, 2014 (edited) Hier mal die Codes: Session setzen: <?phpsession_start();$_SESSION["username"] = $_POST['name'];if(isset($_POST['stay'])) { setcookie("username",$_POST['name']); setcookie("pw",$_POST['pw']);}?>Session abfragen: function loggedin($db) { require_once("scripts/functions.php"); require("config/mysql.php"); if(isset($_SESSION['username'])) { $user = $_SESSION['username']; $s = true; } elseif(isset($_COOKIE['username'])) { $user = $_COOKIE['username']; $s = false; } else { return(false); } $result = mysqli_query($db,"SELECT * FROM `".$table_users."` WHERE `Nickname` = '".$user."'"); if($result === false) { if(!mysqli_exist($table_users)) { $cmd = " CREATE TABLE `".$table_users."` ( `ID` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `Nickname` varchar(200) NOT NULL UNIQUE, `Passwort` char(128) NOT NULL, `Gruppe` int NOT NULL) ENGINE=InnoDB"; mysqli_query($db,$cmd) or die(mysqli_error($db)); mysqli_query($db,"ALTER TABLE `".$table_users."` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysqli_error($db)); } return(false); } elseif(mysqli_fetch_array($result)[1] !== $user) { return(false); } elseif($s === true) { return($user); } else { $pw = hash("SHA512",$_COOKIE['pw']); $result = mysqli_query($db,"SELECT * FROM `".$table_users."` WHERE `Nickname` = '".$user."' AND `Passwort` = '".$pw."'"); if($result === false) { return(false); } else { return($user); } }} Edited May 26, 2014 by MWojt Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 26, 2014 Share Posted May 26, 2014 (edited) Ich muss gleich los wohin, aber danach schaue ichs mir mal im Detail an. In der Zwischenzeit kannst du mal schauen, ob die Variablen gesetzt werden und ob deren Inhalt stimmt. Existiert die Post-Variable stay? Ich gebe dir dann später auch noch Ratschläge, wie du deinen Code optimierst, da dort viele Unsauberkeiten drin sind. Edited May 26, 2014 by Beefsteakwerfer Link to comment Share on other sites More sharing options...
MWojt Posted May 26, 2014 Author Share Posted May 26, 2014 Existiert die Post-Variable stay? Ja, tut sie. Hier die Form: <form action="../scripts/rlo.php" method="post"> <p class="t1">Nickname:</p><input class="text1" type="text" name="name"/> <p class="t2">Passwort:</p><input class="text2" type="password" name="pw"/> <p class="s1">Kekse:</p><input class="stay" type="checkbox" name="stay"/><p class="s2">Angemeldet bleiben</p> <input class="button" type="submit" value="Anmelden"/> </form> Link to comment Share on other sites More sharing options...
Toastbrot_290 Posted May 26, 2014 Share Posted May 26, 2014 Vlt. solltest du die Session erstmal wieder aufnehmen -> session_start(). Link to comment Share on other sites More sharing options...
MWojt Posted May 27, 2014 Author Share Posted May 27, 2014 Du meinst jetzt im Skript, das abrufen soll? Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 27, 2014 Share Posted May 27, 2014 Also, folgendes solltest du ändern: alle Get- und Post-Variablen mit preg_replace und/oder preg_match auf ihren Inhalt prüfen, um SQL-Injections zu verhindern. Ebenso solltest du prüfen, ob Variablen gesetzt sind und zusätzlich nicht leer sind. du benötigst überall wo du mit sessions arbeitest ein session_start(), ansonsten hast du keinen Zugriff auf die Variablen. Dabei ist es egal, ob du Session-Variablen erstellen oder lesen willst. Du benötigst es in beiden Fällen. IFrames sind veraltet und sollten nicht mehr genutzt werden. Heutzutage nutzt man dafür includes(). wenn du PHP-Variablen in einem SQL-Query nutzen möchtest solltest du sie mit eckigen Klammern einbinden. Beispielquery: "SELECT * FROM `tbl_users` WHERE `user_id` = '{$user_id}' " (das Leerzeichen zwischen dem ' und dem " am Ende des SQL-Queries ist nur zur besseren Lesbarkeit gesetzt und sollte im Code nicht übernommen werden). Variablen, Tabellennamen und Spaltennamen sollten klein geschrieben werden. Deine return-Funktionen solltest du zu return *Inhalt* umwandeln, also ohne die Klammern. bei SQL-Queries solltest du nicht extra die Datenbank in der Funktion mysqli_query angeben, sofern du nicht mit mehreren Datenbanken gleichzeitig arbeitest, sondern lieber die entsprechende Datenbank direkt in der mysql.php auswählen Ich denke damit hast du nun erst mal was zu tun, um dein Skript zu verbessern. Nachdem das fehlende session_start() hinzugefügt worden ist sollte es auch gehen. Link to comment Share on other sites More sharing options...
MWojt Posted May 27, 2014 Author Share Posted May 27, 2014 IFrames sind veraltet und sollten nicht mehr genutzt werden. Heutzutage nutzt man dafür includes(). Kannst du mir dann vlt auch noch verraten, wie ich PHP-Skripte durch das Übermitteln einer Form ohne ein Neuladen der Hauptseite ausführe? Deine return-Funktionen solltest du zu return *Inhalt* umwandeln, also ohne die Klammern. Was ist so schlimm an den Klammern? bei SQL-Queries solltest du nicht extra die Datenbank in der Funktion mysqli_query angeben, sofern du nicht mit mehreren Datenbanken gleichzeitig arbeitest, sondern lieber die entsprechende Datenbank direkt in der mysql.php auswählen Habe ich bereits versucht. Führt zu einer Fehlermeldung. Vielleicht habe ich es aber auch falsch gemacht... Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 27, 2014 Share Posted May 27, 2014 (edited) Damit die Seite nicht neu lädt müsstest du mit Ajax oder anderen Javascript-Helferlein arbeiten. Was spricht für dich gegen ein Neuladen der Seite? Die Klammern sind unüblich. Klar funktioniert es auch so, aber besser wäre es ohne sie. Zitat aus dem PHP-Wiki: Hinweis: Weil return ein Sprachkonstrukt und keine Funktion ist, sind die Klammern um das Argument optional. Es ist üblich, sie auszulassen, und dies wird ausdrücklich empfohlen, weil PHP in diesem Fall weniger zu tun hat. Wie lautet die Fehlermeldung? Du musst was falsch gemacht haben, da das der gängiste Weg ist und garantiert geht . Edited May 27, 2014 by Beefsteakwerfer Link to comment Share on other sites More sharing options...
MWojt Posted May 27, 2014 Author Share Posted May 27, 2014 (edited) Warning: mysqli_query() expects at least 2 parameters, 1 given inC:\xampp\htdocs\index.phpon line16 Das ist die Fehlermeldung. Ich denke, du verwechselst gerade MySQL und MySQLi. Wenn du mir statt der Methode mit dem iFrame eine andere Methode vorschlügest, die genau so effektiv ist, würde ich diese gerne benutzen. Das mit den Klammern werde ich ändern. Scheinbar ist die Variante ohne die Klammern ja schneller. Edited May 27, 2014 by MWojt Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 27, 2014 Share Posted May 27, 2014 MySQL und MySQLi macht bei der Verwendung keinen Unterschied. Man sollte jedoch trotzdem MySQLi nutzen, da MySQL veraltet ist und in absehbarer Zeit keineswegs mehr unterstützt wird. Stimmt, du musst die DB-Verbindung bei dir angeben, beim MySQLi-Query, da es nicht objektorientiert programmiert ist. Vergiss die Aussage von mir dazu also. Ich habe dir doch schon, anstatt dem iFrame, einen include() vorgeschlagen? Mach einfach include(*dateiname*); an der Stelle wo jetzt dein iFrame steht. Das geht jedoch nur, wenn die Datei in der gleichen Datei nur einmal eingebunden wird. Link to comment Share on other sites More sharing options...
MWojt Posted May 27, 2014 Author Share Posted May 27, 2014 Ich habe dir doch schon, anstatt dem iFrame, einen include() vorgeschlagen? Mach einfach include(*dateiname*); an der Stelle wo jetzt dein iFrame steht. Das geht jedoch nur, wenn die Datei in der gleichen Datei nur einmal eingebunden wird. Würde ich die Datei mit Include einbinden, wäre es mir wie gesagt unmöglich (bzw. nur durch eine mir unkenntliche Art möglich), ein Skript ohne Neuladen der Hauptseite auszuführen. Das von mir darin gesehene Problem ist allerdings keineswegs die eigentliche Ausführung des Skriptes, sondern eher die nötige Weiterleitung zurück zur Hauptseite. Ich empfinde diesen Weg als sehr unschön, da man, wenn man sich eine Seite rückwärts bewegt, immer dieses olle Skript sieht. Link to comment Share on other sites More sharing options...
Toastbrot_290 Posted May 27, 2014 Share Posted May 27, 2014 Mir ist noch unklar wieso du gerade den Teil zur Erzeugung der Session Variablen erneut laden musst? Link to comment Share on other sites More sharing options...
MWojt Posted May 27, 2014 Author Share Posted May 27, 2014 (edited) Mir ist noch unklar wieso du gerade den Teil zur Erzeugung der Session Variablen erneut laden musst? Willst du damit sagen, dass man das session_start(); im Erzeugerskript hätte weglassen können? Was ich mich gerade frage: Warum benutzt YouTube iFrames, wenn diese doch so veraltet sind? Edited May 27, 2014 by MWojt Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 27, 2014 Share Posted May 27, 2014 Ich habe nun mal diverses nachgelesen und ein paar offizielle Dinge studiert. Weder Frames, noch iFrames sind "veraltet". Sie werden auch in HTML5 weiterhin unterstützt und sie wurden sogar erweitert. Man sollte sie, wenn möglich, vermeiden, weil sie bestimmte Funktionen verhindern und je nach Browser unterschiedlich umgesetzt werden, aber es gibt Fälle wo man nicht um iFrames herum kommt. Du kannst es also weiterhin nutzen, sofern du mit deinem Weg zufrieden bist. Zu deiner Anmerkung mit Youtube: Viele große Seiten nutzen ganz viele verschiedene Fallbacks, damit die Seite auf allen Geräten, in allen Browsern mit allen erdenklichen Versionen geht. Da ist es dann auch mal notwendig veraltete Funktionen zu verwenden, da alte Browser viele HTML5-Elemente nicht kennen. Link to comment Share on other sites More sharing options...
MWojt Posted May 28, 2014 Author Share Posted May 28, 2014 Weißt du, was ein Fallback ist? Ein Fallback ist eine Sache, die dann genutzt wird, wenn die neue Methode nicht funktioniert. Ich denke kaum, dass YouTube im Google Chrome Fallbacks verwendet. Was ich damit sagen will: YouTube verwendet iFrame höchstwahrscheinlich nicht als Fallback, sondern als *Gegenteil von Fallback*. Ich werde den iFrame weiterhin benutzen, da dieser in Chrome, Firefox und IE gleich und so aussieht, wie er es soll. Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 28, 2014 Share Posted May 28, 2014 (edited) Ich habe nun mal flüchtig geschaut wo Youtube iFrames nutzt und ich kann es nur bei der eingebundenen Werbung feststellen. Warum Youtube da iFrames nutzt? Ich selber nutze keine iFrames und ich kann nur durch das was ich gelesen habe raten, dass es vielleicht daran liegt, dass die Werbung nicht indexiert werden soll oder der Google Bot ihr nicht auf die Seiten folgen soll, da viele Werbeseiten eher dem Google-Ranking schaden. Ob das stimmt (das Suchmaschinen iFrames nicht folgen, indexieren, usw.) weiß ich nicht und das müsste man letztlich selber testen, da ich dazu unterschiedliche Aussagen gefunden habe. Edited May 28, 2014 by Beefsteakwerfer Link to comment Share on other sites More sharing options...
MWojt Posted May 28, 2014 Author Share Posted May 28, 2014 Da ich einen Adblocker habe, habe ich diesen iFrame nicht gesehen. Eigentlich meinte ich die iFrames, die erscheinen, wenn man einige Zeit mit der Maus über einem Benutzernamen bleibt. Die Indizierung wäre in meinem Fall ebenfalls unnötig. Zudem ist es in meinem Fall einfacher, einen iFrame statt eines Includes zu verwenden, da ich diesen wie YouTube quasi als "PopUp" verwende (ich weiß, dass ein PopUp eigentlich was anderes ist). Von daher werde ich ihn weiterhin benutzen. Er funktioniert sowohl in Chrome als auch in Firefox als auch im IE; ich sehe keinen Grund, umzusteigen und es zu verkomplizieren. Link to comment Share on other sites More sharing options...
Beefsteakwerfer Posted May 28, 2014 Share Posted May 28, 2014 (edited) Was du meinst sind dann Hover-Effekte in CSS. Wären das iFrames in Youtube würde die Information über den Benutzer permanent in einem eingebetteten Fenster angezeigt werden. Ich habe dir mal einen CSS-Weg herausgesucht: Tutorial Demo zum Tutorial Edited May 28, 2014 by Beefsteakwerfer Link to comment Share on other sites More sharing options...
MWojt Posted May 28, 2014 Author Share Posted May 28, 2014 (edited) Nein, das sind iFrames. Das weiß man, wenn man über dem Frame rechtsklickt, dann kommt der Kontextmenüeintrag "Frame-Quelltext anzeigen". Dies erschiene nicht, wenn dort kein iFrame wäre. Edited May 28, 2014 by MWojt Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now