Announcement

Collapse
No announcement yet.

Eintrag der Formulardaten mit Checkboxen in mehrere Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eintrag der Formulardaten mit Checkboxen in mehrere Tabellen

    Liebe Enwickler,
    ich habe folgende Situation und bräuchte dringend Hilfe:
    meine Aufgabe ist eine Datenbank mit entspechenden Frontend zu erstellen, wo die Mitarbeiter mit Status aktiv oder inaktiv mit entsprechenden Zugängen (z.B. Windows, Email, Internet usw.) eingepflegt werden.
    Ich habe das folgendermaßen überlegt:
    tblma mit Spalten id, VName, ZName, aktiv (boolean) und
    tblsystem mit Spalten id, SysName die über eine Referenztabelle tblref mit Spalten id, MAID, SysID miteinander verknüpft sind.
    __________________________________________________
    ma.html
    HTML Code:
    <form action="insertref.php" method="post" target="">
    <input type="hidden" name="sent" value="yes">
    <h2>Mitarbeiter</h2>
    Vorname
    &nbsp;
    <input type="Text" name="VName" value="" size="30" maxlength=""> &nbsp;
    <font color="#FF0000">*</font>
    <br><br>
    Name
    &nbsp;
    <input type="Text" name="ZName" value="" size="30" maxlength=""> &nbsp;
    <font color="#FF0000">*</font>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="aktiv" value="aktiv">&nbsp;aktiv
    <br><br><br><br>
    <input type="checkbox" name="system[]" value="iMedOne">
    &nbsp;&nbsp;&nbsp;iMedOne&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="Labor">
    &nbsp;&nbsp;&nbsp;Labor&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="Pacs">
    &nbsp;&nbsp;&nbsp;Pacs&nbsp;&nbsp;&nbsp; &nbsp;
    <input type="checkbox" name="system[]" value="MediColor">
    &nbsp;&nbsp;&nbsp;MediColor&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="SAP">
    &nbsp;&nbsp;&nbsp;SAP&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="Clinic Planer">
    &nbsp;&nbsp;&nbsp;Clinic Planer&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="Internet">
    &nbsp;&nbsp;&nbsp;Internet&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="Email">
    &nbsp;&nbsp;&nbsp;Email&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="Citrix">
    &nbsp;&nbsp;&nbsp;Citrix&nbsp;&nbsp;&nbsp;
    <input type="checkbox" name="system[]" value="VPN">
    &nbsp;&nbsp;&nbsp;VPN&nbsp;&nbsp;&nbsp;
    <br><br><br>
    <input type="Submit" name="" value="Speichern"> <br><br><br>
    </form>
    insertref.php
    PHP Code:
    <?php
      
    include("DBConnect.inc.php");
      
    $VName mysql_real_escape_string($_POST['VName']);
      
    $ZName mysql_real_escape_string($_POST['ZName']);
      
    $aktiv mysql_real_escape_string($_POST['aktiv']);
      
    $system mysql_real_escape_string($_GET['system']); //Inhalt der Checkboxen
      
    $aktion "select VName, ZName from tblma where (VName='$VName' && ZName='$ZName')";
      
    $ergebnis mysql_query($aktion) or die(mysql_error());
      
    $number mysql_num_rows($ergebnis);

    //Felder nach Vollständigkeit prüfen
         
    if ( $VName == "" || $ZName == "")
         {
            echo 
    "$VName$ZName Bitte überprüfen Sie Ihre Eingaben!";
            echo 
    "<a href=javascript:history.back()><br><br>zurück</a>";
            exit;
         }
    //Verhinderung einer Doppelerfassung
         
    elseif ($number != 0)
         {
            echo 
    "Dieser Mitarbeiter existiert bereits!<br>";
            echo 
    "<a href=javascript:history.back()>zurück</a>";
            exit;
         }
    //Prüfung, ob Checkbox false ist
         
    elseif (!isset($_POST['aktiv']))
         {
            
    $aktiv=0;
            
    $query[] = "insert into tblma set VName='$VName',ZName='$ZName',aktiv='$aktiv'";    //Query 1
            
    $id1 mysql_insert_id();                                                           //Insert ID 1
            
    echo "Mitarbeiter $VName$ZName wurde angelegt und ist nicht aktiv";
            echo 
    "<a href=javascript:history.back()><br><br>zurück<br><br></a>";

            for (
    $i=0;$i<count($system);$i++)
            {
               if (isset(
    $_POST['system']))
               {
                   
    $query[]="select id from tblsystem where id='$system'";
                   
    $id2=mysql_insert_id();
                   
    $query[] = "insert into tblref set MAID='$id1',SysID='$id2'";
                   
    $system implode(", ",$_POST['system']);
                   echo 
    "String: <br>$system <br>"// Testausgabe
               
    }
            }

            for(
    $i=0;$i<count($query);$i++)
            {
               
    mysql_query($query[$i]);
               echo 
    "Query Nr: $i, ";

            }
               echo 
    "<br>erste id: $id1 <br>";
               echo 
    "zweite id: $id2 <br>";
         }
         else
         {
    //Prüfung, ob Checkbox true ist
            
    $aktiv=1;
            
    $query[] = "insert into tblma set VName='$VName',ZName='$ZName',aktiv='$aktiv'";
            
    $id1 mysql_insert_id();
            echo 
    "Mitarbeiter $VName$ZName wurde angelegt und ist aktiv";
            echo 
    "<a href=javascript:history.back()><br><br>zurück<br><br></a>";

            for (
    $i=0;$i<count($system);$i++)
            {
               if (isset(
    $_POST['system']))
               {
                   
    $query[]="select id from tblsystem where id='$system'";
                   
    $id2=mysql_insert_id();
                   
    $query[] = "insert into tblref set MAID='$id1',SysID='$id2'";
                   
    $system implode(", ",$_POST['system']);
                   echo 
    "String: <br>$system <br>"// Testausgabe
               
    }
            }

            for(
    $i=0;$i<count($query);$i++)
            {
               
    mysql_query($query[$i]);
               echo 
    "Query Nr: $i, ";
            }
               echo 
    "<br>erste id: $id1 <br>";
               echo 
    "zweite id: $id2 <br>";
         }
      
    mysql_close($Conn);
    ?>
    ___________________________________

    Nun ist es so, dass ich in die tblma einen Datensatz ordnungsgemäß eingetragen bekomme. In die tblref zwar auch, aber erstens wird es hier nur einmal eingetragen egal wieviele checkboxen man angeklickt hatte (es soll aber für je angeklickte checkbox (Windows, Email, Internet) ein Datensatz geschrieben werden), zweitens sieht der Datensatz so aus:
    id: 1 MAID: 0 SysID: 0
    id: 2 MAID: 0 SysID: 0

    Ich komme momentan leider nicht darauf, wie ich die zuletzt eingetragene id richtig auslesen kann (query1, query2), damit ich sie dann in die tblref eintragen kann. Dann fehlt mir meiner Ansicht nach die Zuordnung der Checkboxen mit den Datensätzen von tblsystem.

    Kann mir bitte jemand helfen? Ich bin nur Anfängerin. Es wäre schön, wenn ihr einfach meinen Code ergänzen könnt. Danke.
    Zuletzt editiert von nataschik; 01.07.2010, 16:15.

  • #2
    Hallo,
    Originally posted by nataschik View Post
    ...Es wäre schön, wenn ihr einfach meinen Code ergänzen könnt. Danke.
    Dann solltest du ihn zuvor formatieren - wer soll sich das in dieser Form ansehen!? Also bitte Beitrag editieren und die Buttons für HTML-[<>] und PHP-Code [php] oder die entsprechenden BB-Codes [html][/html] und [php][/php] verwenden. Und Einrückungen nicht vergessen!

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Was gibt dir denn deine Testausgabe
      echo "String: <br>$system <br>"; // Testausgabe
      aus?

      Comment


      • #4
        Hallo nataschik,

        dein Code enthält viele Fehler und Ungereimtheiten (mal abgesehen davon, dass das HTML gruselig ist) ...

        Die Verwendung von mysql_real_escape_string zur Maskierung von Eingaben ist löblich aber kein Allheilmittel. Wie der Name schon sagt, maskiert diese Funktion Strings, jedoch keine Arrays! Und wegen der Auszeichnung im HTML dürfte $_POST['system'] ein Array sein. Zudem versuchst du $_GET auszulesen, obwohl das Formular mit POST abgeschickt wird.
        PHP Code:
        $system mysql_real_escape_string($_GET['system']); 
        Wird also IMMER einen LEEREN String in $system liefern. Die Verwendung von $_POST bringt hier auch nichts, da du dann ein Array an mysql_real_escape_string übergibst, was wiederum nur mit Strings umgehen kann. mysql_real_escape_string macht auch nur Sinn, wenn der Wert anschließend in einer SQL-Abfrage verwendet werden soll.

        Weiter unten im Script startest du eine Schleife (hier gehst du offensichtlich davon aus das $system ein Array ist):
        PHP Code:
        for ($i=0;$i<count($system);$i++) 
        In $system steht aber in JEDEM Fall immer ein leerer String. Und count() funcktioniert nur mit Array oder Objekten. Auf einen String angewendet liefert es IMMER 1, egal ob der String Zeichen enthält oder nicht! Deine Schleife wird also IMMER genau einmal durchlaufen.

        In der darauffolgende Query:
        PHP Code:
        $query[]="select id from tblsystem where id='$system'"
        verwendest du $system wieder als String (ist zwar auch einer, zwei Zeilen vorher war es für dich jedoch noch ein Array).

        Offensichtlich bist du dir selbst nicht ganz im Klaren darüber was du da tust. Hier solltest du erstmal Ordnung reinbringen und ein wenig die Grundlagen zu Datentypen in PHP studieren.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo CLL,
          hier ist die Ausgabe, die mir eigentlich nur zur Kontrolle dienen soll:

          "Mitarbeiter test, tester wurde angelegt und ist nicht aktiv

          zurück

          String:
          iMedOne, Labor, Pacs, MediColor, SAP
          Query Nr: 0, Query Nr: 1, Query Nr: 2,
          erste id: 0
          zweite id: 0"

          Hallo Falk,

          erst mal vielen Dank für deine Kritik und Tips. HTML ist natürlich gruselig, aber das hier ist keine entgültige Version und mir geht es hier in erster Linie um die Funktion. Das mit dem post, get und mysql_real_escape_string habe ich geändert, indem ich alles auf post gesetzt habe und mysql_real_escape_string bei den Variablen der Checkboxen entfernt habe. Ja du hast Recht, ich bin mir da nicht ganz im klaren, was ich da mache, sonst würde ich auch nicht um Hilfe bitten. Leider ist meine Projektzeit sehr sehr knapp und deswegen kann ich nicht so lange php studieren. I habe nur hier und da was aufgeschnappt und versucht es umzusetzten. Das es mir an Wissen mangelt steht außer Frage. Darum bitte ich hier nochmal um eure Hilfe.

          1. Du schreibst, dass das $system hier als String behandelt wird. Wie soll ich der Schleife sagen, das es ein Array ist?

          PHP Code:
                  for ($i=0;$i<count($system);$i++)
                  {
                     if (isset(
          $_POST['system']))
                     {
                         
          $query[]="select id from tblsystem where id='$system'";
                         
          $id2=mysql_insert_id();
                         
          $query[] = "insert into tblref set MAID='$id1',SysID='$id2'";
                         
          $system implode(", ",$_POST['system']);
                         echo 
          "String: <br>$system <br>"// Testausgabe
                     
          }
                  } 
          2. Diese Query halte für absolut unsinnig, aber ich weiß es nicht besser.

          PHP Code:
                        $query[]="select id from tblsystem where id='$system'";
                        
          $id2=mysql_insert_id(); 
          Ich wollte eigentlich die id aus der Tabelle tblsystem auslesen, falls eine entsprechende Checkbox angeklickt wurde. Dann sollte diese id für die Eintragung in die Referenztabelle tblref zwischengespeichert werden. Ich habe aber meiner Meinung nach bis jetzt noch keinen Bezug zwischen den Checkboxen zu den Datensätzen der tblsystem hergestellt. Wie könnte ich das realisieren?

          Viele Grüße
          Natalie

          Comment


          • #6
            Hallo Natalie,

            diese Zeile:
            PHP Code:
             $system mysql_real_escape_string($_GET['system']); //Inhalt der Checkboxen 
            macht $system zum String! Warum, habe ich ja schon geschrieben.
            Die solltest du ersetzen durch:
            PHP Code:
            $system = isset($_POST['system']) ? $_POST['system'] : array(); 
            Wenn also in $_POST['system'] nichts übergeben wird - keine Checkbos angeklickt wurde, wird ein leeres Array erstellt.

            Jetzt wird auch deine Schleife durchlaufen:
            PHP Code:
            for ($i=0;$i<count($system);$i++) 
            da $system jetzt ein Array ist.

            Was du hiermit:
            PHP Code:
            $query[]="select id from tblsystem where id='$system'";
            $id2=mysql_insert_id();
            $query[] = "insert into tblref set MAID='$id1',SysID='$id2'"
            bezwegst ist mir nicht ganz klar. Das ist so wie es da steht völlig sinnfrei! Aus deiner Beschreibung kann ich mir nur was zusammenreimen.
            Wahrscheinlich möchtest du aus tblsystem eine ID passend zu einem Wert aus $system (also einer Checbox - sowas wie 'Labor', 'SAP' oder 'Email') auslesen und dafür jeweils einen Eintrag in tblref für den bereits angelegten Mitarbeiter ($id1) anlegen. Habe ich das richtig verstanden?

            Wenn dem so ist, dann ist der strukturelle Aufbau deines Scriptes falsch, da du momentan alle Abfragen erstellst und erst zum Schluß in einer Schleife ausführst. Da deine Abfragen aber z.T. auf die Ergebnisse der jeweils vorhergehenden Abfrage angewiesen sind, funktioniert das so nicht.
            Ich würde dir deshalb empfehlen auf die Ausführungsschleife am Schluß zu verzichten und stattdessen die Abfragen jeweils direkt auszuführen, um dann die Ergebnisse zur Verfügung zu haben.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Natalie,

              ist zwar sonst nicht meine Art komplette Scripte zu überarbeiten, aber da waren so viele Fehler drin, dass wir hier noch Monate hätten diskutieren können .

              Meine Änderungen sind ungetestet - ich garantiere also nicht für Fehlerfreiheit. Auch erfolgt alles unter der Option das es um Funktionalität geht und keine endgültige Version ist die Live geht. Bitte übernimm es auch nicht ungesehen, sondern vergleich was ich geändert habe und versuche es zu verstehen. Z.B. habe ich deinen Doppelten Code wg. Aktiv/Nicht Aktiv komplett entfernt.

              Wenn du Fragen zu meinen Änderungen hast, dann stelle sie und freu dich nicht nur wenn es einfach funktionieren sollte .

              PHP Code:
              <?php
                
              include("DBConnect.inc.php");
                
              $VName mysql_real_escape_string($_POST['VName']);
                
              $ZName mysql_real_escape_string($_POST['ZName']);
                
              $aktiv mysql_real_escape_string($_POST['aktiv']);

                
              $system = isset($_POST['system']) && is_array($_POST['system']) ? $_POST['system'] : array(); //Inhalt der Checkboxen

                
              $aktion   "select VName, ZName from tblma where (VName='$VName' && ZName='$ZName')";
                
              $ergebnis mysql_query($aktion) or die(mysql_error());
                
              $number   mysql_num_rows($ergebnis);

              //Felder nach Vollständigkeit prüfen
                
              if ( $VName == "" || $ZName == "")
                {
                   echo 
              "$VName$ZName Bitte überprüfen Sie Ihre Eingaben!";
                   echo 
              "<a href=javascript:history.back()><br><br>zurück</a>";
                   exit;
                }
              //Verhinderung einer Doppelerfassung
                
              elseif ($number != 0)
                {
                   echo 
              "Dieser Mitarbeiter existiert bereits!<br>";
                   echo 
              "<a href=javascript:history.back()>zurück</a>";
                   exit;
                }
              //Prüfung, ob Checkbox false ist

                
              $aktiv = isset($_POST['aktiv']) && $_POST['aktiv'] ? '1' '0';
                
              $sql =
                  
              "insert into tblma (VName, ZName, aktiv) values
                   ('
              $VName', '$ZName', '$aktiv')";
                
              mysql_query($sql);    //Query 1
                
              $id1 mysql_insert_id();                                                           //Insert ID 1

                
              echo 'Mitarbeiter '.htmlentities($VName).', '.htmlentities($ZName).' wurde angelegt und ist '.(!$aktiv 'nicht ' '').'aktiv';
                echo 
              "<a href=javascript:history.back()><br><br>zurück<br><br></a>";

                
              // Das Array $system wird durchlaufen und jeder Wert in $sysName zwischengespeichert
                
              foreach ($system as $sysName) {
                   
              // Für das Einfügen wird ein INSERT INTO ... SELECT Konstrukt verwendet, um die zusätzlich Abfrage der Daten zu vermeiden
                   
              $sql =
                     
              "insert into tblref (MAID, SysID)
                        select '
              $id1', id
                        from tblsystem
                        where SysName ='"
              .mysql_real_escape_string($sysName)."'";
                   
              mysql_query($sql);
                   
              $id2 mysql_insert_id();

                   echo 
              'Checkbox '.htmlentities($sysName).' wurde tblref mit id '.$id2.' gespeichert<br />';
                }

                
              mysql_close($Conn);
              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk,

                wow, es hat auf Anhieb funktioniert. Bist du eingentlich ein Profi oder machst du es just for fun? Jedenfalls einen riesen Dank dafür. Das Prinzip deiner Version habe ich verstanden. Du verwendest öffters mal diese Schreibweise:
                PHP Code:
                $system = isset($_POST['system']) && is_array($_POST['system']) ? $_POST['system'] : array(); 
                Könntest du mir bitte diese Syntax/Parameter näher erklären?

                Jetzt muss ich bei ca. 650 Mitarbeiter auch mal nach ihnen suchen können und gegebenenfalls updaten. Da habe ich leider auch meine Schwierigkeiten. Sollte ich daraus ein neues Thema machen oder kann ich das weiterhin hier posten?

                Gruß
                Natalie

                Comment


                • #9
                  Hallo Natalie,

                  die Antwort kommt etwas später, aber irgendwann macht der Mensch halt Urlaub - und das ganz ohne Internet ...
                  Originally posted by nataschik View Post
                  ...wow, es hat auf Anhieb funktioniert. Bist du eingentlich ein Profi oder machst du es just for fun?
                  Freut mich das es funktioniert und du die Änderungen verstanden hast. Ansonsten habe ich wohl "just for fun" mit dem Job kombiniert

                  Originally posted by nataschik View Post
                  Du verwendest öffters mal diese Schreibweise:
                  PHP Code:
                  $system = isset($_POST['system']) && is_array($_POST['system']) ? $_POST['system'] : array(); 
                  Könntest du mir bitte diese Syntax/Parameter näher erklären?
                  Ein Konstrukt der Form <ausdruck> ? <anweisung1> : <anweisung2> ist ein einfaches if-else-Konstrukt, welches im Gegensatz zum if-else auch in Zuweisungen eingesetzt werden kann. Dabei ist <ausdruck> ein beliebiger Ausdruck der einen Booleschen Wert annehmen kann, <anweisung1> ist eine einzelne Anweisung, die einen beliebigen Wert zurückliefert und im Wahr-Fall verwendet wird, während <anweisung2> analog im Falsch-Fall Verwendung findet.

                  Die obige Zuweisung ist also die verkürzte Schreibweise von:
                  PHP Code:
                  if (isset($_POST['system']) && is_array($_POST['system'])) {
                    
                  $system $_POST['system'];
                  }
                  else {
                    
                  $system = array();

                  Originally posted by nataschik View Post
                  ...Jetzt muss ich bei ca. 650 Mitarbeiter auch mal nach ihnen suchen können und gegebenenfalls updaten. Da habe ich leider auch meine Schwierigkeiten. Sollte ich daraus ein neues Thema machen oder kann ich das weiterhin hier posten?
                  Nein, mach bitte ein neues Thema daraus und verweise ggfs. mit einem Link auf diesen Thread.

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment

                  Working...
                  X