Mit einer Checkbox weitere Werte speichern


CreativPur

Erfahrenes Mitglied
Hi,
ich habe folgendes Problem..
Ich habe eine checkbox, mit der ich weitere Daten in eine Datenbank speichern möchte.

Bildschirmfoto 2019-02-26 um 21.10.47.png
Hiermit möchte ich dem User die Möglichkeit geben, nur bestimmte Zeugnisse zu speichern bzw. mit zu senden.

Ausgelesen werden werden die zuvor hochgeladenen Daten folgend..

PHP:
<form  action="?mail_versenden" method="post">
<?php 
$sql = "SELECT zeugnisse_firma, pos, img FROM Lebenslauf_Zeugnisse WHERE Bewerber_id = $Bewerber_id ORDER BY pos DESC";
foreach($pdo->query($sql) as $row){
echo '
<input type="checkbox" name="Zeugnis_Firma[]" value="'.$row['zeugnisse_firma'].'"> '.$row['zeugnisse_firma'].'<br />
<input class="form-control" type="hidden" name="Bewerbungen_id[]" value="'.$Bewerbung_id.'">
<input class="form-control" type="hidden" name="pos[]" value="'.$row['pos'].'">
<input class="form-control" type="hidden" name="img[]" value="'.$row['img'].'">';
}
?>

<input type="submit" id="submit" name="submit"  class="btn btn-info" value="speichern" />
</form>
in den Hidden-Feldern werden die Daten auch richtig ausgegeben.

Beim Speichern wird aber immer der erste checkbox mit gespeichert, auch wenn diese nicht aktiviert wird.

Mein Insert-Script sieht folgend aus...
PHP:
if(isset($_GET['mail_versenden'])) {
     $error = false;   

     for ($i = 0; $i < count($_POST['Zeugnis_Firma']); $i++) {
          $Bewerbungen_id = $_POST['Bewerbungen_id'][$i];
          $Zeugnis_Firma = $_POST['Zeugnis_Firma'][$i];
          $pos = $_POST['pos'][$i];
          $img = $_POST['img'][$i];
          $statement = $pdo->prepare("INSERT INTO ausgewaehlte_zeugnisse (Bewerbungen_id,Zeugnis_Firma,pos,img) VALUES (:Bewerbungen_id,:Zeugnis_Firma,:pos,:img)");
          $statement->execute(array('Bewerbungen_id' => $Bewerbungen_id, 'Zeugnis_Firma' => $Zeugnis_Firma, 'pos' => $pos, 'img' => $img));
      

}
}
Wo liegt bloß der Fehler ?
 

Kalito

Erfahrenes Mitglied
hallo,

was sagt den ein Var_dump von dem Post. Spontan würde ich sagen, dass du die Checkbox und die Hidden-Fields eindeutiger benennen solltest, da sie sonst immer überschrieben werden.

PHP:
foreach($pdo->query($sql) as $row)
{

$i = 0;

echo '
<input type="checkbox" name="Zeugnis_Firma['.$i.']" value="'.$row['zeugnisse_firma'].'"> '.$row['zeugnisse_firma'].'<br />
<input class="form-control" type="hidden" name="Bewerbungen_id['.$i.']" value="'.$Bewerbung_id.'">
<input class="form-control" type="hidden" name="pos['.$i.']" value="'.$row['pos'].'">
<input class="form-control" type="hidden" name="img['.$i.']" value="'.$row['img'].'">';

$i++;
}
?>

<input type="submit" id="submit" name="submit"  class="btn btn-info" value="speichern" />
</form>
btw.: bei deiner Ausgabe der Zeugnisse ist mir aufgefallen, dass es mehrere gleiche Einträge gibt. An deiner Stelle würde ich den Namen unique machen, damit der Nutzer auch weiß welches Zeugnis sich hinter dem Namen befindet
 

CreativPur

Erfahrenes Mitglied
Manchmal gibt es auch 2 Zeugnisse von der selben Firma. Die Bezeichnung in der Spalte img bekommen sie nur einen anderen Namen.
Wenn die Hidden-Felder als TEXT angezeigt werden, sehen diese folgend aus..

Bildschirmfoto 2019-02-26 um 21.46.56.png

Das erste Inputfeld ist immer mit dem gleichen Wert (Bewerbung_id)
Das zweite Inputfeld ist das Datum, wann das Zeugnis übergeben wurde (pos)
Das dritte Inputfeld ist der Name vom Bild (Zeugnis), wobei am Anfang die User_id steht und am Ende, was man leider nicht sieht, der Zeugnisname, der immer einzigartig ist und nur einmal vorkommt.
 

