Andreas Cloos: + JS + Frames töten Apachen [leicht länglich]

Hallo Zusammen,

ich bräuchte mal Eure Hilfe... Ich habe eine Problem mit dem Sessionhandling(?) unter PHP - der Logout führt nämlich recht regelmäßig dazu, daß sich der Apache aufhängt. Erst mal, was tue ich?

Ich habe eine Frameset, das den folgenden Aufbau hat (nicht maßstabsgerecht), insgesamt also 8 Frames (ich habe mir das nicht selber ausgedacht!):

+--------------------------------------------------------------+ |                                                              | |           logo.htm                                           | |                                                              | +--------------------------------------------------------------+ |                                                              | |            mainnav.php                                       | |                                                              | +--------------------------------------------------------------+ |                                                              | |            subnav.php                                        | |                                                              | +--------------------------------------------------------------+ |-+----------------------------------------------------------+-| | |            main.php                                      | | | |                                                          | | | |                                                          | | | |                                                          | | | |                                                          | | |-+----------------------------------------------------------+-| +--------------------------------------------------------------+

Von der Idee her meldet sich der User an (Login über die main.php), bei jedem Klick auf den Submit-Button des Login-Screens wird über <form method=post action="main.php" onSubmit="javascript:top.location.href='index.htm'">, das komplette Frameset neu aufgerufen. Grund ist, daß sowohl die mainnav.php wie die subnav.php mittels "session_is_registered" nachgucken, ob es eine gültige Session gibt, wenn ja zeigen sie ihren Inhalt an, ansonsten bleiben sie halt blank; damit wir die Navigation also solange versteckt, wie der User sich nicht angemeldet hat.

Will der User sich abmelden, passiert genau das umgekehrte, es wird der Logout durchgeführt (sollten dabei nicht die Sessiondateien gelöscht werden?) und das komplette frameset gerefresht, damit wieder die navigation verborgen wird. Den Refresh beim Logout habe ich so bewerkstelligt:

[viel PHP-Code gesnippt]

echo "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0  transitional//EN'>       <html>       <head>       <link rel='stylesheet' href='styles/mainstyle.css' type='text/css'>       <script type="text/javascript">       <!--       function Umleiten() {       top.location.href='index.htm'        }        window.setTimeout("Umleiten()",3000);        //-->        </script>

</head>       <body bgcolor='#95b1c1'>";

[viel PHP-Code gesnippt]

Das klappt auch meistens ganz gut. Leider nicht immer. Hin und wieder meldet Windoof, daß Apache.exe einen Fehler verursacht hat und geschlossen werden müßte (kann man canceln, in der Zeit bis zum Cancel wird aber nichts geladen), dies passiert sowohl mit dem IE wie auch mit Mozi, allerdings war letzterer zweimal so freundlich, mir einmal in der subnav.php und dann ein paar Versuche später in der mainnav.php die folgenden Fehler auszugeben (wieso das gleiche Sessionfile?):

Warning: open(c:\www\php_sessions\sess_6325c8ff8ebc5b095795377f26e2ca8e, O_RDWR) failed: File exists (17) in c:\www\demo\subnav.php on line 9

Warning: open(c:\www\php_sessions\sess_6325c8ff8ebc5b095795377f26e2ca8e, O_RDWR) failed: File exists (17) in c:\www\demo\mainnav.php on line 9

Ohe das ganze Refresh-Gedöns hat alles ohne Probleme geklappt und mein Apache war unkaputtbar, jetzt ist er es aber nicht mehr.

Hier der auszugsweise (ich komme sonst über 12288 Zeichen...) Quellcode der meiner Meinung nach relevanten Dateien:

main.php:

<?php #start the session-handling here, must come before anything else session_start();

#echo the individual html-header echo "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0  transitional//EN'><html><head><link rel='stylesheet' href='styles/mainstyle.css' type='text/css'></head><body bgcolor='#95b1c1'>";

