Gerd: dynamisches update Anfänger braucht Hilfe

Hallo,

ich bin sicher meine Frage wurde schon zig mal gestellt, aber all das was ich online fand half mir nicht weiter.
Der Stand:
ich lese DS aus einer Tabelle die mit einem Formular bearbeitet werden sollen und zwar immer DS die die gleiche Katalognummer haben, weiter eine Positionsnummer, Anzahl bestellt, Preis bestellt, Anzahl geliefert, Preis geliefert.
Das ganze in einer do /while Schleife.
kn | ps |anz_best|preis_best|anz_gel|preis_gel|bemerkung
----------------------------------------------------------------
100 | 1 | 10     |    100   |    10 |     100 |             |Submit
100 | 2 | 20     |    200   |    20 |     200 |             |Submit
100 | 3 | 10     |     10   |    10 |      10 |             |Submit

Das eigentliche Formular hat nur  2 Textfelder: anz_gel und bemerkung und hinter jeden Datensatz einen Submitschalter.

Ich kann also die Anzahl geliefert ändern und eien Bemerkung eingeben. Wenn ich dann auf Subnit Klicke wird ein Update durchgeführt:
 SET bemerkung ='$bemerk_pos',
 preis_l ='$epreis'*'$menge_l',
 menge_l ='$menge_l',
 preis_r ='$new_preis_r'
 WHERE kn ='$kn' AND pn='$pn'";

Das klappt.
Das Problem: ich muss jedes mal Submit klicken wen ich eine Anzahl geliefert geändert oder eine Bemerkung eingegeben habe.
Will ich im ersten DS aus anz_gel 10 eine 2 machen muss ich es mit Submit bestätigen Das update durchgeführt und der DS siet dann so aus:
kn | ps |anz_best|preis_best|anz_gel|preis_gel|bemerkung
----------------------------------------------------------------
100 | 1 | 10     |    100   |    2  |     20  |             |Submit
100 | 2 | 20     |    200   |    20 |     200 |             |Submit
100 | 3 | 10     |     10   |    10 |      10 |             |Submit

Das müsste ich jetzt DS für DS machen, kann man das nicht mit einem  Array durchführen?
das ich nur einmal Submit klicken muss?
Das Form sieht in etwa so aus:
<input name="pn" type="hidden" value="<?php echo $pn; ?>">
<input name="menge_l" type="text" class="tfeld"  value="<?php echo $row_qpos['menge_l']; ?>" size="4">
 <input name="epreis" type="hidden" class="input"  value="<?php echo $row_qpos['epreis']; ?>" size="5">
<textarea name="bemerk_pos" cols="30" rows="1" class="tarea"><?php echo $row_qpos['bemerkung']; ?></textarea></td>
<input name="submit_pos" type="submit" class="submit" style="width: 65px; height: 20px;" value="OK Pos. <?php echo $row_qpos['pn']; ?>">

