Yadgar: Eingabeseiten für MySQL-Datenbank

Hi(gh)!

Vielleicht mein letzter Versuch, das Teil zum Laufen zu bekommen - wenn es nicht klappt, muss ich mich eben auf eine Eingabemaske für neue Datensätze beschränken und bei Bearbeitung vorhandener Datensätze wie gehabt PHPMyAdmin bemühen - was eine fiese Fummelei ist, da Indexwerte nicht in "Klartext" übersetzt werden.

Also: es geht um eine Datenbank für elektronische Orgeln, mit einer ganzen Anzahl von Eingabeseiten für die einzelnen Stammdaten und Relationstabellen. Die Tabelle, um die es hier geht heißt "hersteller" und hat folgende Felder:

ID (TINYINT, Primärschlüssel, AUTO_INCREMENT)
Firmenname (VARCHAR(60))
Land (VARCHAR(30))
Status (ENUM('aktiv','erloschen'))
Link (TINYTEXT)

Beim Klick auf "hersteller" in der Navigationsspalte am linken Fensterrand werden noch keine GET-Werte übergeben. Es öffnet sich die Seite mit den beiden Sub-Links "Datensätze hinzufügen" und "Vorhandene Datensätze bearbeiten". Während die Funktionalität von "Datensätze hinzufügen" einwandfrei implentiert ist (ich habe so etwas schon öfters programmiert und verwende den alten Code als Vorlage), gibt es mit "Vorhandene Datensätze bearbeiten" jede Menge Probleme.

Beim Klick auf "Vorhandene Datensätze bearbeiten" werden folgende GET-Variablen gesetzt:

section = 2
first = 0

section bezeichnet die beiden Hauptsektionen der Eingabeseiten (1 steht dabei für "Datensätze hinzufügen" und 2 eben für "Vorhandene Datensätze bearbeiten"). first bezeichnet die fortlaufende Nummer des Datensatzes in der ursprünglichen Eingabe-Reihenfolge (ohne ORDER BY-Operationen), ab der die jeweils nächsten 20 Datensätze auf der Seite angezeigt werden sollen. Diese Nummer ist NICHT identisch mit der von MySQL vergebenen Nummer im Feld ID; so hat der erste Datensatz in der Tabelle "hersteller" zur Zeit den ID-Wert 3 (die vorangegangenen Datensätze mit 0, 1 und 2 wurden gelöscht), in der PHP-Zählung für die Ausgabe haben die Datensätze aber natürlich weiterhin die Werte 0 bis 19.

Klicke ich nun auf "Vorhandene Datensätze", erscheint eine HTML-Tabelle mit allen Feldern und den ersten 20 Datensätzen der MySQL-Tabelle "hersteller", zusätzlich zu den Spalten entsprechend der Felder gibt es links noch zwei Spalten, die für jeden Datensatz je einen Link "Löschen" und "Bearbeiten" enthalten.

Die Spaltenköpfe mit den Feldnamen enthalten Links zu ORDER BY-Operationen; durch Klick wird die Tabelle entsprechend dem gewählten Feld aufsteigend sortiert, dabei werden folgende GET-Variablen gesetzt:

section = 2
sort = [Nummer des Feldes von 1 bis 5]
first = 0 (der Einfachheit halber auch bei höheren 20er-Blöcken)

Am Fuß der Tabelle wird ein Link zu den nächsten 20 Datensätzen angezeigt, folglich werden dort die GET-Variablen

section = 2
first = 20
und falls vorher ein ORDER BY-Link angeklickt wurde, auch
sort = [Nummer des Feldes von 1 bis 5]

Die Sortier-Links, der "Nächste 20 Datensätze"-Link wie auch die "Löschen"-Links funktionieren einwandfrei, das Problem, um das es hier geht, bezieht sich auf den "Bearbeiten"-Link.

