Yadgar: Ich verstehe das nicht, ich verstehe das nicht, ich verstehe das nicht!

Hi(gh)!

Ich bin im Begriff, an der Programmiererei zu verzweifeln:

Ein Formular übermittelt den Wert $_POST['Position'], der fünf verschiedene Stringwerte haben kann ("Pedal", "Unteres Manual", "Oberes Manual", "3. Manual", "4. Manual"); entsprechend dem Stringinhalt soll ein Integerwert von 0 bis 4 in die Datenbank eingetragen werden. Da die Variablen für die Datenbank in mehreren Funktionen verwendet werden sollen (und ich nicht jedesmal $_POST['soundso'] schreiben will, habe ich globale Variablen definiert:

  global $Position;
  global $Pedaltyp;
  global $Schweifung_Horizontal;
  global $Schweifung_Vertikal;
  global $Radial;
  global $Tastentyp;
  global $Gewichtet;
  global $Aftertouch;

Die Zuweisung von $Position sieht so aus:

     if ($_POST['Position'] == "Pedal")
        $Position = 0;
      else if ($_POST['Position'] == "Unteres Manual")
        $Position = 1;
      else if ($_POST['Position'] == "Oberes Manual")
        $Position = 2;
      else if ($_POST['Position'] == "3. Manual")
        $Position = 3;
      else 
        $Position = 4;

Wenn ich dann vor dem Eintrag in die Datenbank noch einmal $_POST und $Position prüfe, wird mir $_POST korrekt angezeigt:

array(7) { ["Position"]=> string(14) "Unteres Manual" ["Tiefste_Taste"]=> string(1) "F" ["Hoechste_Taste"]=> string(4) "c'''" ["Pedaltyp"]=> string(0) "" ["Tastentyp"]=> string(12) "Vorspringend" ["Gewichtet"]=> string(4) "nein" ["Aftertouch"]=> string(4) "nein" } 

in $Position steht aber immer nur NULL! Warum? In diesem Fall sollte doch 1 drinstehen... Ich verstehe das alles nicht... warum ist Programmieren so elend schwer?

Bis bald im Khyberspace!

Yadgar

  1. Tach!

    Ein Formular übermittelt den Wert $_POST['Position'], der fünf verschiedene Stringwerte haben kann ("Pedal", "Unteres Manual", "Oberes Manual", "3. Manual", "4. Manual"); entsprechend dem Stringinhalt soll ein Integerwert von 0 bis 4 in die Datenbank eingetragen werden.

    Warum kommt da ein Text im Programm an und nicht gleich die Zahl?

    Da die Variablen für die Datenbank in mehreren Funktionen verwendet werden sollen (und ich nicht jedesmal $_POST['soundso'] schreiben will, habe ich globale Variablen definiert:

    Globale Variablen definiert man, indem man sie im globalen Scope anlegt. Befindet man sich in einer Funktion muss man mit global definieren, welche Variable aus dem globalen Scope man ansprechen möchte.

    Die Zuweisung von $Position sieht so aus:

         if ($_POST['Position'] == "Pedal")
            $Position = 0;
          else if ($_POST['Position'] == "Unteres Manual")
            $Position = 1;
          else if ($_POST['Position'] == "Oberes Manual")
            $Position = 2;
          else if ($_POST['Position'] == "3. Manual")
            $Position = 3;
          else 
            $Position = 4;
    

    Es gäbe da auch switch. Ich dachte, du wolltest das Mehrfachverwenden vermeiden?

    Wenn ich dann vor dem Eintrag in die Datenbank noch einmal $_POST und $Position prüfe, wird mir $_POST korrekt angezeigt: in $Position steht aber immer nur NULL! Warum?

    Das kann man aus dem gezeigten Code nicht entnehmen. Vermutlich hast du die globalen Variablen nicht in den vorliegenden Scope reingeholt.

    dedlfix.

    1. Hi(gh)!

      Warum kommt da ein Text im Programm an und nicht gleich die Zahl?

      Weil in der Eingabemaske aus einem Pulldown-Menü ausgewählt wird (also <select><option ...> </select> - für mich ist das bei der Eingabe übersichtlicher.

      Globale Variablen definiert man, indem man sie im globalen Scope anlegt. Befindet man sich in einer Funktion muss man mit global definieren, welche Variable aus dem globalen Scope man ansprechen möchte.

      Ach du meine Güte... ich gebe es auf! Globaler Scope... das ist ja fast so kompliziert wie C++! Also, die Variable müsste zunächst mal außerhalb aller Funktionen deklariert werden und dann noch einmal innerhalb der Funktion mit global $Position aufgerufen werden? Oder verstehe ich das wieder mal völlig falsch?

      Es gäbe da auch switch. Ich dachte, du wolltest das Mehrfachverwenden vermeiden?

      Mit switch hatte es auch nicht funktioniert, also versuchte ich es mit if else...

      Das kann man aus dem gezeigten Code nicht entnehmen. Vermutlich hast du die globalen Variablen nicht in den vorliegenden Scope reingeholt.

      Also jetzt nur innerhalb der Funktion deklarieren oder sowohl außerhalb als auch innerhalb?

      Bin ich zum Programmieren zu dumm?

      Bis bald im Khyberspace... ach was Khyberspace, das wird in diesem Leben doch sowieso nichts mehr!

      Yadgar

      1. Hallo Yadgar,

        Warum kommt da ein Text im Programm an und nicht gleich die Zahl?

        Weil in der Eingabemaske aus einem Pulldown-Menü ausgewählt wird (also <select><option ...> </select> - für mich ist das bei der Eingabe übersichtlicher.

        Du kannst den Optionen auch ein Value-Attribut mitgeben.

        Globale Variablen definiert man, indem man sie im globalen Scope anlegt. Befindet man sich in einer Funktion muss man mit global definieren, welche Variable aus dem globalen Scope man ansprechen möchte.

        Also, die Variable müsste zunächst mal außerhalb aller Funktionen deklariert werden und dann noch einmal innerhalb der Funktion mit global $Position aufgerufen werden?

        Ja, im Handbuch ist das ganz gut beschrieben.

        Also jetzt nur innerhalb der Funktion deklarieren oder sowohl außerhalb als auch innerhalb?

        Kommt drauf an, was Du genau machen möchtest. Wenn Du wirklich globale Variablen innerhalb einer Funktion nutzen möchtest, definierst Du die außerhalb der Funktion im globalen Scope und holst sie Dir dann innerhalb der Funktion mit global, wie dedlfix schon geschrieben hatte. Wahrscheinlich kannst Du das alles aber auch ohne globale Variablen lösen.

        Bin ich zum Programmieren zu dumm?

        Bestimmt nicht. Aber "aller Anfang ist schwer". Und beim Programmieren kommt man sich immer wieder wie am Anfang vor.

        Gruß Dennis

        1. Hi(gh)!

          Du kannst den Optionen auch ein Value-Attribut mitgeben.

          Habe ich auch durchgehend gemacht...

          Globale Variablen definiert man, indem man sie im globalen Scope anlegt. Befindet man sich in einer Funktion muss man mit global definieren, welche Variable aus dem globalen Scope man ansprechen möchte.

          Also, die Variable müsste zunächst mal außerhalb aller Funktionen deklariert werden und dann noch einmal innerhalb der Funktion mit global $Position aufgerufen werden?

          Ja, im Handbuch ist das ganz gut beschrieben.

          Es funktioniert nicht, es funktioniert nicht, es funktioniert nicht! In $Position steht, egal wie und wo ich es deklariere, immer nur NULL drin!

          1. Hallo Yadgar,

            Du kannst den Optionen auch ein Value-Attribut mitgeben.

            Habe ich auch durchgehend gemacht...

            wenn Du das durchgehend gemacht hast: Welche Werte hast Du denn da eingetragen? Statt dem Namen könntest Du ja direkt die Zahl angeben, das ist glaube ich auch das, was dedlfix meinte. Also so:

            <select name="position">
              <option value="0">Pedal</option>
            </select>
            

            Dann würde natürlich der Wert, also 0 an das Skript gesendet (also $_POST['position'] = 0) und nicht Pedal, etc.

            Globale Variablen definiert man, indem man sie im globalen Scope anlegt. Befindet man sich in einer Funktion muss man mit global definieren, welche Variable aus dem globalen Scope man ansprechen möchte.

            Also, die Variable müsste zunächst mal außerhalb aller Funktionen deklariert werden und dann noch einmal innerhalb der Funktion mit global $Position aufgerufen werden?

            Ja, im Handbuch ist das ganz gut beschrieben.

            Es funktioniert nicht, es funktioniert nicht, es funktioniert nicht! In $Position steht, egal wie und wo ich es deklariere, immer nur NULL drin!

            Hier noch ein Beispiel, wie es grundsätzlich aussehen müsste. Du kannst versuchen, das auf Dein Problem zu übertragen. Und sonst frag einfach nochmal nach.

            <?php
            
            $Position = 0;
            
            function DeineFunktion()
            {
            	global $Position;
            
            	$Position = 1;
            }
            
            echo sprintf('Der Wert von $Position vor Aufruf der Funktion ist: %s<br>', $Position);
            
            DeineFunktion();
            
            echo sprintf('Der Wert von $Position nach Aufruf der Funktion ist: %s<br>', $Position);
            

            Gruß Dennis

            1. Hallo Yadgar,

              <select name="position">
                <option value="0">Pedal</option>
              </select>
              

              Das habe ich jetzt auch versucht... ES FUNKTIONIERT NICHT!!!!!!

              Das ist mein Pulldown-Menü:

                  echo '  <select name="Position">';
                  echo '    <option value="">Position ausw&auml;hlen</option>';
                  if (isset($row_old) && $row_old[1]==0)
                    echo '    <option selected value="0">Pedal</option>';
                  else
                    echo '    <option value="0">Pedal</option>';
                  if (isset($row_old) && $row_old[1]==1)
                    echo '    <option selected value="1">Unteres Manual</option>';
                  else
                    echo '    <option value="1">Unteres Manual</option>';
                  if (isset($row_old) && $row_old[1]==2)  
                    echo '    <option selected value="2">Oberes Manual</option>';
                  else
                    echo '    <option value="2">Oberes Manual</option>';
                  if (isset($row_old) && $row_old[1]==3)  
                    echo '    <option selected value="3">3. Manual</option>';
                  else
                    echo '    <option value="3">3. Manual</option>';
                  if (isset($row_old) && $row_old[1]==4)
                    echo '    <option selected value="4">4. Manual</option>';
                  else
                    echo '    <option value="4">4. Manual</option>';
                  echo '  </select>';
              
              

              Das steht nach dem Abschicken der Daten in $_POST:

              array(7) { ["Position"]=> string(1) "1" ["Tiefste_Taste"]=> string(2) "29" ["Hoechste_Taste"]=> string(4) "c'''" ["Pedaltyp"]=> string(0) "" ["Tastentyp"]=> string(12) "Vorspringend" ["Gewichtet"]=> string(4) "nein" ["Aftertouch"]=> string(4) "nein" } 
              

              So sieht der Aufbau des Querystrings und das anschließend Absenden zur Datenbank aus:

                    if (check() == true)
                    {
              	$query = 'INSERT INTO klaviaturen (Position, Tiefste_Taste, Hoechste_Taste, Pedaltyp, SchweifungHorizontal, SchweifungVertikal, Radial, Tastentyp, Gewichtet, Aftertouch) VALUES ("'.mysql_real_escape_string($_POST['Position']).'","'.mysql_real_escape_string($_POST['Tiefste_Taste']).'","'.mysql_real_escape_string($_POST['Hoechste_Taste']).'",';
              	if ($_POST['Pedaltyp'] == NULL)
              	  $query = $query.'NULL,';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Pedaltyp']).'",';
              	if ($_POST['Schweifung_Horizontal'] == NULL)
              	  $query = $query.'NULL,';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Schweifung_Horizontal']).'",';
              	if ($_POST['Schweifung_Vertikal'] == NULL)
              	  $query = $query.'NULL,';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Schweifung_Vertikal']).'",';
              	if ($_POST['Radial'] == NULL)
              	  $query = $query.'NULL,';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Radial']).'",';
              	if ($_POST['Tastentyp'] == NULL)
              	  $query = $query.'NULL,';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Tastentyp']).'",';
              	if ($_POST['Gewichtet'] == NULL)
              	  $query = $query.'NULL,';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Gewichtet']).'",';
              	if ($_POST['Aftertouch'] == NULL)
              	  $query = $query.'NULL)';
              	else
              	  $query = $query.'"'.mysql_real_escape_string($_POST['Aftertouch']).'");';
              	dbcall();  
              	dberror();
              	$result = mysql_query($query);
              	dberror();
              	echo "<p>Datensatz wurde in die Datenbank eingetragen!</p>";
                    } 
              
              

              Es sollte also in der ersten Spalte der Datenbank (Position) 1 stehen und in der zweiten (Tiefste_Taste) 29... aber was steht tatsächlich drin? 0 und 0!

              Ich bin kurz davor, den Computer kurz und klein zu schlagen und den Notarzt zu rufen! ICH KANN NICHT MEHR!!!!!!!

              Ich sollte die Programmiererei ganz aufgeben und mich den Rest meines Lebens auf das einzige konzentrieren, was ich tatsächlich kann: Fahrrad fahren und von Afghanistan träumen!

              1. Hallo Yadgar,

                Das steht nach dem Abschicken der Daten in $_POST:

                array(7) { ["Position"]=> string(1) "1" ["Tiefste_Taste"]=> string(2) "29" ["Hoechste_Taste"]=> string(4) "c'''" ["Pedaltyp"]=> string(0) "" ["Tastentyp"]=> string(12) "Vorspringend" ["Gewichtet"]=> string(4) "nein" ["Aftertouch"]=> string(4) "nein" } 
                

                spontan fällt mir hier auf, dass Schweifung_Horizontal, Schweifung_Vertikal und Radial in $_POST fehlen. Das sollte Dir im Folgenden mindestens eine Notice werfen. Lass Dir doch mal die PHP- und MySQL-Fehlermeldungen ausgeben. Vielleicht kommst Du so der Ursache schon etwas näher.

                Außerdem: Die MySQL-Erweiterung von PHP solltest Du nicht mehr verwenden, die ist veraltet. Verwende besser Mysqli oder PDO.

                So sieht der Aufbau des Querystrings und das anschließend Absenden zur Datenbank aus:

                	$query = 'INSERT INTO klaviaturen (Position, Tiefste_Taste, Hoechste_Taste, Pedaltyp, SchweifungHorizontal, SchweifungVertikal, Radial, Tastentyp, Gewichtet, Aftertouch) VALUES ("'.mysql_real_escape_string($_POST['Position']).'","'.mysql_real_escape_string($_POST['Tiefste_Taste']).'","'.mysql_real_escape_string($_POST['Hoechste_Taste']).'",';
                	if ($_POST['Pedaltyp'] == NULL)
                	  $query = $query.'NULL,';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Pedaltyp']).'",';
                	if ($_POST['Schweifung_Horizontal'] == NULL)
                	  $query = $query.'NULL,';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Schweifung_Horizontal']).'",';
                	if ($_POST['Schweifung_Vertikal'] == NULL)
                	  $query = $query.'NULL,';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Schweifung_Vertikal']).'",';
                	if ($_POST['Radial'] == NULL)
                	  $query = $query.'NULL,';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Radial']).'",';
                	if ($_POST['Tastentyp'] == NULL)
                	  $query = $query.'NULL,';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Tastentyp']).'",';
                	if ($_POST['Gewichtet'] == NULL)
                	  $query = $query.'NULL,';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Gewichtet']).'",';
                	if ($_POST['Aftertouch'] == NULL)
                	  $query = $query.'NULL)';
                	else
                	  $query = $query.'"'.mysql_real_escape_string($_POST['Aftertouch']).'");';
                

                Es sollte also in der ersten Spalte der Datenbank (Position) 1 stehen und in der zweiten (Tiefste_Taste) 29... aber was steht tatsächlich drin? 0 und 0!

                Wird denn überhaupt was in die Datenbank eingetragen? Oder ist zwischendurch ein Fehler aufgetreten? Was mir sonst noch auffällt: Du beendest $query mit einem Semikolon, in der mysql_query-Doku wird darauf hingewiesen, dass man das nicht tun sollte. Weiß aber nicht, ob Dich das weiterbringt.

                Außerdem könntest Du die $_POST-Variablen wohl besser mit isset oder empty statt gegen null überprüfen.

                	dbcall();  
                	dberror();
                	$result = mysql_query($query);
                	dberror();
                	echo "<p>Datensatz wurde in die Datenbank eingetragen!</p>";
                

                Was machen die Funktionen dbcall() und dberror()? Außerdem ist Dein echo relativ sinnlos, weil Du ja überhaupt nicht überprüfst, ob der Datensatz tatsächlich eingetragen wurde. Du behauptest das einfach, obwohl Du wohl eigentlich $result auswerten möchtest.

                Gruß Dennis

                1. Hallo Yadgar,

                  spontan fällt mir hier auf, dass Schweifung_Horizontal, Schweifung_Vertikal und Radial in $_POST fehlen.

                  Die fehlen (bzw. sollten NULL enthalten), weil zu den entsprechenden Feldern (in der Eingabemaske alles Radiobuttons ohne Default-Werte) nichts eingegeben wurde - ich gab die Daten eines unteren Manuals ein, da sind diese drei Pedal-Eigenschaften gegenstandslos.

                  Das sollte Dir im Folgenden mindestens eine Notice werfen. Lass Dir doch mal die PHP- und MySQL-Fehlermeldungen ausgeben. Vielleicht kommst Du so der Ursache schon etwas näher.

                  Habe ich gemacht, ich bekomme folgende Warnmeldungen:

                  Direkt nach dem Aufruf von klaviaturen.php erst einmal

                  **Notice: Undefined index: section in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 269 **

                  Das ist logisch, weil $_GET['section'] erst einen definierten Wert bekommt, wenn entweder "Neue Datensätze eingeben" (dann 1) oder "Vorhandene Datensätze bearbeiten" (dann 2) angeklickt wurde.

                  Wenn ich jetzt "Neue Datensätze eingeben" anklicke, kommen noch vor der Eingabemaske folgende fünf Warnmeldungen:

                  **Notice: Undefined index: mode in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 29

                  Notice: Undefined index: mode in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 40

                  Notice: Undefined index: id in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 40

                  Notice: Undefined index: first in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 40

                  Notice: Undefined index: sort in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 40 **

                  Auch keine Überraschung, da mode, id, first und sort erst nach dem Anklicken von "Vorhandene Datensätze bearbeiten" ihre Werte bekommen, in der Verzweigung für $_GET['section'] = 1 hingegen gar nicht vorkommen.

                  Jetzt meine Testeingabe:

                  Position: Unteres Manual ($_POST['Position'] = 1) Tiefste Taste: F ($_POST['Tiefste_Taste'] = 29) Höchste Taste: c''' ($_POST['Hoechste_Taste'] = "c'''" - hier hatte ich noch nicht auf Integers als value-Werte umgestellt, kommt aber bei nächster Gelegenheit!) Pedaltyp, Schweifung horizontal, Schweifung vertikal, Radial bleiben leer, die entsprechenden $_POST-Elemente müssten also NULL enhalten - aber wieso werden sie dann beim var_dump nicht als NULL angezeigt?) Tastentyp: Vorspringend ($_POST['Tastentyp'] = "Vorspringend", siehe "Hoechste Taste") Gewichtet: nein ($_POST['Gewichtet'] = "nein") Aftertouch: nein ($_POST['Aftertouch'] = "nein")

                  In $_POST steht folgendes:

                  array(7) { ["Position"]=> string(1) "1" ["Tiefste_Taste"]=> string(2) "29" ["Hoechste_Taste"]=> string(4) "c'''" ["Pedaltyp"]=> string(0) "" ["Tastentyp"]=> string(12) "Vorspringend" ["Gewichtet"]=> string(4) "nein" ["Aftertouch"]=> string(4) "nein" }

                  Dann folgende Warnmeldungen:

                  **Notice: Undefined index: Schweifung_Horizontal in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 227

                  Notice: Undefined index: Schweifung_Vertikal in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 227

                  Notice: Undefined index: Radial in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 227

                  Notice: Undefined index: Schweifung_Horizontal in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 246

                  Notice: Undefined index: Schweifung_Vertikal in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 249

                  Notice: Undefined index: Radial in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 252**

                  Aha, die drei Elemente existieren überhaupt nicht, folglich kann da auch nicht NULL stehen - also werde ich auf !isset() prüfen müssen!

                  Außerdem: Die MySQL-Erweiterung von PHP solltest Du nicht mehr verwenden, die ist veraltet. Verwende besser Mysqli oder PDO.

                  Mag ja sein, aber mein Miet-Server arbeitet noch mit PHP 4!

                  Wird denn überhaupt was in die Datenbank eingetragen?

                  "Irgendwas" wird durchaus eingetragen, bei meinen Eingabebeispiel der Reihe nach:

                  ID: 30 (soviele vergebliche Versuche habe ich bereits hinter mir...) Position: 0 (hä?) Tiefste_Taste: 0 (hää??) Hoechste_Taste 0 (was soll denn das?!?) Pedaltyp: NULL (Defaultwert) Schweifung_horizontal: NULL (Defaultwert) Schweifung_vertikal: NULL (Defaultwert) Radial: NULL (Defaultwert) Tastentyp: (leer), ich vermute "" Gewichtet: 0 (Typ ist bool, also passt das zumindest zu "nein") Aftertouch: 0 (dito)

                  Also, ich weiß nicht, was ich davon halten soll... komplett gaga wird es aber jetzt mit den folgenden Warnmeldungen:

                  **Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                  Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                  Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                  Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                  Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                  Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                  Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 304

                  Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 304

                  Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 308

                  Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 308

                  Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 312

                  Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 312

                  **

                  Den einzigen Reim, den ich mir darauf machen kann ist, dass die Serveradministration zwischenzeitlich die Verfahrensweise bei mysql_real_escape_string() umgestellt hat, Magic Quotes aktiviert hat oder dergleichen... dann müssten ja meine bislang bereits erfolgreich programmierten Eingabeseiten dieselben Meldungen werfen!

                  Genau das passiert aber nicht - wenn ich mit verkaufoderangebot.php einen neuen Datensatz eingebe, ist alles einwandfrei!

                  Was machen die Funktionen dbcall() und dberror()?

                  dbcall():

                    function dbcall()
                    {
                      $db = mysql_connect("www.bergisch-afghanistan.de", "d0069173", "Passwort_verrate_ich_euch_natuerlich_nicht");
                      dberror();
                      $db = mysql_select_db("d0069173");
                      dberror();
                    }
                  
                  

                  dberror():

                    function dberror()
                    {
                      if (mysql_errno())
                      {
                        switch(mysql_errno())
                        {
                  	case 1062:
                  	  die ("Ein Eintrag mit diesen Daten existiert bereits! Bitte korrigieren Sie Ihre Eingabe!<br>");
                  	break;
                  	default:
                  	  die (mysql_errno().": ".mysql_error()."<br>");
                        }
                      }
                    }
                  
                  

                  Außerdem ist Dein echo relativ sinnlos, weil Du ja überhaupt nicht überprüfst, ob der Datensatz tatsächlich eingetragen wurde. Du behauptest das einfach, obwohl Du wohl eigentlich $result auswerten möchtest.

                  Werde ich ändern!

                  Bis bald im Khyberspace!

                  Yadgar

                  1. Hallo Yadgar,

                    das ist doch schon mal eine viel bessere Problembeschreibung. Als Tipp: Versuche auch die nächsten Male, wenn ein Problem auftritt, zuerst die Fehlermeldungen auszuwerten. Probleme treten immer wieder auf, da kannst Du auch der tollste Programmierer der Welt sein. Und die Fehlermeldungen können bei der Suche nach dem Fehler sehr hilfreich sein.

                    Also, ich weiß nicht, was ich davon halten soll... komplett gaga wird es aber jetzt mit den folgenden Warnmeldungen:

                    **Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                    Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/khyberspace/greenbook_admin/klaviaturen.php on line 284

                    Ich vermute, dass die Warnmeldungen gar nicht so gaga sind und auch etwas mit Deinem Problem zu tun haben könnten. mysql_real_escape_string benötigt eine aktive Verbindungskennung, wenn nicht angegeben wird die zuletzt genutzte Verbindung verwendet und wenn die nicht vorhanden ist, wird soweit ich weiß "irgendeine default-Verbindung" ausprobiert. Und dies könnte bei Dir der Fall sein.

                    Also: Versuche mal, den Aufruf von dbcall() ganz an den Anfang Deines Skripts (oder zumindest vor den ersten Aufruf von mysql_real_escape_string) zu setzen. Und schaue Dir dann an was passiert, ob die Fehlermeldungen noch immer da sind und was in der Datenbank steht.

                    Alles weitere können wir dann, wenn Du möchtest, noch später durchgehen.

                    Gruß Dennis

                    1. Hi(gh)!

                      das ist doch schon mal eine viel bessere Problembeschreibung. Als Tipp: Versuche auch die nächsten Male, wenn ein Problem auftritt, zuerst die Fehlermeldungen auszuwerten. Probleme treten immer wieder auf, da kannst Du auch der tollste Programmierer der Welt sein.

                      Das bin ich mit absoluter Sicherheit nicht; in der Weltrangliste der Programmierer stehe ich im Moment auf Platz 10589302, einen Platz hinter Zalmay Abdullah Nurzai (11 Jahre) aus Abdurrahmankhan Kalay, Provinz Zabul, Afghanistan, und einen Platz vor Mandy Prollmann, Berlin-Marzahn, die kürzlich einen Commodore 64 geschenkt bekommen hat und jetzt das Basic-Handbuch durcharbeitet...

                      Und die Fehlermeldungen können bei der Suche nach dem Fehler sehr hilfreich sein.

                      Ich kommentiere die beiden Zeilen in der Regel aus, weil mich vollgeknatterte Bilschirme nerven...

                      Also: Versuche mal, den Aufruf von dbcall() ganz an den Anfang Deines Skripts (oder zumindest vor den ersten Aufruf von mysql_real_escape_string) zu setzen. Und schaue Dir dann an was passiert, ob die Fehlermeldungen noch immer da sind und was in der Datenbank steht.

                      Habe ich gemacht... das sieht jetzt schon wesentlich besser aus, unter "Position" steht jetzt tatsächlich "1", unter "Tiefste_Taste" steht "29"! Die Fehlermeldungen sind verschwunden!

                      Danke für den Tipp! Ich werde dich umgehend in meine Danksagungs-Liste eintragen!

                      Bis bald im Khyberspace!

                      Yadgar

                      1. Hallo Yadgar,

                        Und die Fehlermeldungen können bei der Suche nach dem Fehler sehr hilfreich sein.

                        Ich kommentiere die beiden Zeilen in der Regel aus, [...]

                        das solltest Du während der Entwicklung nicht tun. Fehlermeldungen sind hilfreich. Sie helfen Dir, Fehler frühzeitig zu erkennen und zu beheben. Das müssen auch erstmal keine schwerwiegenden Fehler sein, aber selbst eine einfache Notice kann Dir später irgendwann mal um die Ohren fliegen. Und dann wird es richtig schwer, den Fehler zu finden. Da dann doch lieber direkt den Fehler beseitigen, zumal das meistens dann auch relativ schnell geht, wenn man das immer direkt und konsequent macht.

                        [...] weil mich vollgeknatterte Bilschirme nerven...

                        Das ist nachvollziehbar. Aber dem muss ja nicht so sein. Versuche immer, die Fehler direkt zu beseitigen. Dann kommt es nämlich gar nicht erst zu "vollgeknatterten Bildschirmen". Sich die Fehler anzeigen zu lassen und direkt zu versuchen, sie zu beheben, ist schon der erste und sehr wichtige Schritt für vernünftiges debugging. Ich kann es Dir jedenfalls sehr empfehlen. Und wenn Dir eine Fehlermeldung unklar ist oder Du nicht weißt, wie Du die Fehlermeldung weg bekommst (sprich: wie Du den Fehler beseitigen kannst), kannst Du gerne hier nachfragen.

                        Gruß Dennis

              2. Gute Nacht!

                Ich bin kurz davor, den Computer kurz und klein zu schlagen und den Notarzt zu rufen! ICH KANN NICHT MEHR!!!!!!! Ich sollte die Programmiererei ganz aufgeben und mich den Rest meines Lebens auf das einzige konzentrieren, was ich tatsächlich kann: Fahrrad fahren und von Afghanistan träumen!

                Mach dir kein Kopf darüber. Du glaubst nicht wie sehr eine Mütze Schlaf helfen kann. Wenn du dich dannach wieder an dein Problemchen setzt und alles einmal ganz locker durchliest wirst du wahrscheinlich mehr finden als in deinem jetztigen Zustand. Nun, zumindest mir hat es schon oft geholfen...

                Nacht!

              3. Hallo,

                Ich sollte die Programmiererei ganz aufgeben

                oder lernen, deine Programme zu debuggen: finde heraus, an welcher Stelle genau deine Erwartung nicht erfüllt wird. Im Normalfall macht ein Computer nämlich genau das, was man ihm sagt und nicht das was man denkt was er eigentlich tun sollte.

                Gruß
                Kalk

  2. echo "[".$_POST['Position']."]<br>";

     if ($_POST['Position'] == "Pedal")
        $Position = 0;
      else if ($_POST['Position'] == "Unteres Manual")
        $Position = 1;
      else if ($_POST['Position'] == "Oberes Manual")
        $Position = 2;
      else if ($_POST['Position'] == "3. Manual")
        $Position = 3;
      else 
        $Position = 4;
    

    echo "[".$Position."]<br>";

    in $Position steht aber immer nur NULL! Warum?

    Wie hast du auf NULL geprüft?

    Wahrscheinlich durchläuft das Programm gar nicht diese Zeilen und $Position ist überhaupt nicht definiert.

    Ergänze deinen Code mal um die beiden echo Zeilen.

    Die eckigen Klammern sind dazu da, auch einen leeren, bzw. fehlenden Wert zu erkennen. Ich erwarte, dass du die beiden Ausgaben nicht siehst.

    Linuchs

    1. echo "[".$_POST['Position']."]<br>";

       if ($_POST['Position'] == "Pedal")
          $Position = 0;
        else if ($_POST['Position'] == "Unteres Manual")
          $Position = 1;
        else if ($_POST['Position'] == "Oberes Manual")
          $Position = 2;
        else if ($_POST['Position'] == "3. Manual")
          $Position = 3;
        else 
          $Position = 4;
      

      echo "[".$Position."]<br>";

      in $Position steht aber immer nur NULL! Warum?

      Wie hast du auf NULL geprüft?

      Wahrscheinlich durchläuft das Programm gar nicht diese Zeilen und $Position ist überhaupt nicht definiert.

      Ergänze deinen Code mal um die beiden echo Zeilen.

      Die eckigen Klammern sind dazu da, auch einen leeren, bzw. fehlenden Wert zu erkennen. Ich erwarte, dass du die beiden Ausgaben nicht siehst.

      Linuchs

      Hat sich erledigt, ich übergebe $_POST inzwischen direkt die Integerwerte mittels <option value= >!

      Bis bald im Khyberspace!

      Yadgar