 |
Eintrag der Formulardaten mit Checkboxen in mehrere Tabellen |
 |
30.06.2010, 17:45
|
#1
|
|
Neuer Benutzer
nataschik ist offline
Registriert seit: 29.06.2010
Beiträge: 7
|
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
<input type="Text" name="VName" value="" size="30" maxlength="">
<font color="#FF0000">*</font>
<br><br>
Name
<input type="Text" name="ZName" value="" size="30" maxlength="">
<font color="#FF0000">*</font>
<input type="checkbox" name="aktiv" value="aktiv"> aktiv
<br><br><br><br>
<input type="checkbox" name="system[]" value="iMedOne">
iMedOne
<input type="checkbox" name="system[]" value="Labor">
Labor
<input type="checkbox" name="system[]" value="Pacs">
Pacs
<input type="checkbox" name="system[]" value="MediColor">
MediColor
<input type="checkbox" name="system[]" value="SAP">
SAP
<input type="checkbox" name="system[]" value="Clinic Planer">
Clinic Planer
<input type="checkbox" name="system[]" value="Internet">
Internet
<input type="checkbox" name="system[]" value="Email">
Email
<input type="checkbox" name="system[]" value="Citrix">
Citrix
<input type="checkbox" name="system[]" value="VPN">
VPN
<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.
Geändert von nataschik (01.07.2010 um 16:15 Uhr)
|
|
|
|
01.07.2010, 09:01
|
#2
|
|
Stammgast
Falk Prüfer ist offline
Registriert seit: 26.02.2003
Ort: Sachsen-Anhalt
Beiträge: 3.701
|
Hallo,
Zitat:
Zitat von nataschik
...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!
|
|
|
|
07.07.2010, 10:12
|
#3
|
|
Zaungast
CLL ist offline
Registriert seit: 11.06.2010
Beiträge: 22
|
Was gibt dir denn deine Testausgabe
echo "String: <br>$system <br>"; // Testausgabe
aus?
|
|
|
|
 |
|
 |
07.07.2010, 12:42
|
#4
|
|
Stammgast
Falk Prüfer ist offline
Registriert seit: 26.02.2003
Ort: Sachsen-Anhalt
Beiträge: 3.701
|
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!
|
|
|
|
 |
|
 |
09.07.2010, 10:01
|
#5
|
|
Neuer Benutzer
nataschik ist offline
Registriert seit: 29.06.2010
Beiträge: 7
|
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
|
|
|
|
 |
|
 |
09.07.2010, 13:24
|
#6
|
|
Stammgast
Falk Prüfer ist offline
Registriert seit: 26.02.2003
Ort: Sachsen-Anhalt
Beiträge: 3.701
|
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!
|
|
|
|
 |
|
 |
09.07.2010, 13:58
|
#7
|
|
Stammgast
Falk Prüfer ist offline
Registriert seit: 26.02.2003
Ort: Sachsen-Anhalt
Beiträge: 3.701
|
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!
|
|
|
|
12.07.2010, 15:35
|
#8
|
|
Neuer Benutzer
nataschik ist offline
Registriert seit: 29.06.2010
Beiträge: 7
|
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
|
|
|
|
 |
|
 |
26.07.2010, 11:42
|
#9
|
|
Stammgast
Falk Prüfer ist offline
Registriert seit: 26.02.2003
Ort: Sachsen-Anhalt
Beiträge: 3.701
|
Hallo Natalie,
die Antwort kommt etwas später, aber irgendwann macht der Mensch halt Urlaub - und das ganz ohne Internet ...
Zitat:
Zitat von nataschik
...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
Zitat:
Zitat von nataschik
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();
}
Zitat:
Zitat von nataschik
...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!
|
|
|
|
| Themen-Optionen |
|
|
| Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:56 Uhr.
|