#after filling out the login-information:

if ($userid && $password) {   // if the user has just tried to log in

$db_conn = mysql_connect("localhost");   mysql_select_db("demo", $db_conn);   $query = "select * from user "            ."where duser='$userid' "            ." and password=password('$password')";   $result = mysql_query($query, $db_conn);   if (mysql_num_rows($result) >0 )   {     // if they are in the database register the user id     $valid_user = $userid;     session_register("valid_user");   } }

#html-table, in which the login-screen is embedded

echo "<table width='750' height='350' border='0'> <tr>  <td align='center' valign='middle'>      <table border='1'>             <tr><td align='center' valign='middle'><img src='images/sap.jpg' width='700' alt='SAP' border='0'></td></tr>             <tr><td align='center' valign='middle' class='tabheader'>Forecastmanagement Version 0.2</td></tr>             <tr><td align='center'>";

#the login-screen and the handling what happens if login wasn't successful   if (session_is_registered("valid_user"))   {

#get additional information about the user   $db_conn = mysql_connect("localhost");   mysql_select_db("demo", $db_conn);   $getinfo = "select duser, name, vorname, user_group from user where duser='$valid_user'";   $resgetinfo = mysql_query($getinfo);   $dataset=mysql_fetch_array($resgetinfo);

echo "Sie sind nun als <b>$valid_user: $dataset[2] $dataset[1]</b> angemeldet.<br>";     echo "<a href="logout.php">Zum <b>abmelden</b> hier klicken.</a><br>";

}   else   {     if (isset($userid))     {       // if they've tried and failed to log in       echo "Anmelden nicht möglich";     }     else     {       // they have not tried to log in yet or have logged out       echo "<br>Sie sind nicht angemeldet.<br>";     }

// provide form to log in     echo "<form method=post action="main.php" onSubmit="javascript:top.location.href='index.htm'">";     echo "<table>";     echo "<tr><td>D-User:</td>";     echo "<td><input type=text name=userid></td></tr>";     echo "<tr><td>Passwort:</td>";     echo "<td><input type=password name=password></td></tr>";     echo "<tr><td colspan=2 align=center>";     echo "<input type=submit value="Log in"></td></tr>";     echo "</table></form>";     echo "Um einen User zu beantragen, wenden Sie sich bitte per Mail an [<a href='mailto:andreas.cloos@akjsdhkas.de'><b>Andreas Cloos</b></a>].";   }

#end of html-table for the login-screen echo "</td></tr></table></td></tr></table>";

#get the always same footer for the html-output include ("includes/html_footer.php"); ?>

mainnav.php (als Beispiel):

<?php #check session variable   session_start(); ?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"        "http://www.w3.org/TR/html4/loose.dtd">

<html> <head> <title>Forecastmanagement Version 0.2</title> <link rel="stylesheet" href="styles/mainstyle.css" type="text/css"> <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript"> <!-- This code was written by Dr. Thomas Meinike - thomas@handmadecode.de--> <!--

function NeueFarbe(Nr,tf) { var TDID, COLtrue="#95b1c1", COLfalse="#d8d6c7"; TDID="box"+Nr;

if (document.all && !document.getElementById) // IE 4 { if (tf=="true") { document.all[TDID].style.backgroundColor=COLtrue; } else { document.all[TDID].style.backgroundColor=COLfalse; } }

if (document.getElementById) // IE 5.x und NN 6 { if (tf=="true") { document.getElementById(TDID).style.backgroundColor=COLtrue; } else { document.getElementById(TDID).style.backgroundColor=COLfalse; } }

if (document.layers) // NN 4.x { if (tf=="true") { document.layers[TDID].bgColor=COLtrue; } else { document.layers[TDID].bgColor=COLfalse; } } } //--> </SCRIPT> </head> <body bgcolor="#95b1c1">

<?php #check, if a valid session exits   if (session_is_registered("valid_user"))   { // if yes, go on here echo "

<div style="position:absolute; top:0px; left:15px;"> <TABLE WIDTH="750" BORDER="0" CELLPADDING="1" CELLSPACING="1"> <TR><TD ID="box1" BGCOLOR="#F7F7F7"><a href="subnav.php?show=administration" class="nav" target="subnav" OnMouseOver="NeueFarbe(1,'true')" OnMouseOut="NeueFarbe(1,'false')" OnClick="javascript:parent.frames[4].location.href='blank.htm'">Verwaltung</a></TD>     <TD ID="box2" BGCOLOR="#F7F7F7"><a href="subnav.php?show=user" class="nav" target="subnav" OnMouseOver="NeueFarbe(2,'true')" OnMouseOut="NeueFarbe(2,'false')" OnClick="javascript:parent.frames[4].location.href='blank.htm'">Benutzerverwaltung</a></TD>     <TD ID="box3" BGCOLOR="#F7F7F7"><a href="subnav.php?show=owndata" class="nav" target="subnav" OnMouseOver="NeueFarbe(3,'true')" OnMouseOut="NeueFarbe(3,'false')" OnClick="javascript:parent.frames[4].location.href='blank.htm'">eigene Daten</a></TD>     <TD ID="box4" BGCOLOR="#F7F7F7"><a href="subnav.php?show=div" class="nav" target="subnav" OnMouseOver="NeueFarbe(4,'true')" OnMouseOut="NeueFarbe(4,'false')" OnClick="javascript:parent.frames[4].location.href='blank.htm'">Diverses</a></TD></TR> </TABLE> </div>"; }

else {

echo "

<div style="position:absolute; top:0px; left:15px;"> <TABLE WIDTH="750" BORDER="0" CELLPADDING="1" CELLSPACING="1"> <TR><TD class="tabheader" align="center" BGCOLOR="#F7F7F7">Forecastmanagement Beratung Banken</TD> </TABLE> </div>"; }

?> </body> </html>

logout.php:

<?php #destroy the session   session_start();

$old_user = $valid_user;  // store  to test if they were logged in   $result = session_unregister("valid_user");   session_destroy();

#echo the individual html-header echo "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0  transitional//EN'>       <html>       <head>       <link rel='stylesheet' href='styles/mainstyle.css' type='text/css'>       <script type="text/javascript">       <!--       function Umleiten() {       top.location.href='index.htm'        }        window.setTimeout("Umleiten()",3000);        //-->        </script>

</head>       <body bgcolor='#95b1c1'>";

#html-table, in which the login-screen is embedded echo "<table width='750' height='350' border='0'> <tr>  <td align='center' valign='middle'>      <table border='1'>             <tr><td align='center' valign='middle'><img src='images/sap.jpg' width='700' alt='SAP' border='0'></td></tr>             <tr><td align='center' valign='middle' class='tabheader'>Forecastmanagement Version 0.2</td></tr>             <tr><td align='center'>";

if (!empty($old_user))   {     if ($result)     {       // if they were logged in and are not logged out       echo "Sie wurden erfolgreich vom System abgemeldet.<br><a href='main.php'>Hier klicken, um zur <b>Anmeldemaske</b> zu gelangen.</a>";

}     else     {      // they were logged in and could not be logged out       echo "Abmeldung vom System war <b>nicht</b> erfolgreich.<br><a href='main.php'>Hier klicken, um zur <b>Anmeldemaske</b> zu gelangen.</a>";     }   }   else   {     // if they weren't logged in but came to this page somehow     echo "Sie waren nicht angemeldet, konnten also nicht abgemeldet werden.<br><a href='main.php'>Hier klicken, um zur <b>Anmeldemaske</b> zu gelangen.</a>";   }

#end of html-table for the login-screen echo "</td></tr></table></td></tr></table>";

#get the always same footer for the html-output include ("includes/html_footer.php"); ?>

Was soll ich sagen: Help!

-- Greetz, Andreas

PS. ich hoffe, man kann alles lesen und es wird nicht zeilenumbruchstechnisch verhackstückt...

  1. Hallo,

    [ewig viel weggeschnitten]
    Was soll ich sagen: Help!

    Ehrlich gesagt: ich habe keine Ahnung. Ich will hier nur mal einen alternativen Lösungsansatz unterbreiten:

    Das Formular hat den target _top (und kein onSubmit). Wenn login.php/logout.php ausgeführt wird, dann wird

    a) die Meldung (Login/Logout erfolgreich/fehlgeschlagen) in der Session zwischengespeichert
    b) eine HTTP-Weiterleitung (meinetwegen auch per <meta> oder JS, aber HTTP geht schneller) auf das Frameset gemacht.
    c) die Datei main.php (und nur diese) checked, ob so eine Meldung vorhanden ist, gibt sie aus und löscht sie dann wieder aus Session - wenn die Meldung nicht vorhanden ist, dann wird halt der normale Inhalt ausgegeben.

    So funktioniert das ganze dann auch für nicht-JS-Browser und das ganze "Refresh-Gedöns" (wie Du es nennst) mehr oder weniger wegfällt.

    Grüße,

    Christian

    P.S. wenn Apache/PHP wegen so etwas abstürzen kann, dann ist das vielleicht ein Bug; Versionen?

    1. Auch Hallo,

      Ehrlich gesagt: ich habe keine Ahnung.

      ...hallo Nachbar :-)

      Ich will hier nur mal einen alternativen Lösungsansatz unterbreiten:

      Das Formular hat den target _top

      Sorry, werde gerade etwas betriebsblind, nachdem ich seit gut 12 Stunden am PC sitze...wieso _top?

      (und kein onSubmit). Wenn login.php/logout.php ausgeführt wird, dann wird

      a) die Meldung (Login/Logout erfolgreich/fehlgeschlagen) in der Session zwischengespeichert
      b) eine HTTP-Weiterleitung (meinetwegen auch per <meta> oder JS, aber HTTP geht schneller) auf das Frameset gemacht.
      c) die Datei main.php (und nur diese) checked, ob so eine Meldung vorhanden ist, gibt sie aus und löscht sie dann wieder aus Session - wenn die Meldung nicht vorhanden ist, dann wird halt der normale Inhalt ausgegeben.

      In der main.php ja, aber nicht in den Navi-Dateien...

      So funktioniert das ganze dann auch für nicht-JS-Browser und das ganze "Refresh-Gedöns" (wie Du es nennst) mehr oder weniger wegfällt.

      Intranet, ich kann also ruhig JS benutzen wie ich will... Ich kenne ja den Browser (IE 5.5 SP 2, bin wahrscheinlich der einzige bei uns der den Mozi noch dazu benuutzt)

      P.S. wenn Apache/PHP wegen so etwas abstürzen kann, dann ist das vielleicht ein Bug; Versionen?

      Apache Version 1.3.22
      PHP Version 4.1.1

      1. Hallo,

        Das Formular hat den target _top
        Sorry, werde gerade etwas betriebsblind, nachdem ich seit gut 12 Stunden am PC sitze...wieso _top?

        Mein Beileid ...

        login/logout.php sollen ja per HTTP auf das _gesamte_ Frameset weiterleiten (welches wiederrum main.php lädt, die dann die Meldung anzeigt).

        In der main.php ja, aber nicht in den Navi-Dateien...

        exakt.

        Intranet, ich kann also ruhig JS benutzen wie ich will... Ich kenne ja den Browser (IE 5.5 SP 2, bin wahrscheinlich der einzige bei uns der den Mozi noch dazu benuutzt)

        Trotzdem ist es besser, JavaScript zu vermeiden, wo es auch ohne geht ;-)

        Apache Version 1.3.22
        PHP Version 4.1.1

        Die dürften sich eigentlich prima vertragen ...

        Grüße,

        Christian