Wenn ich jetzt neben dem ersten Datensatz in der Tabelle (ID = 3) auf "Bearbeiten" klicke, wird erneut die Tabelle wie bisher angezeigt, darunter dann die Eingabemaske (der Einfachheit halber in eine Funktion namens input() ausgelagert) mit den Werten des Datensatzes (ohne ID, da von MySQL automatisch vergeben) als vorgegebenen Inhalten. Interessanterweise werden diese Werte, soweit es sich um VARCHAR-Daten handelt nur bis zum ersten Whitespace übernommen, aber um diesen Fehler will ich mich später kümmern.

Die Daten kann ich jetzt ändern; ich gebe z. B. unter Land, wo bis jetzt "Japan" steht, "Nippon" ein.

Klicke ich dann auf "Daten absenden", sollte...

Oh Mann, jetzt sehe ich meinen Fehler: ich schicke die Daten mit method="POST" ab - dann wird natürlich im Array $_GET[] nichts verändert und das Programm kann nicht entsprechend reagieren! Und ich quäle mich monatelang rum und rätsele, was da los sein könnte...

...aber: die veränderten Datenbank-Daten sollten durchaus per POST abgeschickt werden, gleichzeitig müssen aber auch seiteninterne Daten mit GET übermittelt werden! Wie kann ich gleichzeitig POST und GET verwenden? Kann ich den submit-Button zusätzlich in einen <a> </a>-Link einschließen?

Bis bald im Khyberspace!

Yadgar

