inspiron: ZebraDatepicker $_SESSION nach aufrufen leer

Hallo,
ich habe mir mit dem jquery "ZebraDatepicker" eine Testseite aufgebaut.
Nach klick auf ein Datum wird aus einer DB der entsprechende Datensatz aufgelistet.
Nun möchte ich nach betätigen des Button "Bericht drucken" daraus ein PDF erstellen.
Hier brauche ich bitte mal eure Hilfe zum Problem:
Nachdem "Kalenderklick" werden die Daten aufgelistet, danach ist die "$_SESSION['DATUM_mysql']" wieder leer.

Gruß

  
<?php header ('Content-Type: text/html; charset=utf-8');  
error_reporting(E_ALL);  
session_start ();  
  
include ('../config_db.php');  
  
echo "<pre>";  
var_dump($_POST);  
print_r($_POST);  
echo "</pre>";  
//-----------------------------------------------  
  
// "pdf erstellen"  
if (isset($_POST['pdf_drucken']))  
{  
  $_SESSION['DATUM_mysql'] = $_POST['mysql_datum'];  
 //$_SESSION['DATUM_mysql'] = "2013-03-18";  
 Header("Location: bericht_pdf.php");  
}  
  
$sql = "SELECT * FROM `Tabelle` WHERE `SCHICHT` = '" .$_SESSION["schicht"]. "' AND `DATUM` = '" .$_POST["mysql_datum"]. "' ORDER BY `ID` DESC;";  
  
echo var_dump($sql);  
  
$abfrageergebnis = mysql_query( $sql, $conID );  
while ($datensatz = mysql_fetch_array( $abfrageergebnis ))  
{  
    echo "ID: ".$datensatz['ID']."<br>";  
    echo "Name: ".$datensatz['M_NAME']."<br>";  
}  
?>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">  
<head>  
  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<meta http-equiv="Content-Script-Type" content="text/javascript">  
  
<title>Datepicker_TEST</title>  
  
<link rel="stylesheet" title="Default" href="../css/zebra_datepicker_metallic.css" type="text/css">  
  
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>  
<script type="text/javascript" src="../jquery/zebra_datepicker.js"></script>  
  
<script type="text/javascript">  
  
$(document).ready(function(){  
	// Calendar	  
	$('#mysql_datum').Zebra_DatePicker({  
        	always_visible: $('#calendar'),  
        	//onSelect: function(dates) { alert('MySQL-Datum: ' + dates); }  
        	onSelect: function(dates) { document.myform.submit(); }  
    });  
});  
  
</script>  
</head>  
  
<body>  
<form class="commentForm" name="myform" method="post" accept-charset="utf-8" action="">  
  
<div>  
      <input type="text" id="mysql_datum" name="mysql_datum">  
      <div id="calendar" style="margin: 10px 0 0 200px"></div>  
</div>  
<div>  
      <input type="submit" name="pdf_drucken" id="pdf_drucken" value="Bericht drucken"/>  
</div>  
  
