Einträge speichern
Meowsalot
- mysqli
- php
Hallo,
ich stehe gerade total auf dem Schlauch. Folgende Formular habe ich
<?php foreach($ProjektleiterModule as $array){ ?>
<div><?php echo htmlspecialchars($array['mpv_vorname'] . " " . $array['mpv_name']) ?></div>
<?php
$date = date_create($mg_von);
for($i=0; $i < $tage; $i++) {
if ($i == 0) {
date_add($date, date_interval_create_from_date_string('0 day'));
} else {
date_add($date, date_interval_create_from_date_string('1 day'));
}
?>
<div class="textfeld">
<label for="ms2f_datum[<?php echo $i+1 ?>]">Datum</label>
<input type="text"
name="ms2f_datum[<?php echo $i+1 ?>]"
id="ms2f_datum[<?php echo $i+1 ?>]"
value="<?php echo $i+1 ?>. Tag - <?php echo date_format($date, 'd.m.Y'); ?>"
readonly>
<input type="hidden"
name="ms2f_tag[<?php echo $i+1 ?>]"
id="ms2f_tag[<?php echo $i+1 ?>]"
value="<?php echo $i+1; ?>">
<input type="hidden"
name="ms2f_pid[<?php echo $i+1 ?>]"
id="ms2f_pid[<?php echo $i+1 ?>]"
value="<?php echo $array['mpv_code']; ?>">
</div>
<div class="textfeld abstand_2">
<label for="ms2f_von[<?php echo $i+1 ?>]">Einsatzzeit</label>
<input type="text"
name="ms2f_von[<?php echo $i+1 ?>]"
id="ms2f_von[<?php echo $i+1 ?>]"
value=""> bis
<input type="text"
name="ms2f_bis[<?php echo $i+1 ?>]"
id="ms2f_bis[<?php echo $i+1 ?>]"
value=""> Uhr
</div>
<?php } } ?>
Mein dazugehöriger PHP Code
$ms2f_pid = array();
$ms2f_tag = array();
$ms2f_datum = array();
$ms2f_von = array();
$ms2f_bis = array();
for($i = 0; $i <= $tage; $i++){
$ms2f_mid = $veranstaltung;
$ms2f_pid = $_POST['ms2f_pid'];
$ms2f_tag = $_POST['ms2f_tag'];
$ms2f_datum = "";
$ms2f_von = $_POST['ms2f_von'];
$ms2f_bis = $_POST['ms2f_bis'];
if ($stmt = $mysqli->prepare("INSERT INTO feedbackbogen_einsatzzeiten (ms2f_mid, ms2f_pid, ms2f_tag, ms2f_datum, ms2f_von, ms2f_bis)
VALUES (?, ?, ?, ?, ?, ?)")) {
$ms2f_mid = $ms2f_mid;
$ms2f_pid = $ms2f_pid[$i];
$ms2f_tag = $ms2f_tag[$i];
$ms2f_datum = $ms2f_datum[$i];
$ms2f_von = $ms2f_von[$i];
$ms2f_bis = $ms2f_bis[$i];
$stmt->bind_param("ssssss", $ms2f_mid, $ms2f_pid, $ms2f_tag, $ms2f_datum, $ms2f_von, $ms2f_bis);
$stmt->execute();
} else {
echo $mysqli -> error;
}
}
Mein Problem ist, wenn ich die Einträge speichere, habe ich immer nur die letzten drei, die ersten werden entweder nicht beachtet oder überschrieben.
Hier noch ein Screen von meiner MySQL Datenbank wie die Werte ankommen, hier könnt ihr genau sehen der erste User wird nicht beachtet. Die 89523208f3f6d1e0adfed53f28d868eb gehört dem Test-User 2
Was mache ich falsch?
Bis bald!
Meowsalot (Bernd)
Hallo Meowsalot,
deine Schleifen laufen in Abhängigkeit von $tage
. Wo wird $tage
definiert?
MfG, at
Hallo at,
hier
$startDate = new DateTime($mg_von);
$endDate = new DateTime($mg_bis);
$diff = $startDate->diff($endDate);
$tage = $diff->days+1;
Bis bald! Meowsalot (Bernd)
Moin,
sorge dafür, daß all Deine inputfelder innerhalb eines <form> liegen und eindeutige Namen haben, Dann werden die auch alle übertragen.
MfG
Hallo pl,
meine Inputfelder liegen innerhalb von einem <form> und haben doch eindeutige Namen, wie du in meinem ersten Posting sehen kannst.
Bis bald!
Meowsalot (Bernd)
hi,
meine Inputfelder liegen innerhalb von einem <form> und haben doch eindeutige Namen, wie du in meinem ersten Posting sehen kannst.
Nein. Erstens gibt es da gar kein <form>-Element und zweitens ist überhaupt nicht zu sehen, ob die Namen eindeutig sind.
MfG
Hallo pl,
Nein. Erstens gibt es da gar kein <form>-Element
das stimmt, weil ich nur den relevanten Code genommen habe. Ein <form>-Element ist natürlich da.
und zweitens ist überhaupt nicht zu sehen, ob die Namen eindeutig sind.
Nein?
<input type="hidden"
name="ms2f_tag[<?php echo $i+1 ?>]"
id="ms2f_tag[<?php echo $i+1 ?>]"
value="<?php echo $i+1; ?>">
<input type="hidden"
name="ms2f_pid[<?php echo $i+1 ?>]"
id="ms2f_pid[<?php echo $i+1 ?>]"
value="<?php echo $array['mpv_code']; ?>">
Kann aber auch sein, wir reden aneinander vorbei.
Bis bald!
Meowsalot (Bernd)
hi,
Kann aber auch sein, wir reden aneinander vorbei.
Ne ganz bestimmt nicht. Was ist denn an $i eindeutig? Ich sehe das nicht und wenn Du Deinen Fehler mit fremder Hilfe finden willst, ist eine solche Diskussion hier völlig unangebracht!
Tipp: Bringe mehr Struktur in Deine Inputfelder.
MfG
Hallo pl,
Kann aber auch sein, wir reden aneinander vorbei.
Ne ganz bestimmt nicht. Was ist denn an $i eindeutig? Ich sehe das nicht und wenn Du Deinen Fehler mit fremder Hilfe finden willst, ist eine solche Diskussion hier völlig unangebracht!
Es muss schon erlaubt sein nachzufragen, wenn man eine Antwort nicht versteht.
Bis demnächst
Matthias
hi Bernd,
Tipp: Bringe mehr Struktur in Deine Inputfelder.
Du hast zwar nicht noch einmal nachgefragt wie ich das meine, aber ich erklärs Dir trotzdem. Erfasst werden sollen für mehrere Personen jeweils 3 Tage wobei es für jeden Tag eine von und eine bis Uhrzeit gibt.
Damit ergibt sich eine ganz bestimmte Struktur für Dein Datenmodell, was Du mal aufmalen solltest. Mit der Annahme, daß jede Person anhand einer ID eindeutig ist, könnte die Struktur so aussehen:
zeiten = {
1: [{date,von,bis},{date,von,bis},{date,von,bis}],
2: [{date,von,bis},{date,von,bis},{date,von,bis}]
};
Wobei 1, 2 die ID zur Person ist. Für die Date-Objekte habe ich hier nur die Schlüssel notiert, im Detail könnte das so aussehen:
{date: '2018-01-01', von: '01:01', bis: '02:01'}
Und jetzt kommts: Ein solches Modell ist erweiterbar! D.h., es können Personen hinzukommen und zur Person können Zeiten hinzukommen.
Wenn die Daten modelliert sind, ist dann auch klar wie sie erfasst und verarbeitet werden. Du bekommst sozusagen einen einheitlichen Prozess.
Ich schreib Dir das hier, weil ich selbst einmal eine Zeiterfassung programmiert habe, dafür hatte ich einen Tag Zeit, stand also enorm unter Zeitdruck. Meine diesbezügliche Erfahrung gebe ich hiermit also gerne weiter.
Es steht Dir natürlich frei, das zu ignorieren.
MfG
Hallo pl,
Es steht Dir natürlich frei, das zu ignorieren.
Mit dem Hintern einreißen, was man mühevoll mit den Händen aufbaut.
Bis demnächst
Matthias
Tach!
Mein Problem ist, wenn ich die Einträge speichere, habe ich immer nur die letzten drei, die ersten werden entweder nicht beachtet oder überschrieben. [...] Was mache ich falsch?
Du debuggst vermutlich nicht (richtig). Zum einen solltest du in den Entwicklertools des Browsers nachschauen, wie der Request aussieht, vor allem der Request-Body. Auf der Serverseite solltest du dir eine Kontrollausgabe von $_POST erstellen, mit var_dump() oder auch mit print_r(). An diesen beiden Dingen solltest du erkennen, dass der Client zwar alles mitschickt, PHP aber nur einen Datensatz erkennen mag. Und wenn du genauer hinschaust, kannst du sehen, dass du keine Unterscheidung zwischen den Nutzern hast. Die Eingabefeldnamen unterscheiden sich nur bezüglich des Datums. Bei gleichen Feldnamen gewinnt das letztere den Platz in $_POST/$_GET.
Erzeuge eindeutige Feldnamen, zum Beispiel indem du schachtelst und mehrere []-Klammernpaare angibst, à la data[userid][fieldname][day]
. Damit bekommst du auch eindeutig auswertbare und vollständige Daten in $_POST.
dedlfix.
Hallo dedlfix,
Erzeuge eindeutige Feldnamen, zum Beispiel indem du schachtelst und mehrere []-Klammernpaare angibst, à la
data[userid][fieldname][day]
. Damit bekommst du auch eindeutig auswertbare und vollständige Daten in $_POST.
du meinst so?
<?php foreach($ProjektleiterModule as $array){ ?>
<div><?php echo htmlspecialchars($array['mpv_vorname'] . " " . $array['mpv_name']) ?></div>
<?php
$date = date_create($mg_von);
for($i=0; $i < $tage; $i++) {
if ($i == 0) {
date_add($date, date_interval_create_from_date_string('0 day'));
} else {
date_add($date, date_interval_create_from_date_string('1 day'));
}
?>
<div class="textfeld">
<label for="ms2f_datum[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]">Datum</label>
<input type="text"
name="ms2f_datum[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_datum[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value="<?php echo $i+1 ?>. Tag - <?php echo date_format($date, 'd.m.Y'); ?>"
readonly>
<input type="hidden"
name="ms2f_tag[<?php echo $i+1 ?>]"
id="ms2f_tag[<?php echo $i+1 ?>]"
value="<?php echo $i+1; ?>">
<input type="hidden"
name="ms2f_pid[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_pid[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value="<?php echo $array['mpv_code']; ?>">
</div>
<div class="textfeld abstand_2">
<label for="ms2f_von[<?php echo $i+1 ?>]">Einsatzzeit</label>
<input type="text"
name="ms2f_von[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_von[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value=""> bis
<input type="text"
name="ms2f_bis[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_bis[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value=""> Uhr
</div>
<?php } } ?>
Wenn ja, dann frage ich mich, wie frage ich hier die ersten [] ab?
$ms2f_pid = array();
$ms2f_tag = array();
$ms2f_datum = array();
$ms2f_von = array();
$ms2f_bis = array();
for($i = 0; $i <= $tage; $i++){
$ms2f_mid = $veranstaltung;
$ms2f_pid = $_POST['ms2f_pid'];
$ms2f_tag = $_POST['ms2f_tag'];
$ms2f_datum = "";
$ms2f_von = $_POST['ms2f_von'];
$ms2f_bis = $_POST['ms2f_bis'];
if ($stmt = $mysqli->prepare("INSERT INTO feedbackbogen_einsatzzeiten (ms2f_mid, ms2f_pid, ms2f_tag, ms2f_datum, ms2f_von, ms2f_bis)
VALUES (?, ?, ?, ?, ?, ?)")) {
$ms2f_mid = $ms2f_mid;
$ms2f_pid = $ms2f_pid[$i];
$ms2f_tag = $ms2f_tag[$i];
$ms2f_datum = $ms2f_datum[$i];
$ms2f_von = $ms2f_von[$i];
$ms2f_bis = $ms2f_bis[$i];
$stmt->bind_param("ssssss", $ms2f_mid, $ms2f_pid, $ms2f_tag, $ms2f_datum, $ms2f_von, $ms2f_bis);
$stmt->execute();
} else {
echo $mysqli -> error;
}
}
Bis bald!
Meowsalot (Bernd)
Hallo,
ich glaube, ich habe es:
for($i = 0; $i <= $tage; $i++){
foreach ($_POST['ms2f_pid'] as $nr => $inhalt) {
$ms2f_mid = $veranstaltung;
$ms2f_pid = $_POST['ms2f_pid'];
$ms2f_tag = $_POST['ms2f_tag'];
$ms2f_datum = "";
$ms2f_von = $_POST['ms2f_von'];
$ms2f_bis = $_POST['ms2f_bis'];
if ($stmt = $mysqli->prepare("INSERT INTO feedbackbogen_einsatzzeiten (ms2f_mid, ms2f_pid, ms2f_tag, ms2f_datum, ms2f_von, ms2f_bis)
VALUES (?, ?, ?, ?, ?, ?)"))
{
$ms2f_mid = $ms2f_mid;
$ms2f_pid = $ms2f_pid[$nr][$i];
$ms2f_tag = $ms2f_tag[$nr][$i];
$ms2f_datum = $ms2f_datum[$nr][$i];
$ms2f_von = $ms2f_von[$nr][$i];
$ms2f_bis = $ms2f_bis[$nr][$i];
$stmt->bind_param("ssssss", $ms2f_mid, $ms2f_pid, $ms2f_tag, $ms2f_datum, $ms2f_von, $ms2f_bis);
$stmt->execute();
} else {
echo $mysqli -> error;
}}
}
Bis bald!
Meowsalot (Bernd)
Hi,
Mein Problem ist, wenn ich die Einträge speichere, habe ich immer nur die letzten drei, die ersten werden entweder nicht beachtet oder überschrieben.
Hast Du wirklich nur ein form? Oder ein Form pro User? (ist aus Deinem Code nicht ersichtlich, da kein <form> zu sehen ist)
cu,
Andreas a/k/a MudGuard
Hallo MudGuard,
ich habe nur ein <form> für das gesamte Dokument.
Bis bald!
Meowsalot (Bernd)
Hi,
ich habe nur ein <form> für das gesamte Dokument.
aber Du hast zwei geschachtelte Schleifen (User und Tage), verwendest für die Namen der input-Elemente aber nur die Tage - damit sind sie natürlich nicht eindeutig.
cu,
Andreas a/k/a MudGuard
Hallo MudGuard,
aber Du hast zwei geschachtelte Schleifen (User und Tage), verwendest für die Namen der input-Elemente aber nur die Tage - damit sind sie natürlich nicht eindeutig.
dieses habe ich jetzt geändert
<div class="textfeld">
<label for="ms2f_datum[<?php echo $i+1 ?>]">Datum</label>
<input type="text"
name="ms2f_datum[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_datum[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value="<?php echo $i+1 ?>. Tag - <?php echo date_format($date, 'd.m.Y'); ?>"
readonly>
<input type="hidden"
name="ms2f_tag[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_tag[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value="<?php echo $i+1; ?>">
<input type="hidden"
name="ms2f_pid[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_pid[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value="<?php echo $array['mpv_code']; ?>">
</div>
<div class="textfeld abstand_2">
<label for="ms2f_von[<?php echo $i+1 ?>]">Einsatzzeit</label>
<input type="text"
name="ms2f_von[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_von[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value=""> bis
<input type="text"
name="ms2f_bis[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
id="ms2f_bis[<?php echo $array['mpv_code']; ?>][<?php echo $i+1 ?>]"
value=""> Uhr
</div>
Dadurch habe ich jetzt doch eindeutige Felder?
Bis bald!
Meowsalot (Bernd)
Hallo Meowsalot,
Dadurch habe ich jetzt doch eindeutige Felder?
Fast. Ein paar IDs hast Du übersehen.
Und dein Code ist anmerkwürdig.
Ach ja. Dein bis-Feld ist unbeschriftet; das "bis" Bröckchen möchte ein label sein. Eventuell passt dein CSS dann nicht mehr ganz, darum habe ich eine Klasse "intervall" hinzugefügt.
<?php
$date = date_create($mg_von);
for($tag=0; $tag <= $tage; $tag++):
$rowId = "[{$array['mpv_code']}][$tag]";
?>
<section class="textfeld">
<h2>
<label for="ms2f_datum<?= $rowId ?>">Datum</label>
<input type="text"
name="ms2f_datum<?= $rowId ?>" id="ms2f_datum<?= $rowId ?>"
value="<?= $tag ?>. Tag - <?= date_format($date, 'd.m.Y'); ?>"
readonly>
</h2>
<label for="ms2f_von<?= $rowId ?>">Einsatzzeit</label>
<input type="text"
name="ms2f_von<?= $rowId ?>" id="ms2f_von<?= $rowId ?>"
value="">
<label class="intervall" for="ms2f_bis<?= $rowId ?>">bis</label>
<input type="text"
name="ms2f_bis<?= $rowId ?>" id="ms2f_bis<?= $rowId ?>"
value=""> Uhr
</section>
<?php
date_add($date, date_interval_create_from_date_string('1 day'));
endfor;
} // Wofür auch immer Du die zweite Klammer brauchtest...
?>
Das finale ?> solltest Du nur schreiben, wenn danach noch HTML kommt. Wenn eine PHP Datei mit PHP-Code endet, lässt man das ?> weg.
Rolf
Hallo Rolf,
Das finale ?> solltest Du nur schreiben, wenn danach noch HTML kommt. Wenn eine PHP Datei mit PHP-Code endet, lässt man das ?> weg.
Das verwirrt mich. Und nur um zu sehen, ob ich das richtig verstehe, jede PHP Datei(ohne HTML) sollte den End-Tag weglassen? Warum und wo steht so was?
Gruss
Henry
Tach!
Das finale ?> solltest Du nur schreiben, wenn danach noch HTML kommt. Wenn eine PHP Datei mit PHP-Code endet, lässt man das ?> weg.
Das verwirrt mich. Und nur um zu sehen, ob ich das richtig verstehe, jede PHP Datei(ohne HTML) sollte den End-Tag weglassen? Warum und wo steht so was?
Warum soll man am Dateiende noch auf das Schließen von PHP bestehen? Ende ist Ende. Wenn man das PHP nicht schließt, kann sich dahinter auch nichts mehr schmuggeln, das meistens unsichtbar ist, aber dennoch Ausgabe darstellt. Solcher Whitespace stört, wenn man noch Sessions zu öffnen gedenkt oder andere header-sendende Fuktionen aufrufen möchte.
Und es steht im PHP-Handbuch, erstes Kapitel der Sprachreferenz.
dedlfix.
Hallo dedlfix,
Warum soll man am Dateiende noch auf das Schließen von PHP bestehen? Ende ist Ende. Wenn man das PHP nicht schließt, kann sich dahinter auch nichts mehr schmuggeln, das meistens unsichtbar ist, aber dennoch Ausgabe darstellt. Solcher Whitespace stört, wenn man noch Sessions zu öffnen gedenkt oder andere header-sendende Fuktionen aufrufen möchte.
Und es steht im PHP-Handbuch, erstes Kapitel der Sprachreferenz.
Danke für den Link, noch nie gehört. Aber offen gesagt, empfinde ich das als eine Art schmutziger Hack. Whitespace und resultierende Headerproblematiken sollte man immer im Auge haben, da begrüße ich sogar eine Fehlermeldung, damit ich weiß, was da los ist und daraus lernen kann. Aber gerade die klare Auszeichnung/Struktur öffnen/schließen liebe ich so an PHP. Das man dies anders handhaben sollte… Für mich so ein wenig wie, lass alle Schränke Schubladen zu Hause offen stehen(hat sogar den Vorteil du kommst schneller ran), sieht aber scheiße aus.
Gruss
Henry
Tach!
Aber offen gesagt, empfinde ich das als eine Art schmutziger Hack. Whitespace und resultierende Headerproblematiken sollte man immer im Auge haben, da begrüße ich sogar eine Fehlermeldung, damit ich weiß, was da los ist und daraus lernen kann.
Ja, wenns denn was wichtiges wäre. Aber lediglich Whitespace in einer Datei, in der HTML-Code üblicherweise nicht vorgesehen ist?
Für mich so ein wenig wie, lass alle Schränke Schubladen zu Hause offen stehen(hat sogar den Vorteil du kommst schneller ran), sieht aber scheiße aus.
Warum auch nicht, wenn der Automatismus sie selbständig schließt? Es ist ja nicht so wie in deinem geklammerten Teil, dass sie offen bleiben.
dedlfix.
Hallo dedlfix,
Warum auch nicht, wenn der Automatismus sie selbständig schließt? Es ist ja nicht so wie in deinem geklammerten Teil, dass sie offen bleiben.
Stimmt ja, Punkt für dich. 😉 Mag und bleibe aber trotzdem bei EndTag. (Gefühlte Kontrolle und Symmetrie).
Gruss
Henry
Hallo,
Für mich so ein wenig wie, lass alle Schränke Schubladen zu Hause offen stehen(hat sogar den Vorteil du kommst schneller ran), sieht aber scheiße aus.
Eher so wie bei den modernen Küchenschubladen: kleinen Schubs geben reicht, dass sie ganz sanft automatisch zugehen…
Gruß
Kalk
@@Henry
Aber offen gesagt, empfinde ich das als eine Art schmutziger Hack.
Ich nicht.
Prinzipiell gibt es (bei vernünftiger™ Architektur) zwei Arten von PHP-Dateien: solche, die Programmlogik beinhalten und kein HTML ausgeben, und solche, die HTML ausgeben und ggfs. etwas Ausgabelogik beinhalten.
Erstere beginnen mit <?php
und enden mit}
oder ;
(plus Whitespace).
In letzteren sollte nicht HTML in PHP geschachtelt werden (d.h. nicht Markup mit echo
generiert werden), sondern PHP-Ausgaben der Daten sollten in HTML geschachtelt werden. In diesen gibt es natürlich ?>
.
LLAP 🖖
hi Bernd,
laß das $i doch einfach weg. Mit feldname[] legt PHP da selbst einen Index rein. Von 0 beginnend.
MfG
Hallo pl,
da hast Du natürlich recht.
Rolf