Sempervivum

Erfahrenes Mitglied
Das Problem ist, dass eine Checkbox nur als $_POST-Variable auftritt, wenn sie gecheckt ist. D. h. wenn Du z. B. vier Checkboxes hast, von denen nur zwei gecheckt sind, so hat $_POST['Zeugnis_Firma'] nur zwei Einträge während die Eingabefelder alle vorhanden sind, d. h. die entspr. Arrays haben vier Einträge. Die Zuordnung zwischen den Elementen im Array der Checkboxes und denen in den Arrays der Eingabefelder stimmt dann nicht mehr. Lösung, indem Du, wie von Kalito vorgeschlagen, die Indizes explizit definierst.
 

CreativPur

Erfahrenes Mitglied
die Indizes explizit definierst ???
Und wie sieht so etwas aus ?

Ich habe es so abgeändert..
PHP:
<?php 
$sql = "SELECT zeugnisse_firma, pos, img FROM Lebenslauf_Zeugnisse WHERE Bewerber_id = $Bewerber_id ORDER BY pos DESC";
foreach($pdo->query($sql) as $row){
$i = 0;   
echo '
<input type="checkbox" name="Zeugnis_Firma['.$i.']" value="'.$row['zeugnisse_firma'].'"> '.$row['zeugnisse_firma'].'<br />
<input class="form-control" type="" name="Bewerbungen_id['.$i.']" value="'.$Bewerbung_id.'">
<input class="form-control" type="" name="pos['.$i.']" value="'.$row['pos'].'">
<input class="form-control" type="" name="img['.$i.']" value="'.$row['img'].'">';
}
?>
wenn ich da jetzt z.B. beide "Fa. E.Heckeroth" aktiviere, dann wird nur der erste gespeichert
 

CreativPur

Erfahrenes Mitglied
Das ist ganz einfach.
Der User kann sich mit mehreren Berufen bewerben.
Z.B. Als Maurer und Webdesigner

Wenn ich mich aber nur als Webdesigner bewerbe, benötige ich nur die Zeugnisse, wo ich als Webdesigner tätig war. Und das wird Endanwender ja wohl wissen, oder ?
 

Kalito

Erfahrenes Mitglied
Schon klar. Es war ja nur ein gut gemeinter Rat, dass 2 Zeugnisse nicht den gleichen Namen besitzen dürfen. Dabei fällt mir auf:

Ich sehe auch gerade in deinem Code, dass du den Firmennamen in den Checkboxen anzeigst. Wenn man aber von einer Firma mehrere Zeugnisse hat, weiß ich nicht mehr, welches Zeugnis sich hinter der Checkbox versteckt. Vielleicht solltest du den Zeugnissnamen ebenfalls mit Ausweisen. Dann kennt der Endnutzer schneller, was er anklicken soll :)

Das dritte Inputfeld ist der Name vom Bild (Zeugnis), wobei am Anfang die User_id steht und am Ende, was man leider nicht sieht, der Zeugnisname, der immer einzigartig ist und nur einmal vorkommt.
Der Name des Zeugnis ist unique? Oder kann ich mehrere "Abschlusszeugnisse" besitzen (von verschiedenen Firmen)? Ich hatte mal einen Kollegen, der in 15 Jahren insgesamt 4mal in einer Firma gearbeitet hat und er hat natürlich auch jedes mal ein Abschlusszeugnis bekommen.

Vielleicht noch einen anderen Tipp. Warum machst du anstatt einer Checkbox nicht eine Tabelle (Hab sowas schon gesehen). In der ersten Spalte kommt die Checkbox, dann die Spalten Zeugnisname, Firma, andere Meta-Daten (erstellt am, Datum des Zeugnis, etc) und Link zum anschauen. Das Ganze könnte man auch Sortier- und Filterbar gestalten.

Bitte sieh das nicht als Kritik von mir an, sondern als gut gemeinte Ratschläge. Der Teufel steckt im Detail und bin selber schon bei solchen Kleinigkeiten auf die Schnautze geflogen. :)
 

Sempervivum

Erfahrenes Mitglied
dennoch verstehe ich nicht genau, wie ich die Indizes explizit definieren soll.
In dem Code in #7 hast Du es schon richtig gemacht. Das Problem ist nur, dass Du auch die Auswertung ein wenig ändern musst, weil, wie ich schon geschrieben habe, in $_POST['Zeugnis_Firma'] nur die Elemente drin stehen, die gecheckt sind. So sollte es funktionieren:

Code:
  for ($i = 0; $i < count($_POST['Bewerbungen_id']); $i++) {
      if (isset($_POST['Zeugnis_Firma'][$i])) {
          $Bewerbungen_id = $_POST['Bewerbungen_id'][$i];
          $Zeugnis_Firma = $_POST['Zeugnis_Firma'][$i];
          $pos = $_POST['pos'][$i];
          $img = $_POST['img'][$i];
          $statement = $pdo->prepare("INSERT INTO ausgewaehlte_zeugnisse (Bewerbungen_id,Zeugnis_Firma,pos,img) VALUES (:Bewerbungen_id,:Zeugnis_Firma,:pos,:img)");
          $statement->execute(array('Bewerbungen_id' => $Bewerbungen_id, 'Zeugnis_Firma' => $Zeugnis_Firma, 'pos' => $pos, 'img' => $img));
  }
Ungetestet, aber ich denke, so sollte es funktionieren.
 
Zuletzt bearbeitet:

CreativPur

Erfahrenes Mitglied
Ich habe es jetzt so...

PHP:
if(isset($_GET['mail_versenden'])) {
     $error = false;  
     for ($i = 0; $i < count($_POST['Bewerbungen_id']); $i++) {
      if (isset($_POST['Zeugnis_Firma'])) {
          $Bewerbungen_id = $_POST['Bewerbungen_id'][$i];
          $Zeugnis_Firma = $_POST['Zeugnis_Firma'][$i];
          $pos = $_POST['pos'][$i];
          $img = $_POST['img'][$i];
          $statement = $pdo->prepare("INSERT INTO ausgewaehlte_zeugnisse (Bewerbungen_id,Zeugnis_Firma,pos,img) VALUES (:Bewerbungen_id,:Zeugnis_Firma,:pos,:img)");
          $statement->execute(array('Bewerbungen_id' => $Bewerbungen_id, 'Zeugnis_Firma' => $Zeugnis_Firma, 'pos' => $pos, 'img' => $img));
      }
   }
}
PHP:
<?php
$sql = "SELECT zeugnisse_firma, pos, img FROM Lebenslauf_Zeugnisse WHERE Bewerber_id = $Bewerber_id ORDER BY pos DESC";
foreach($pdo->query($sql) as $row){
$i = 0;  
echo '
<input type="checkbox"  name="Zeugnis_Firma['.$i.']" value="'.$row['zeugnisse_firma'].'"> '.$row['zeugnisse_firma'].'<br />
<input class="form-control" type="" name="Bewerbungen_id['.$i.']" value="'.$Bewerbung_id.'">
<input class="form-control" type="" name="pos['.$i.']" value="'.$row['pos'].'">
<input class="form-control" type="" name="img['.$i.']" value="'.$row['img'].'">';
$i++;
}
?>
Wenn ich jetzt 2 aktiviere, bekomme ich nur einen gespeichert.
pos und img werden von dem letzten Datensatz übernommen (Fa. Textilhaus Voepel)
 

Sempervivum

Erfahrenes Mitglied
Tut mir Leid, siehe mein Posting #14, da war noch ein Fehler. So sollte es richtig sein:
Code:
if (isset($_POST['Zeugnis_Firma'][$i])) {
 

Sempervivum

Erfahrenes Mitglied
Da sehe ich noch einen Fehler, hier:
Code:
foreach($pdo->query($sql) as $row){
    $i = 0;   
    echo '
    <input type="checkbox"  name="Zeugnis_Firma['.$i.']" value="'.$row['zeugnisse_firma'].'">                  '.$row['zeugnisse_firma'].'<br />
    <input class="form-control" type="" name="Bewerbungen_id['.$i.']" value="'.$Bewerbung_id.'">
    <input class="form-control" type="" name="pos['.$i.']" value="'.$row['pos'].'">
    <input class="form-control" type="" name="img['.$i.']" value="'.$row['img'].'">';
    $i++;
}
Das $i muss vor der Schleife initialisiert werden:
Code:
$i = 0;   
foreach($pdo->query($sql) as $row){
    echo '
    <input type="checkbox"  name="Zeugnis_Firma['.$i.']" value="'.$row['zeugnisse_firma'].'"> '.$row['zeugnisse_firma'].'<br />
    <input class="form-control" type="" name="Bewerbungen_id['.$i.']" value="'.$Bewerbung_id.'">
    <input class="form-control" type="" name="pos['.$i.']" value="'.$row['pos'].'">
    <input class="form-control" type="" name="img['.$i.']" value="'.$row['img'].'">';
    $i++;
}