Bis bald im Khyberspace!

  1. Wie kann ich gleichzeitig POST und GET verwenden?

    Kannst du per Script den Submit des Formulars an eine selbst erstellte URL leiten? Dann könntest du dir URL selbst zusammenbauen während das Formular seine sonstigen Daten per POST schickt.

  2. Hi,

    Dein Problem ist, wie immer oder immer noch: die Strukturierung von Code. Überlege Dir den Aufbau der Anwendung, also:

    a) was soll auf der Seite gezeigt werden, wenn keine Parameter im Spiel sind
    b) welche Benutzeraktionen sind geplant (Planung der Schlüssel- bzw. Aktionparameter)

    (b) endet serverseitig in einer Kontrollstruktur. Dafür setzt Du einfach nur Parameter in die Links vom Backend, z.B. delete=123 oder update=123 usw. und in der serverseitigen Kontrollstruktur werden mit if/elsif/else die Parameter einfach abgefragt. Ja, es ist tatsächlich sehr einfach, setz Dich mit dem BLeistift an den Küchentisch, gehe das mal durch und dann ist das nur noch Tipparbeit.

    Du wirst solche Parameter-Kontrollstrukturen immer wieder brauchen (Tipp: if/else, kein Switch!), auch dann, wenn z.B. Eingabemasken dynamisch erzeigt werden so wie hier in diesem Beispiel

    MfG

  3. Tach!

    Vielleicht mein letzter Versuch, das Teil zum Laufen zu bekommen - wenn es nicht klappt, muss ich mich eben auf eine Eingabemaske für neue Datensätze beschränken und bei Bearbeitung vorhandener Datensätze wie gehabt PHPMyAdmin bemühen - was eine fiese Fummelei ist, da Indexwerte nicht in "Klartext" übersetzt werden.

    Wenn man den phpMyAdmin ordentlich konfiguriert (die PMA-Datenbank wie in der Dokumentation beschrieben anlegt und in der Konfigurationsdatei bekanntgibt) und anschließend bei "Beziehungsstruktur" (oder so ähnlich) die Fremdschlüsselbeziehungen bekanntgibt (sofern man nicht mit InnoDB sondern MyISAM als Tabellenformat arbeitet, InnoDB kann diese selbst verwalten), muss man die Werte nicht mehr nur über Zahlen eingeben.

    die veränderten Datenbank-Daten sollten durchaus per POST abgeschickt werden, gleichzeitig müssen aber auch seiteninterne Daten mit GET übermittelt werden! Wie kann ich gleichzeitig POST und GET verwenden?

    Man kann dem action-Link im form-Element händisch einen Querystring hinzufügen. Diese Werte landen auch bei einem POST in $_GET. Alternativ kann man die Werte auch in Hidden-Input-Feldern übergeben (Dann landen sie neben den anderen in $_POST.)

    Kann ich den submit-Button zusätzlich in einen <a> </a>-Link einschließen?

    Nein. Das ergibt jedenfalls nicht das von dir gewünschte Resultat.

    dedlfix.

  4. Meine Damen und Herren, habe ich Ihre Aufmerksamkeit?

    ...aber: die veränderten Datenbank-Daten sollten durchaus per POST abgeschickt werden, gleichzeitig müssen aber auch seiteninterne Daten mit GET übermittelt werden! Wie kann ich gleichzeitig POST und GET verwenden? Kann ich den submit-Button zusätzlich in einen <a> </a>-Link einschließen?

    Du kannst pro Bearbeiten-Button ein neues Ziel für das Formular definieren:

    <button formaction="?section=2&first=13">Bearbeiten</button>  
    <button formaction="?section=2&first=14">Bearbeiten</button>
    

    Die Parameter section und first landen dann bei PHP im $_GET-Array. Die anderen Formular-Daten im $_POST-Array.

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Meine Damen und Herren, habe ich Ihre Aufmerksamkeit?

      <button formaction="?section=2&first=13">Bearbeiten</button>

      <button formaction="?section=2&first=14">Bearbeiten</button>

        
      Achja und Kontextwechsel beachten:  
      ~~~html
      <button formaction="?section=2&amp;first=13">Bearbeiten</button>  
      <button formaction="?section=2&amp;first=14">Bearbeiten</button>
      
      --
      “All right, then, I'll go to hell.” – Huck Finn
      1. Hi(gh)!

        Achja und Kontextwechsel beachten:

        <button formaction="?section=2&amp;first=13">Bearbeiten</button>

        <button formaction="?section=2&amp;first=14">Bearbeiten</button>

          
        Das würde ja heißen, dass diese Zeile:  
          
        `$formtop = '<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry="'.$entry.'"&amp;edit=yes&amp;delete=no&amp;sort="'.$sort.'>';`{:.language-php}  
          
        die Werte korrekt übergeben würde!  
          
        Wie aber kommt es, dass zwar beim Erstaufruf von "Vorhandene Datensätze bearbeiten"  
          
        ~~~html
            <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&first=0&sort=0&delete=no&edit=no"><span class="b">Vorhandene Datensätze bearbeiten</span></a>  
            </p>  
        
        

        $_GET['sort'] gesetzt wird (standardmäßig mit dem Wert 0, da ja noch nicht auf einen Sortieren-Link geklickt wurde), beim zweiten Aufruf via "Bearbeiten"-Link neben jedem Datensatz in der Tabelle (edit=yes) aber nicht mehr:

             case 2: // section = 2  
        	echo '<h3>Vorhandene Datensätze bearbeiten</h3>';  
        	$first = $_GET['first'];  
        	$sort = $_GET['sort']; // führt zu Fehlermeldung via use_strict.php!  
        	dbcall();  
        	$query = "DESCRIBE hersteller";  
        	$result = mysql_query($query);  
        	dberror();
        

        Und egal, wie weit ich die & in den echo-Strings durch &amp; ersetze, ich werde diese Fehlermeldung nicht los!

        Bis bald im Khyberspace!

        Yadgar

        1. Hakuna matata!

          Das würde ja heißen, dass diese Zeile:

          $formtop = '<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry="'.$entry.'"&amp;edit=yes&amp;delete=no&amp;sort="'.$sort.'>';

          die Werte korrekt übergeben würde!

          Du vermischst die doppelten und einfachen Anführungszeichen auf unnatürliche Weise, das drüfte problematisch sein.

          So müsste es korrekt aussehen:

          $formtop = '<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry='.$entry.'&amp;edit=yes&amp;delete=no&amp;sort='.$sort.'">';

          Wie aber kommt es, dass zwar beim Erstaufruf von "Vorhandene Datensätze bearbeiten"

          <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&first=0&sort=0&delete=no&edit=no"><span class="b">Vorhandene Datensätze bearbeiten</span></a>
              </p>

          
          >   
          > $\_GET['sort'] gesetzt wird (standardmäßig mit dem Wert 0, da ja noch nicht auf einen Sortieren-Link geklickt wurde), beim zweiten Aufruf via "Bearbeiten"-Link neben jedem Datensatz in der Tabelle (edit=yes) aber nicht mehr:  
            
          Wie baust du denn den "Bearbeiten"-Link zusammen? Das wäre interessant zu wissen.  
            
          
          > Und egal, wie weit ich die & in den echo-Strings durch &amp; ersetze, ich werde diese Fehlermeldung nicht los!  
            
          Die Browser sind bei dieser Art von Fehlern auch sehr tolerant, trotzdem sollte man sich darum bemühen es sauber zu machen.  
          
          -- 
          “All right, then, I'll go to hell.” – Huck Finn
          
          1. Hi(gh)!

            So müsste es korrekt aussehen:

            $formtop = '<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry='.$entry.'&amp;edit=yes&amp;delete=no&amp;sort='.$sort.'">';

            Aha, ich habe verstanden: bei Bedarf immer eine Ebene tiefer schachteln und nicht versuchen, zur höheren Ebene zurückzukehren! Dann verschwindet übrigens auch die von mir weiter unten beklagte Fehlermeldung!

            Wie baust du denn den "Bearbeiten"-Link zusammen? Das wäre interessant zu wissen.

            Das hat sich jetzt wahrscheinlich erledigt (s. o.) - dafür bekomme ich an anderer Stelle gleich die nächste Fehlermeldung ins Gesicht geknallt: wenn ich "Datensätze hinzufügen" auswählen, gibt es eine Fehlermeldung... nein, es treten ganze Bündel von Problemen auf, mit denen ich einfach nur überfordert bin! ICH BIN ZU DUMM FÜR PHP! Jetzt bleibt der Bildschirm ganz weiß... ich gebe es auf! Das ist alles mindestens eine Nummer zu groß für mich! Ich sollte mich damit zufrieden geben, meine Hartz IV- bzw. GruSi-Knete zu verfuttern und mich dabei mit DVDs belallern zu lassen, um irgendwann sozialverträglich frühabzuleben...

            Oder ich finde mich halt damit ab, dass ich nur neue Datensätze eingeben kann und zum weiteren Bearbeiten eben wie gehabt mit PHPMyAdmin rumrödeln muss...

            Oder verabschiede mich aus dieser ganzen sinnlos komplizierten Computerwelt und fahre doch noch mit dem Fahrrad nach Afghanistan, wie ich es mir seit nunmehr 31 Jahren erträume!

            Bis bald im Khyberspace!

            Yadgar

            1. Hallo

              $formtop = '<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry='.$entry.'&amp;edit=yes&amp;delete=no&amp;sort='.$sort.'">';

              Aha, ich habe verstanden: bei Bedarf immer eine Ebene tiefer schachteln und nicht versuchen, zur höheren Ebene zurückzukehren! Dann verschwindet übrigens auch die von mir weiter unten beklagte Fehlermeldung!

              Nein. Baue den Quelltext entsprechend den Regeln des Zielsystems (hier HTML) zusammen. Hilfreich ist mMn sowas von außen nach innen aufzubauen. Um beim Beispiel zu bleiben …

              … das ist das Ziel …

              <form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry=24&amp;edit=yes&amp;delete=no&amp;sort=asc">

              … so (z.B.) sieht es als Zeichenkette in PHP aus. …

              $formtop = '[code lang=html]<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry=24&amp;edit=yes&amp;delete=no&amp;sort=asc">';[/code]

              Wir [1] wollen die Werte der URL-Parameter entry und sort ändern. Zur Umfassung der Zeichenkette nutzen wir das Zeichen „'“. Also nutzen wir es auch an den entsprechenden Stellen.

              $formtop = '[code lang=html]<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry='. $entry .'&amp;edit=yes&amp;delete=no&amp;sort='. $sort .'">';[/code]

              Die Leerzeichen vor und nach den Variablennamen kannst du weglassen. Ich ermögliche damit meinem Editor Umbrüche in der Ausgabe und Highlightning, das an diesen Stellen sonst nicht funktionieren würde.

              Das hat sich jetzt wahrscheinlich erledigt (s. o.) - dafür bekomme ich an anderer Stelle gleich die nächste Fehlermeldung ins Gesicht geknallt: wenn ich "Datensätze hinzufügen" auswählen, gibt es eine Fehlermeldung... nein, es treten ganze Bündel von Problemen auf, …

              Dann löse sie, Schritt für Schritt. Dazu sind sie da.

              … mit denen ich einfach nur überfordert bin! ICH BIN ZU DUMM FÜR PHP! Jetzt bleibt der Bildschirm ganz weiß... ich gebe es auf! Das ist alles mindestens eine Nummer zu groß für mich! Ich sollte mich damit zufrieden geben, meine Hartz IV- bzw. GruSi-Knete zu verfuttern und mich dabei mit DVDs belallern zu lassen, um irgendwann sozialverträglich frühabzuleben...

              Ja, nicht jeder ist für alles geschaffen und ja, nicht immer klappt alles auf Anhieb. Ja, manchmal braucht man Geduld und manchmal mehr, als man hat und ja, es gibt Dinge, von denen man sich schlussendlich abwendet ohne sie erledigt zu haben. Aber dein ewiges Gejammer ist echt nicht mehr lustig.

              Oder ich finde mich halt damit ab, dass ich nur neue Datensätze eingeben kann und zum weiteren Bearbeiten eben wie gehabt mit PHPMyAdmin rumrödeln muss...

              Lies das Bündel an Meldungen, ziehe deine Schlüsse (natürlich auch gern mit Unterstützung) und löse das Problem.

              [1] Für dieses „wir“ habe ich letztens den Begriff „Pflegewir“ gehört. Schön böse! }:-))

              Tschö, Auge

              --
              Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
              Terry Pratchett, "Wachen! Wachen!"
              ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
              Veranstaltungsdatenbank Vdb 0.3
        2. Hallo

          Das würde ja heißen, dass diese Zeile:

          $formtop = '<form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry="'.$entry.'"&amp;edit=yes&amp;delete=no&amp;sort="'.$sort.'>';

          die Werte korrekt übergeben würde!

          Nöö, warum sollte sie auch? Die sieht, und das hättest du auch mit einem Blick in den Quelltext der Seite sehen können, folgendermaßen aus (so du denn hier den originalen Quelltext zeigst).

          <form method="POST" action="hersteller.php?section=2&amp;first=0&amp;entry="27"&amp;edit=yes&amp;delete=no&amp;sort="20>

          Das Action-Attribut selbst sieht also so action="hersteller.php?section=2&amp;first=0&amp;entry=" aus. Dass „sort“ erst recht nicht mehr zum Action-Attribut gehört und zudem auch als Inhalt eines anderen Attributs mit dieser Klammerung keinen Wert bekäme hat die gleiche Ursache.

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
          Veranstaltungsdatenbank Vdb 0.3
    2. Tach!

      Du kannst pro Bearbeiten-Button ein neues Ziel für das Formular definieren:

      <button formaction="?section=2&amp;first=13">Bearbeiten</button>

      <button formaction="?section=2&amp;first=14">Bearbeiten</button>

        
      Interessant, was es nicht alles neues gibt. Aber: [Browser-Kompatibilität](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Browser_compatibility).  
        
        
      dedlfix.
      
      1. Meine Damen und Herren, habe ich Ihre Aufmerksamkeit?

        Interessant, was es nicht alles neues gibt. Aber: Browser-Kompatibilität.

        Wem die Evergreen-Browser nicht reichen, der kann das Verhalten mit einem Polyfill in alten Browsern nachrüsten.

        --
        “All right, then, I'll go to hell.” – Huck Finn
  5. Moin,

    section bezeichnet die beiden Hauptsektionen der Eingabeseiten (1 steht dabei für "Datensätze hinzufügen" und 2 eben für "Vorhandene Datensätze bearbeiten"). first bezeichnet die fortlaufende Nummer des Datensatzes in der ursprünglichen Eingabe-Reihenfolge (ohne ORDER BY-Operationen), ab der die jeweils nächsten 20 Datensätze auf der Seite angezeigt werden sollen. Diese Nummer ist NICHT identisch mit der von MySQL vergebenen Nummer im Feld ID; so hat der erste Datensatz in der Tabelle "hersteller" zur Zeit den ID-Wert 3 (die vorangegangenen Datensätze mit 0, 1 und 2 wurden gelöscht), in der PHP-Zählung für die Ausgabe haben die Datensätze aber natürlich weiterhin die Werte 0 bis 19.

    Die Zuordnung der ID zwischen PHP und MySQL funktioniert?

    Wenn ich jetzt neben dem ersten Datensatz in der Tabelle (ID = 3) auf "Bearbeiten" klicke, wird erneut die Tabelle wie bisher angezeigt, darunter dann die Eingabemaske (der Einfachheit halber in eine Funktion namens input() ausgelagert) mit den Werten des Datensatzes (ohne ID, da von MySQL automatisch vergeben) als vorgegebenen Inhalten. Interessanterweise werden diese Werte, soweit es sich um VARCHAR-Daten handelt nur bis zum ersten Whitespace übernommen, aber um diesen Fehler will ich mich später kümmern.

    Brauchst du zum Bearbeiten (SQL-Befehl UPDATE) nicht die ID (wäre jedenfalls sinnvoll)? Und die Whitespace im HTML-Code könnten daher stammen, dass du den Attribut-Wert von value im input-Element ohne Anführungszeichen versiehst.

    Viele Grüße,
    Robert

    1. Hi(gh)!

      Brauchst du zum Bearbeiten (SQL-Befehl UPDATE) nicht die ID (wäre jedenfalls sinnvoll)? Und die Whitespace im HTML-Code könnten daher stammen, dass du den Attribut-Wert von value im input-Element ohne Anführungszeichen versiehst.

      Zum Bearbeiten ja; beim bloßen Anzeigen als 20er-Block auf der HTML-Seite wäre die ID-Nummer eher hinderlich, da wird dann einfach von 0 bis 19 (bzw. von 20 bis 39, 40 bis 59 und so weiter) durchgezählt.

      Whitespace: gute Idee, werde ich nachher einmal ausprobieren!

      Bis bald im Khyberspace!

      Yadgar

      1. Moin,

        Zum Bearbeiten ja; beim bloßen Anzeigen als 20er-Block auf der HTML-Seite wäre die ID-Nummer eher hinderlich, da wird dann einfach von 0 bis 19 (bzw. von 20 bis 39, 40 bis 59 und so weiter) durchgezählt.

        Du benutzt aber schon die LIMIT-Klausel im SELECT, oder?

        Viele Grüße,
        Robert

        1. Du benutzt aber schon die LIMIT-Klausel im SELECT, oder?

          Ja, mach ich:

          $query = "SELECT * FROM hersteller ".$query_sort." LIMIT ".$first.", 20";

          Bis bald im Khyberspace!

          Yadgar

    2. Hi(gh)!

      Brauchst du zum Bearbeiten (SQL-Befehl UPDATE) nicht die ID (wäre jedenfalls sinnvoll)? Und die Whitespace im HTML-Code könnten daher stammen, dass du den Attribut-Wert von value im input-Element ohne Anführungszeichen versiehst.

      Ja, das war es! Danke für den Tipp!

      Bis bald im Khyberspace!

      Yadgar

      Now playing: Autobahn (Kraftwerk)