</form>  
</body>  
</html>  

  1. Tach!

    Hier brauche ich bitte mal eure Hilfe zum Problem:

    Bitte entferne (zumindest beim nächsten Problem) sämtlichen überflüssigen Code. Diesen erkennst du daran, dass das Problem nach seinem Entfernen unverändert vorkommt. Diese Vorgehensweise ist nicht nur für Helfer sinnvoll, sondern selbst für dich, weil auch du damit näher an den Fehler herankommst.

    Nachdem "Kalenderklick" werden die Daten aufgelistet, danach ist die "$_SESSION['DATUM_mysql']" wieder leer.

    Wenn $_SESSION leer ist, ist entweder die Session nicht initialisiert oder es ist eine neue initialisiert worden. Letzteres erkennst du an einer geänderten Session-ID. Überprüf bitte, dass diese gleich bleibt. Sessions allgemein werden hoffentlich gehen, oder ist das dein erstes Session-Projekt in dieser Server-Konstellation?

    $sql = "SELECT * FROM Tabelle WHERE SCHICHT = '" .$_SESSION["schicht"]. "' AND DATUM = '" .$_POST["mysql_datum"]. "' ORDER BY ID DESC;";

    Kontextwechsel beachten!

    echo "ID: ".$datensatz['ID']."<br>";
        echo "Name: ".$datensatz['M_NAME']."<br>";

    Hier auch.

    dedlfix.

    1. Hallo,

      Wenn $_SESSION leer ist, ist entweder die Session nicht initialisiert oder es ist eine neue initialisiert worden. Letzteres erkennst du an einer geänderten Session-ID. Überprüf bitte, dass diese gleich bleibt. Sessions allgemein werden hoffentlich gehen, oder ist das dein erstes Session-Projekt in dieser Server-Konstellation?

      ich denke mal du meinst das so:

      session_start ();  
      $_SESSION["mysql_datum"] = $_POST["mysql_datum"];
      

      ich habe mal im html Bereich "Session-Id: <?php echo $SID; ?> eingefügt, es wird leider keine ID angezeigt?? Wie kommt denn das??

      $sql = "SELECT * FROM Tabelle WHERE SCHICHT = '" .$_SESSION["schicht"]. "' AND DATUM = '" .$_POST["mysql_datum"]. "' ORDER BY ID DESC;";

      Kontextwechsel beachten!

      echo "ID: ".$datensatz['ID']."<br>";
          echo "Name: ".$datensatz['M_NAME']."<br>";

      Hier auch.

      dedlfix.

      Ich gehe mal davon aus das das nicht das derzeitige Problem ist. Denn darüber würde ich dann mal als nächstes "plaudern".

      1. Tach!

        Wenn $_SESSION leer ist, ist entweder die Session nicht initialisiert oder es ist eine neue initialisiert worden. Letzteres erkennst du an einer geänderten Session-ID. Überprüf bitte, dass diese gleich bleibt. Sessions allgemein werden hoffentlich gehen, oder ist das dein erstes Session-Projekt in dieser Server-Konstellation?

        ich denke mal du meinst das so:

        session_start ();

        $_SESSION["mysql_datum"] = $_POST["mysql_datum"];

          
        session\_start() hattest du ja am Anfang des Scripts stehen. Ich gehe davon aus, dass eine Session gestartet wurde - welche auch immer. Die Zuweisung interessiert erstmal nicht. Wichtig ist zunächst nur, dass die Session mmer dieselbe ist.  
          
        
        > ich habe mal im html Bereich "Session-Id: <?php echo $SID; ?> eingefügt, es wird leider keine ID angezeigt?? Wie kommt denn das??  
          
        Die Session-ID ist in der Konstante SID, nicht in der Variable $SID zu finden. Du hast doch das error\_reporting auf E\_ALL stehen, da müsste mindestens eine Notice-Meldung gekommen sein. Ist display\_errors ausgeschaltet? Schreit PHP vielleicht schon aus allen Rohren Fehlermeldungen, die nur nicht ausgegeben werden?  
          
        
        > > [Kontextwechsel](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel) beachten!  
        > Ich gehe mal davon aus das das nicht das derzeitige Problem ist.  
          
        Richtig, aber dieser sehr häufig vorkommende sicherheitsrelevante Fehler ist mir noch nebenbei aufgefallen.  
          
          
        dedlfix.
        
        1. Die Session-ID ist in der Konstante SID, nicht in der Variable $SID zu finden. Du hast doch das error_reporting auf E_ALL stehen, da müsste mindestens eine Notice-Meldung gekommen sein. Ist display_errors ausgeschaltet? Schreit PHP vielleicht schon aus allen Rohren Fehlermeldungen, die nur nicht ausgegeben werden?

          error_reporting(E_ALL);  
          ini_set('display_errors', 1);
          

          Notice: Undefined index: mysql_datum in index_test.php on line 23
          Session-Id: Notice: Undefined variable: SID in index_test.php on line 66

          Zeile 23:

          $sql = "SELECT * FROM FW_FehlerberichtWHERESCHICHT= '" .$_SESSION["schicht"]. "' ANDDATUM= '" .$_POST["mysql_datum"]. "' ORDER BYID DESC;";

          Zeile 66:

          Session-Id: <?php echo $SID; ?>

          Kontextwechsel beachten!
          Ich gehe mal davon aus das das nicht das derzeitige Problem ist.

          Richtig, aber dieser sehr häufig vorkommende sicherheitsrelevante Fehler ist mir noch nebenbei aufgefallen.

          dedlfix.

          Bitte später!
          Wenn das eigentliche Problem gelöst ist, kann ich mich diesem widmen und bin gern bereit weiteres zu lernen. ;-)

          1. Tach!

            Notice: Undefined index: mysql_datum in index_test.php on line 23

            Das ist ein wichtiger Hinweis. Die Session-ID als Ursache kann damit als unwahrscheinlich abgehakt werden. Dieser Request jedenfalls kommt ohne $_POST["mysql_datum"] daher. Du überschreibst nun den Wert in der Session mit nichts. Deine Programmlogik ist fehlerhaft. Oder aber, du erwartest an dieser Stelle einen Request mit ausgefülltem Wert, was aber seitens des Browsers nicht passiert ist.

            Session-Id: Notice: Undefined variable: SID in index_test.php on line 66

            Wie ich ja schon schrub, SID ist nicht $SID. $SID existiert nicht, die Meldung ist verständlich. Die Sache mit der SID kannst du aber ad acta legen.

            dedlfix.

            1. Tach!

              Notice: Undefined index: mysql_datum in index_test.php on line 23

              Das ist ein wichtiger Hinweis. Die Session-ID als Ursache kann damit als unwahrscheinlich abgehakt werden. Dieser Request jedenfalls kommt ohne $_POST["mysql_datum"] daher. Du überschreibst nun den Wert in der Session mit nichts. Deine Programmlogik ist fehlerhaft. Oder aber, du erwartest an dieser Stelle einen Request mit ausgefülltem Wert, was aber seitens des Browsers nicht passiert ist.

              ...ja,ja,
              diese Meldung kommt wenn die Seite frisch aufgebaut wird. Wähle ich im Kalender ein Datum aus verschwindet die Fehlermeldung und es werden die Daten aus der DB ausgelesen.

              Mein Gefühl sagt mir, ich muss dem Kalender irgendwie sagen, welches Datum vor dem Seitenaufbau angeklickt wurde.

              1. Tach!

                diese Meldung kommt wenn die Seite frisch aufgebaut wird. Wähle ich im Kalender ein Datum aus verschwindet die Fehlermeldung und es werden die Daten aus der DB ausgelesen.
                Mein Gefühl sagt mir, ich muss dem Kalender irgendwie sagen, welches Datum vor dem Seitenaufbau angeklickt wurde.

                Mein Gefühl sagt mir, dass du mehr differenziert denken muss. Du willst auf der Serverseite irgendwas machen, beschreibst dazu aber die Benutzerhandlung. Das Benutzerszenario ist nicht unwichtig, aber wenn das steht, musst du eine Schicht niedriger denken. Der Browser muss in der Lage sein, einen entsprechenden Request zu generieren. Nun interessiert der Benutzer nicht mehr. Jetzt geht es darum den Request auf der Serverseite so auszuwerten, dass eine bestimmte Aktion ausgeführt wird. Ich fände es ja übersichtlich, wenn du erstmal alle Requestvarianten so auseinandernimmst, dass jeweils ein klarer Weg in Richtung der jeweils weiteren Verarbeitung entsteht. Idealerweise ist jede der möglichen Aktionen in einer Einheit gekapselt, zum Beispiel einer Funktion. Die bekommt Parameter übergeben und produziert ein Ergebnis (das auch ein Array mit vielen Ergebnissen sein kann). Anschließend gehts zur individuellen Ausgabeerstellung.

                dedlfix.

              2. Mein Gefühl sagt mir, ich muss dem Kalender irgendwie sagen, welches Datum vor dem Seitenaufbau angeklickt wurde.

                ...es funktioniert! :) :) :)

                <input type="hidden" id="mysql_datum" name="mysql_datum" value="<?php echo $_POST['mysql_datum']; ?>">

        2. Kontextwechsel beachten!
          Ich gehe mal davon aus das das nicht das derzeitige Problem ist.

          Richtig, aber dieser sehr häufig vorkommende sicherheitsrelevante Fehler ist mir noch nebenbei aufgefallen.

          dedlfix.

          ...so, habe es mal angepasst. Ist das jetzt so richtig?

            
          $sql = "SELECT * FROM Tabelle WHERE SCHICHT = '" .$_SESSION['schicht']. "' AND DATUM = '" .$_POST['mysql_datum']. "' ORDER BY ID DESC;";  
          
          
          1. Tach!

            Kontextwechsel beachten!
            ...so, habe es mal angepasst. Ist das jetzt so richtig?

            Nein. Bitte lies den verlinkten Artikel und versuche ihn zu verstehen. (Du musst nicht alles lesen, aber zumindest die Einleitung und die Teile, die sich auf MySQL und HTML beziehen.)

            dedlfix.

            1. Nein. Bitte lies den verlinkten Artikel und versuche ihn zu verstehen. (Du musst nicht alles lesen, aber zumindest die Einleitung und die Teile, die sich auf MySQL und HTML beziehen.)

              ....und jetzt?

                
              // Maskierende Slashes aus POST entfernen  
              $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;  
                
              $Schicht = $_SESSION['schicht'];  
              $Mysql_datum = $_POST['mysql_datum'];  
                
              	$sql = "  
              		SELECT * FROM Tabelle  
              	WHERE  
              		SCHICHT = '" . mysql_real_escape_string($Schicht) . "'  
              	AND  
              		DATUM = '" . mysql_real_escape_string($Mysql_datum) . "'  
              	ORDER BY ID DESC;";  
                
                
              $abfrageergebnis = mysql_query( $sql, $conID );  
              while ($datensatz = mysql_fetch_array( $abfrageergebnis ))  
              {  
              // Tabelle erstellen fuer die Ausgabe  
                
              
              
              1. Tach!

                ....und jetzt?

                Schon besser. HTML hast du hoffentlich auch berücksichtigt?

                // Maskierende Slashes aus POST entfernen
                $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;

                Brauchst du das wirklich noch? Dieses Feature sollte eigentlich schon seit langem ausgeschaltet sein und PHP 5.4 hat es gar nicht mehr an Bord.

                $Schicht = $_SESSION['schicht'];
                $Mysql_datum = $_POST['mysql_datum'];

                Umkopieren ist unnötig, nimm das Original. Besonders wenn du den Wert nur ein/zweimal brauchst, ist es nur zusätzlicher Aufwand.

                $sql = "
                SELECT * FROM Tabelle
                WHERE
                SCHICHT = '" . mysql_real_escape_string($Schicht) . "'
                AND
                DATUM = '" . mysql_real_escape_string($Mysql_datum) . "'
                ORDER BY ID DESC;";

                sprintf() kann auch noch etwas mehr zur Lesbarkeit beitragen, aber das ist Geschmackssache. Übrigens ist die mysql_*-Erweiterung in mittelferner Zukunft nicht mehr verfügbar. PDO (anwenderfreundlicher) oder mysqli_* wird weiter bestehen. Beide bieten Prepared Statements, womit sich das SQL-Injection-Problem gleich von vornherein nicht ergibt.

                dedlfix.

                1. $Schicht = $_SESSION['schicht'];
                  $Mysql_datum = $_POST['mysql_datum'];

                  Umkopieren ist unnötig, nimm das Original. Besonders wenn du den Wert nur ein/zweimal brauchst, ist es nur zusätzlicher Aufwand.

                  Ich habe irgendwo mal gelesen:
                  "GET- und POST-Werte dürfen niemals direkt in SQL-Abfragen eingefügt werden"

                  Wenn's stimmt, wie soll ich das sonst machen?

                  1. Tach!

                    Ich habe irgendwo mal gelesen:
                    "GET- und POST-Werte dürfen niemals direkt in SQL-Abfragen eingefügt werden"
                    Wenn's stimmt, wie soll ich das sonst machen?

                    So wie die Aussage formuliert ist, oder du sie dir gemerkt hast, ist sie nicht sehr sinnvoll. Selbst wenn sie stimmen würde, ändert sich an einem Wert nichts, wenn er in eine andere Variable kopiert wird. Es ist immer noch der "direkte" Wert.

                    Diese Aussage meint vermutlich, dass der Kontextwechsel beachtet werden muss, sprich: die Werte müssen so eingefügt werden, dass sämtliche Zeichen als solche und nicht als Syntaxbestandteil der umgebenden Query angesehen werden. Konkretes Beispiel: ein Hochkomma beendet einen Sting, wenn er damit begonnen wurde. Ein Hochkomma in den eingegebenen Daten muss deshalb als ' notiert werden, um seine syntaktische Eigenschaft zu verlieren.

                    Dieser Kontextwechsel muss bei allen Arten von Daten und bei allen Arten von Zielen berücksichtigt werden. Ihn auf Nutzereingaben zu beschränken oder den Fokus darauf gegenüber anderen Datenquellen hervorzuheben, ist nicht sinnvoll. Hochkomma bleibt Hochkomma, egal wo es herkommt. Insofern solltest du den Satz vergessen und stattdessen die Kontextwechsel-Geschichte im Allgemeinen verstehen und beachten. - Und nun empfehle ich, dir den Artikel (nochmal) im Ganzen anschauen (falls noch nicht geschehen), damit du zumindest die häufgsten im Web-/PHP-Umfeld vorkommenden Arten von Kontexten kennenlernst.

                    dedlfix.

      2. ....wenn ich das "onSelect" deaktiviere, dann kann ich das Datum anwählen und mit dem Button das PDF erstellen. Das ist o.k.
        Nun möchte ich es aber so, das bei klick auf Datum der Datensatz gelistet wird und erst nach klick auf Button ein PDF erstellt wird.

          
        <script type="text/javascript">  
          
        $(document).ready(function(){  
        	// Calendar	  
        	$('#mysql_datum').Zebra_DatePicker({  
                	always_visible: $('#calendar'),  
                	//onSelect: function(dates) { document.myform.submit(); } <----DEAKTIVIERT  
            });  
        });  
          
        </script>