Danke Gerd

  1. Hi,

    was ist Deine Frage?

    Ob man es mit einem Array machen kann? Meiner Meinung nach ja.

    Oder wie man es mit einem Array machen kann? Da solltest Du Dich dann in die PHP Foren vertiefen und dann eine konkrete Frage stellen.

    Schöner Grüße
    Stefan

  2. hi,

    Das müsste ich jetzt DS für DS machen, kann man das nicht mit einem  Array durchführen?

    Klar kann man.

    Hänge eckige Klammern an die Feldnamen, analog zu http://www.php-faq.de/q/q-formular-select-multiple.html - dann bekommst du die Werte in einem Array unterhalb von $_POST zur Verfügung gestellt.

    Nur eckige Klammern wären allerdings etwas ungünstig - dann kann es mit der Zuordnung Probleme geben.
    Wenn du in den Klammern allerdings auch noch einen Index angibst, dann wird dieser als Index des jeweiligen Wertes im erzeugten Array benutzt. Sinnvollerweise benutzt du dafür die ID des Datensatzes.

    name="menge_l[4711]"
    name="epreis[4711]"

    Damit kannst du diese beiden Werte eindeutig dem Datensatz mir der ID 4711 zuordnen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo wahsaga

      ich habe mich noch etws schlauer gemacht und das ganze versucht umzusetzen, logisch geht nicht... ich bin wohl doch nen Dau.

      Das UPDATE sieht jetzt so aus:

      $anzahl = $totalRows_qpos;
      if (isset($_REQUEST['submit_pos'])) {
      for ($i=0; $i< $anzahl; $i++) {
      mysql_select_db($database_md, $md);

      $query_qupdatepos = "(UPDATE posten
       SET bemerkung ='$bemerk_pos',
       preis_l ='$epreis'*'$menge_l',
       menge_l ='$menge_l',
       preis_r ='$new_preis_r'
       WHERE kn ='$kn' AND pn='".$_POST['pn'.$i]."') ";

      } // end foreach
      }// End Submit

      Das Formular so:

      <?php  $i = 0 ;   do {    $i++ ;   ?>

      <input name="pn<? echo $i ?>" type="hidden" value="<?php echo $pn; ?>">
      <input name="menge_l" type="text" class="tfeld"  value="<?php echo $row_qpos['menge_l']; ?>" size="4">
       <input name="epreis" type="hidden" class="input"  value="<?php echo $row_qpos['epreis']; ?>" size="5">
      <textarea name="bemerk_pos" cols="30" rows="1" class="tarea"><?php echo $row_qpos['bemerkung']; ?></textarea></td>
      <input name="submit_pos" type="submit" class="submit" style="width: 65px; height: 20px;" value="OK Pos. <?php echo $row_qpos['pn']; ?>">

      <?php } while ($row_qpos = mysql_fetch_assoc($qpos)); ?>

      Ich habe also einen Zähler in das Formfeld pn eingebunden
      Das Update wird nicht ausgeführt.

      Wo liegt den da Fehler.

      Beste Grüße
      Gerd

      1. hi,

        Wo liegt den da Fehler.

        Darin, dass du nicht mal ansatzweise debuggt hast.

        Lasse dir mittels print_r/var_dump zur Kontrolle ausgeben, was dir in $_POST (resp. $_GET) übergeben wird. Entspricht es deiner Erwartung, verstehst du die Struktur?

        Und wenn du mit MySQL arbeitest, dann lasse dir immer den Inhalt deiner dynamisch generierten Queries zur Kontrolle ausgeben, und nutze die Funktion mysql_error.  Mindestens nach jeder Verwendung von mysql_query -

        $ergebnis = mysql_query($sql) or die(mysql_error());

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          ich möchte mich bedanken. Der Tipp mit dem auslesen war hilfreich !

          Ich habe herausbekommen das alle DS geupdatet werden, aber nur mit dem Wert des letzten DS.
          Das bekomme ich angezeigt, wenn ich zwei DS updaten will.
          Die Eingabe war bei Menge im ersten DS = 1 und im zweiten DS=2.

          Ich suche noch ein wenig weiter, aber über tipps bin ich dankbar.

          1Array
          (

          [pn1] => 1
              [menge_l] => 2
              [epreis] => 0.070000
              [bemerk_pos] => b
              [pn2] => 2
              [anz] => 2
              [bestnr] => 10283
              [submit_pos] => OK Pos.
          )
          1Array
          (

          [pn1] => 1
              [menge_l] => 2
              [epreis] => 0.070000
              [bemerk_pos] => b
              [pn2] => 2
              [anz] => 2
              [bestnr] => 10283
              [submit_pos] => OK Pos.
          )
          1Array
          (

          [pn1] => 1
              [menge_l] => 2
              [epreis] => 0.070000
              [bemerk_pos] => b
              [pn2] => 2
              [anz] => 2
              [bestnr] => 10283
              [submit_pos] => OK Pos.

          Vielen Dank Gerd

          1. Ich habe herausbekommen das alle DS geupdatet werden, aber nur mit dem Wert des letzten DS.

            Klingt auch logisch, da du mit einem UPDATE zwar mehrere Datensätze aktualisieren kannst, aber immer nur mit dem gleichen Wert. Also bspw.

            UPDATE tabelle SET feld1='Wert'

            ändert alle 'feld1' aller Datensätze der Tabelle auf 'Wert'. Das, was du willst, geht also so nicht, eventuell helfen dir die Ablaufsteuerungsfunktionen von MySQL weiter. Ich bevorzöge jedoch ein UPDATE je Datensatz.

            Siechfred

            --
            Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
            1. Hello,

              Ich habe herausbekommen das alle DS geupdatet werden, aber nur mit dem Wert des letzten DS.

              Klingt auch logisch, da du mit einem UPDATE zwar mehrere Datensätze aktualisieren kannst, aber immer nur mit dem gleichen Wert. Also bspw.

              UPDATE tabelle SET feld1='Wert'

              Wie kommst Du auf die Idee?

              Es gibt if und case

              +------------+---------+-----------+-----------------+-------+-------------------+-------+
              | id_adresse | vorname | name      | strasse         | plz   | ort               | beruf |
              +------------+---------+-----------+-----------------+-------+-------------------+-------+
              |          1 | Thomas  | Schmieder | Mühlenstraße    | 37444 | Sankt Andreasberg | NULL  |
              |          2 | Karl    | Müller    | Baumschule 13   | 88888 | Bayernland        | NULL  |
              |          3 | Robert  | Redfox    | Profil 12       | 38855 | Wernigerode       | NULL  |
              |          4 | Hans    | Wurst     | Industriegebiet | 38100 | Braunschweig      | NULL  |
              +------------+---------+-----------+-----------------+-------+-------------------+-------+

              update adresse
              set beruf= case
              when id_adresse = 1 then 'Bäcker'
              when id_adresse = 3 then 'Lehrer'
              end
              where id_adresse in (1,3);

              Query OK, 2 rows affected (0.00 sec)
              Rows matched: 2  Changed: 2  Warnings: 0

              mysql> select * from adresse;
              +------------+---------+-----------+-----------------+-------+-------------------+--------+
              | id_adresse | vorname | name      | strasse         | plz   | ort               | beruf  |
              +------------+---------+-----------+-----------------+-------+-------------------+--------+
              |          1 | Thomas  | Schmieder | Mühlenstraße    | 37444 | Sankt Andreasberg | Bäcker |
              |          2 | Karl    | Müller    | Baumschule 13   | 88888 | Bayernland        | NULL   |
              |          3 | Robert  | Redfox    | Profil 12       | 38855 | Wernigerode       | Lehrer |
              |          4 | Hans    | Wurst     | Industriegebiet | 38100 | Braunschweig      | NULL   |
              +------------+---------+-----------+-----------------+-------+-------------------+--------+

              Harzliche Grüße vom Berg
              http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

              1. Wie kommst Du auf die Idee?
                Es gibt if und case

                [ ] Du hast mein Posting vollständig gelesen?
                [ ] Du bist dem geposteten Link gefolgt?

                Siechfred

                --
                Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                1. Hello lieber Siechfred,

                  [ ] Du hast mein Posting vollständig gelesen?
                  [ ] Du bist dem geposteten Link gefolgt?

                  Das habe ich in meinem Eifer glatt überlesen.
                  Aber so hat Gerd gleich noch ein Beispiel ;-)

                  Ich stimme Dir aber zu: ich würde auch immer nur einen Datensatz in ein Update einbeziehen.
                  Sonst weiß man nicht, bei welchem etwas schiefgegangen ist.
                  Die Fehlerhaften kann man dann mit Fehlermeldung nochmal vorlegen.
                  In einer Multiuser-Umgebung, die Web-Applikationen schließlich meistens darstellen, sind zwishcenzeitliche Änderungen durch andere User an der Tagesordnung. Man hätte keine Kontrolle mehr über zwischenzeitliche Veränderungen.

                  siehe https://forum.selfhtml.org/?t=150792&m=980431

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

                  1. Ich stimme Dir aber zu: ich würde auch immer nur einen Datensatz in ein Update einbeziehen.
                    Sonst weiß man nicht, bei welchem etwas schiefgegangen ist.

                    Ergänzend weise ich noch auf die Möglichkeit von Prepared Statements hin:
                    http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
                    http://dev.mysql.com/doc/refman/5.1/de/c-api-prepared-statements.html

                    Natürlich nur, wenn es auch sinnvoll ist :)

                    Siechfred

                    --
                    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                    1. Guten Morgen,

                      nachdem ich gestern noch in einigen Büchern und Foren gestöbert habe, denke ich´, dass ich es habe.

                      Mein Ansatz war falsch.

                      Jetzt
                      $anz = $_POST['anz'];
                      $bemerk_pos = $_POST['bemerk_pos'];
                      ...
                      ....
                      if (isset($_REQUEST['submit_pos'])) {
                      for ($i=0; $i< $an; $i++) {
                      mysql_select_db($database_md, $md);

                      $query_qupdatepos = "(UPDATE posten
                       SET bemerkung ='$bemerk_pos[$i]',
                           preis_l ='$epreis[$i]'*'$menge_l[$i]',
                           menge_l ='$menge_l[$i]',
                           preis_r ='$new_preis_r[$i]'
                       WHERE kn ='$kn' AND pn='".$_POST['pn'][$i]."') ";
                       $qupdatepos = mysql_query(........
                            } // end foreach
                      }// End Submit

                      Und das Formular
                      do {
                      <input name="pn[]" type="hidden" value="<?php echo $posnr; ?>" size="2">
                      <input name="menge_l[]" type="text" value="<?php echo $row_qpos['menge_l']; ?>" size="4">
                      ....

                      } while ($row_qpos = mysql_fetch_assoc($qpos));

                      Ich denke ich habe jetzt alles richtig gemacht.
                      Es werden alls DS richtig erneuert.

                      Vielen Dank für Eure Tipps und Hilfe

                      Gerd

          2. hi,

            Ich habe herausbekommen das alle DS geupdatet werden, aber nur mit dem Wert des letzten DS.

            Die Klammer-Schreibweise für den Namen hast du in deinem Beispiel nur für das erste Feld eines Datensatzes benutzt - aber für menge_l, epreis, ... nicht.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Hello,

    ein Beispiel, wie Du ausgelesene Daten in einer Liste verändern kannst, findest Du unter

    http://selfhtml.bitworks.de --> Strukturierung von PHP-Webseiten

    Grundsätzlich möchte ich noch anmerken, dass es sinnvoll ist,

    1.
    in jedem Datensatz einen Update-Counter mitzuführen. Der wird beim Holen der Daten aus der Tabelle in die Session mit gespeichert und beim Update der Daten verglichen, ob er sich _nicht_ geändert hat und dann einfach um eins raufgezählt. Manchmal wird auch ein Timestamp dafür benutzt, der automatisch geführt wird. Das ist einerseits sicherer, weil man nicht daran denken muss, ihn zu führen. Abfragen und vergleichen muss man ihn trotzdem. Andereseits ist die Granularität des Timestamps zu grob. Bei automatisch abgearbeiteten Vorgängen kann es vorkommen, dass dann doch zwei Updates innerhalb eines Digitsprungs vorkommen. Dann sind die Daten doch inkonsistent.

    2.
    Datensätze aus der Liste nur einzeln ins Update-Statement zu nehmen, also kein Multipudate durchzuführen, damit man für jeden einzelenen Datensatz auch eine qualifizierte Rückmeldung erhält. Bei einem Multi-Update kann man nicht feststellen, bei welchem Datensatz ein Fehler aufgetreten ist, nur wieviele Fehler insgesamt.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hello,

      Datensätze aus der Liste nur einzeln ins Update-Statement zu nehmen, also kein Multipudate durchzuführen, damit man für jeden einzelenen Datensatz auch eine qualifizierte Rückmeldung erhält. Bei einem Multi-Update kann man nicht feststellen, bei welchem Datensatz ein Fehler aufgetreten ist, nur wieviele Fehler insgesamt.

      ... also die Update-Liste in der Session durch eine Schleife abarbeiten lassen.
      Da man di letzten geholten Daten ja noch in der Session stehen hat, braucht man das Update-Statements auch nur für die veränderten Datensätze an die DB schicken.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau