Yadgar: PHP 4: Datenbank-Eingaberoutine verhält sich merkwürdig

Hi(gh)!

Ich versuche mal wieder, eine MySQL-Datenbank für elektronische Orgeln zum Laufen zu bringen, habe anfangen, Eingabeseiten für die einzelnen Tabellen zu erstellen... leider funktionierte die Eingabe neuer Datensätze nur beim ersten Datensatz, ab dem zweiten verschwindet einfach die Seite, ich bekomme nicht einmal eine Fehlermeldung! Wenn ich anschließend mit PHPMyAdmin in der Datenbank nachsehe, stelle ich fest, dass überhaupt keine Daten geschrieben wurden.

Hier ist der Code:

<?php   require("head.php"); head("GREENBOOK - Dateneingabe: hersteller"); ?>   <body> <?   require("navbar.php"); ?>   <div style="position:absolute; width:74%; top:0px; left:26%; padding-left:5px">     <h2>GREENBOOK: Dateneingabe</h2>     <h3>Datentabelle: hersteller</h3>     <p>       <a href="hersteller.php?section=1"><span class="b">Datensätze hinzufügen</span></a>&nbsp;&nbsp;&nbsp;       <a href="hersteller.php?section=2"><span class="b">Vorhandene Datensätze bearbeiten</span></a>     </p> <?     switch($_GET['section'])     {       case 1:         ?> <h3>Datensätze hinzufügen</h3>    <form method="POST" action="hersteller.php">    <table>      <tr>        <th>          Firmenname:        </th>        <td>          <input type="text" name="Firmenname" size="60">        </td>      </tr>      <tr>        <th>          Land:        </th>        <td>          <input type="text" name="Land" size="30">        </td>      </tr>      <tr>        <th>          Status:        </th>        <td>          <input type="radio" name="Status" value="aktiv">aktiv<br>          <input type="radio" name="Status" value="erloschen">erloschen        </td>      </tr>      <tr>        <th>          Link:        </th>        <td>          <input type="text" name="Link" size="80">        </td>      </tr>      </table>            <p>      <input type="submit" value="Daten absenden">    </p>        <? $Firmenname = $_POST['Firmenname']; $Land = $_POST['Land']; $Status = $_POST['Status']; $Link = $_POST['Link']; echo '<p>'.$Firmenname.'</p>'; if (!$Firmenname) {   echo "Sie haben keine Daten eingegeben!<br>"; } else {   dbcall();   $query = "INSERT INTO hersteller (Firmenname, Land, Status, Link) VALUES ('".mysql_real_escape_string($Firmenname)."','".mysql_real_escape_string($Land)."','".mysql_real_escape_string($Status)."','".mysql_real_escape_string($Link)."')";   $result = mysql_query($query);   dberror();   echo "Ihre Eingabe war korrekt und wurde in die Datenbank eingetragen!";   $db = mysql_close();   dberror(); }       break;       case 2:         echo '<h3>Vorhandene Datensätze bearbeiten</h3>';         dbcall();         $query = "DESCRIBE hersteller";         $result = mysql_query($query);         dberror();         echo '<table width="95%">';         echo '<tr>';         for ($i=0; $i<=4; $i++)         {           $row = mysql_fetch_row($result);           echo '<th>'.$row[0].'</th>';         }         echo '</tr>'; $query = "SELECT * FROM hersteller"; $result = mysql_query($query); dberror(); while ($row = mysql_fetch_row($result)) {   echo '<tr><td align="right">'.$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td><td>".$row[3]."</td><td>".$row[4]."</td></tr>"; } $db = mysql_close(); dberror();     }   ?>   </div>   </body> </html>

Bis bald im Khyberspace!

Yadgar

  1. hi,

    innerhalb der Kontrolle über GET-Parameter (case: 1) POST-Parameter abzufragen, das sieht ziemlich planlos aus. Was passiert:

    Mit dem GET-Parameter 'section' erzeugst Du das Formular und gibst es aus. Beim ersten POST steht im URL der section-Parameter und wird mitgesendet, die Kontrollstruktur greift und Du hast auch die POST-Parameter. Deine Form-action führt jedoch diesen Parameter nicht mit, so kommst Du nach einem POST mit dem Formular nicht erneut in den case: 1.

    Schnelle Lösung: Setze den section-Parameter im action-Attribute hinten dran. Ungetestet:

              <form method="POST" action="hersteller.php?section=1">

    Die Kontrollstruktur würde ich jedoch grundsätzlich mal gründlich überarbeiten.

    Schönen Sonntag, mfG.

    1. Hi(gh)!

      Schnelle Lösung: Setze den section-Parameter im action-Attribute hinten dran. Ungetestet:

                <form method="POST" action="hersteller.php?section=1">

      Ja, hat funktioniert! Erst mal danke für den Tipp!

      Die Kontrollstruktur würde ich jedoch grundsätzlich mal gründlich überarbeiten.

      Was spricht denn auf die Dauer gegen diese Lösung?

      Bis bald im Khyberspace!

      Yadgar

      Now playing: Hungry like the Wolf, live 1984 (Duran Duran)

      1. high,

        Was spricht denn auf die Dauer gegen diese Lösung?

        Die Logik: Entweder hast Du einen Parameter, der das Formular ausgibt oder Du hast die Daten, welche aus dem Formular kommen. Es ist unlogisch, einen GET-Parameter zu befragen, ob Daten ge-POST-et wurden. Logischer wäre die Kontrolle, ob ein Submit des Forms erfolgte, in einfachsten Fall wird dazu geprüft, ob der Name des Submit-Buttons in der Parameterliste vorhanden ist und dann gehts an die Prüfung der Eingaben.

        Und dann gibt es noch den Fall, dass unbekannte Parameter im Request sind. Eine Kontrollstruktur sollte alle Fälle abdecken.

        MfG

  2. Tach!

    leider funktionierte [nicht viel] ich bekomme nicht einmal eine Fehlermeldung!
    Hier ist der Code:

    Wie weit bist du mit dem Debugging? Einfach Code in ein Forum zu kippen ist nicht zielführend. Ich nehme an, Zugriff auf Logfiles hast du keinen?

    Erstes Gebot beim Fehlersuchen ist das error_reporting auf E_ALL zu stellen und display_errors auf on. Ersteres geht über die gleichnameige Funktion, letzteres mit ini_set(). Bei weißer Seite kann es sich auch um einen Syntaxfehler handeln, da helfen diese beiden Einstellugen im Script nichts mehr, weil es wegen des Syntaxfehlers gar nicht ausgeführt wird. Als Test, ob überhaupt etwas im Script erreicht wird, kann man ein die('irgendein Text'); gleich am Anfang (natürlich in einen PHP-Bereich) einfügen. Bricht das Script mit Anzeige des Textes ab, war die Ausführung bis dahin in Ordnung. Steht das die() ganz oben, kann man dann auch davon ausgehen, dass es keinen Syntaxfehler gab. Nun setzt man in kleineren oder größeren Abständen das die() immer weiter nach unten und wenn es irgendwann nicht mehr ausgegben wird, hat man die kritische Stelle erreicht und kann genauer nachschauen.

    Weiterhin helfen Kontrollausgaben. Schau dir die Inhalte von Variablen mit var_dump() an und vergleiche Wunsch mit Wirklichkeit.

    dedlfix.

  3. @@Yadgar:

    nuqneH

      <div style="position:absolute; width:74%; top:0px; left:26%; padding-left:5px">

    Darstellungsangaben haben im HTML-Quelltext nichts zu suchen. Sie gehören ins Stylesheet, nicht inline in style-Attribute.

          <a href="hersteller.php?section=1"><span class="b">Datensätze hinzufügen</span></a>&nbsp;&nbsp;&nbsp;

    Nö, Abtände nicht mit NBSP, sondern mit CSS.

    Vielleicht auch ein sichtbares Trennzeichen dazwischen:

          <a href="hersteller.php?section=1"><span class="b">Datensätze hinzufügen</span></a> |       <a href="hersteller.php?section=2"><span class="b">Vorhandene Datensätze bearbeiten</span></a>

    Eine Klasse nichtssagend "b" zu benennen ist auch eher grober Unfug. Wofür soll das stehen?

    Qapla'

    -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Hi,

      <span class="b">Datensätze hinzufügen</span>

      Eine Klasse nichtssagend "b" zu benennen ist auch eher grober Unfug. Wofür soll das stehen?

      Für “bold” vielleicht :-)

      MfG ChrisB

      --
      Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/

      1. @@ChrisB:

        nuqneH

        Eine Klasse nichtssagend "b" zu benennen ist auch eher grober Unfug. Wofür soll das stehen?

        Für “bold” vielleicht :-)

        Das war auch meine Befürchtung.

        Qapla'

        -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    2. Hi(gh)!

      nuqneH

      Hach, was bist du kewl!

      Darstellungsangaben haben im HTML-Quelltext nichts zu suchen. Sie gehören ins Stylesheet, nicht inline in style-Attribute.

      Und warum bitte gibt es dann überhaupt style-Attribute? Damit die Gralshüter der Webdesign-Orthodoxie was zu meckern haben?

      </a>&nbsp;&nbsp;&nbsp;

      Nö, Abtände nicht mit NBSP, sondern mit CSS.

      Und warum bitte gibt es dann überhaupt &nsbp; ? Damit die Gralshüter der Webdesign-Orthodoxie was zu meckern haben?

      Vielleicht auch ein sichtbares Trennzeichen dazwischen:

            <a href="hersteller.php?section=1"><span class="b">Datensätze hinzufügen</span></a> |       <a href="hersteller.php?section=2"><span class="b">Vorhandene Datensätze bearbeiten</span></a>

      Kommt später noch - erst die Logik, dann das Design!

      Eine Klasse nichtssagend "b" zu benennen ist auch eher grober Unfug. Wofür soll das stehen?

      "b" steht für "bold"!

      Abgesehen davon geht es hier um ein PHP-, möglicherweise auch um ein MySQL-Problem...

      Bis bald im Khyberspace!

      Yadgar

      1. Hallo,

        Gralshüter
        Gralshüter

        Wenn du ein Problem mit den Gralshütern hast, warum bist du zu ihnen gegangen?

        Gruß
        Kalk

      2. Om nah hoo pez nyeetz, Yadgar!

        Darstellungsangaben haben im HTML-Quelltext nichts zu suchen. Sie gehören ins Stylesheet, nicht inline in style-Attribute.

        Und warum bitte gibt es dann überhaupt style-Attribute? Damit die Gralshüter der Webdesign-Orthodoxie was zu meckern haben?

        Betrachte sie als Überbleibsel. Es gibt schließlich auch noch Disketten. ;-) Eine Trennung von Inhalt (HTML), Präsentation (CSS) und Verhalten (JS) ist sinnvoll.

        Manchmal kommt man aber um inline-Styles schlecht herum, etwa wenn man JS zur Animation verwendet (worauf man immer häufiger verzichten kann) oder wenn die Alternative heißt, viele viele Klassen zu definieren.

        </a>&nbsp;&nbsp;&nbsp;
        Nö, Abtände nicht mit NBSP, sondern mit CSS.

        Und warum bitte gibt es dann überhaupt &nsbp; ? Damit die Gralshüter der Webdesign-Orthodoxie was zu meckern haben?

        Das ist _ein_ festes Leerzeichen, sinnvoll etwa zwischen Zahl und Einheit um einen Umbruch zu verhindern. (Wir liefen heute 2 Kilometer)

        Eine Klasse nichtssagend "b" zu benennen ist auch eher grober Unfug. Wofür soll das stehen?

        "b" steht für "bold"!

        Ein Klassenbezeichner sollte den Grund dafür liefern, warum du den Inhalt fett dargestellt haben möchtest, wobei sich in diesem Fall auch gut auf die span-Elemente verzichten ließe.

        <p> >       <a href="hersteller.php?section=1"><span class="b">Datensätze hinzufügen</span></a>&nbsp;&nbsp;&nbsp; >       <a href="hersteller.php?section=2"><span class="b">Vorhandene Datensätze bearbeiten</span></a> >     </p> > > `` html > <p>       <a href="hersteller.php?section=1">Datensätze hinzufügen</a>       <a href="hersteller.php?section=2">Vorhandene Datensätze bearbeiten</a> </p>

        Spekulativ gibt es ein Vorfahrenelement mit einem aussagekräftigem Bezeichner etwa "Daten_bearbeiten". Dann wäre folgendes CSS zielführend

        .Daten_bearbeiten p a {    font-weight: bold;    margin-right: 3em; }

        So, nun habe ich dir zwar allgemeine Hinweise gegeben, aber zu deinem ursprünglichen Problem nichts beitragen können.

        Matthias

        -- Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Igel und Igelit.
      3. @@Yadgar:

        nuqneH

        Und warum bitte gibt es dann überhaupt &nsbp; ?

        Eine Anwendung hat Matthias schon genannt. Wobei ich bei Einheitensymbolen (2 km) eher ein U+202F narrow no-break space dazwischensetzen würde. (Dummerweise gibt es dafür in HTML5 immer noch keine benannte Entity.)

        Ein andere Anwendung wäre vor einem Gedankenstrich, der im Deutschen nicht am Zeilenanfang stehen sollte, AFAIK. Oder vor dem Auslassungszeichen …

        Kommt später noch - erst die Logik, dann das Design!

        Das ist Unsinn. Interaktionsdesign ist wesentlicher Bestandteil des Designs, und wohl ein wichtigerer als das Grafikdesign. Siehe Jesse James Garretts berümtes Diagramm. Das Buch sollte man auch gelesen haben. IIRC gibt’s das (zumindest die erste Auflage) auch auf deutsch.

        Interaktionsdesign ist Grundlage für die Implementation der Programmlogik. Also andersrum: erst das Design, dann die Logik!

        "b" steht für "bold"!

        Das ist aus mehrerlei Sicht schlecht. Zum einen Lesbarkeit. Die Abkürzung tut niemandem gut, "bold" als Klassenbezeichner macht den Code besser lesbar.

        Präsentationsbezogene Klassen sind grundsätzlich problematisch. Dann kannst du auch gleich style="font-weight: bold" verwenden. Oder b-Elemente. Das wäre wenigstens ehrliches präsentationsbezogenes Markup.

        Abgesehen davon geht es hier um ein PHP-, möglicherweise auch um ein MySQL-Problem...

        Hier im Forum geht es immer um ALLE Probleme; nicht bloß darum, was der OP für sein Problem hält.

        Qapla'

        -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. Om nah hoo pez nyeetz, Gunnar Bittersmann!

          Wobei ich bei Einheitensymbolen (2 km) eher ein U+202F narrow no-break space dazwischensetzen würde.

          Ich auch. Deshalb schrieb ich auch „2 Kilometer“ ;) Eine Zeitlang herrschte auch Uneinigkeit dahingehend, ob man gar kein Leerzeichen verwenden solle. Bei Prozent ist das nach meinem Eindruck immer noch weit verbreitet.

          Matthias

          -- Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Bar und Barsch.
          1. @@Matthias Apsel:

            nuqneH

            Eine Zeitlang herrschte auch Uneinigkeit dahingehend, ob man gar kein Leerzeichen verwenden solle.

            Die Regel ist wohl: immer Leerzeichen, außer bei °. (Aber auch Leerzeichen vor °C.)

            Bei Prozent ist das nach meinem Eindruck immer noch weit verbreitet.

            Da begehe ich eine „willful violation“, wie’s in HTML5-Sprech so schön heißt.

            Qapla'

            -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            1. Mahlzeit,

              Die Regel ist wohl: immer Leerzeichen, außer bei °. (Aber auch Leerzeichen vor °C.)

              Ist das in Punkto Plenking nicht überholt? Ich meine, auch wenn es die Regel ist, wenn im Text

              heute hat es 22 °C. Gegen Abend ist mit zunehmender Dunkelheit zu rechnen.

              Da wäre dann ein zusätzlicher Tag nötig wie ein span um einen solchen Umbruch zu verhindern.
              Wie ist denn da die Best-Practise?

              --
              42

              1. @@M.:

                nuqneH

                heute hat es 22 °C. Gegen Abend ist mit zunehmender Dunkelheit zu rechnen.

                Da wäre dann ein zusätzlicher Tag nötig wie ein span um einen solchen Umbruch zu verhindern.

                Nei-en. 22&#x202F;°C oder 22&nbsp;°C

                Wie ist denn da die Best-Practise?

                Zu sagen: Heute _sind_ es 22 °C.

                Qapla'

                -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                1. Mahlzeit,

                  Nei-en. 22&#x202F;°C oder 22&nbsp;°C

                  Verdammt, wieder mal Bäume und Wald und so ....

                  Zu sagen: Heute _sind_ es 22 °C.

                  Ich bin hier in Bayern, da reden wir anders :P

                  --
                  42

                  1. Hi,

                    Ich bin hier in Bayern, da reden wir anders :P

                    Das sehe ich anders. Ich bin hier in Bayern, und AUSSERHALB reden die Leute anders ... ;-)

                    cu,
                    Andreas

                    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.

                    -- Warum nennt sich Andreas hier MudGuard?
                    O o ostern ...
        2. @@Gunnar Bittersmann:

          nuqneH

          Wobei ich bei Einheitensymbolen (2 km) eher ein U+202F narrow no-break space dazwischensetzen würde. (Dummerweise gibt es dafür in HTML5 immer noch keine benannte Entity.)

          <!DOCTYPE html [   <!ENTITY nnbsp "&#x202f"> ]>

          Hach, wie schön wäre doch die HTML-Welt, wenn man dort XML verstanden hätte.

          Qapla'

          -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. @@Gunnar Bittersmann:

            nuqneH

            <!DOCTYPE html [   <!ENTITY nnbsp "&#x202f"> ]>

            Hach, wie schön wäre doch die HTML-Welt, wenn man dort XML verstanden hätte.

            Vor allem würden bei XML Fehler sofort auffallen. Ein fehlendes Semikolon etwa.

            Qapla'

            -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)