Checkbox soll bestimmten wert in datenbank übertragen, wenn ein bestimmter dropdownwert gewählt wurde

Braman

Mitglied
In der Datenbank sind die beiden aufeinander verwiesen (foreign key in der PSP Tabelle).
ja, irgendwie so in der art habe ich es mir auch gedacht, leider stehe ich grad echt auf dem Schlauch :confused:
Die Checkbox müsste ja nur erkennen welche Kostenstelle übertragen wird und welches PSP-Element daraufhin übertragen werden soll:unsure:
 

Sempervivum

Erfahrenes Mitglied
Ich bin weiterhin der Meinung, dass es möglich sein dürfte, dass das auf dem Server nach dem Abschicken des Formulars möglich sein sollte. Etwa so (Pseudocode):
Code:
// Kostenstellen-Nr. steht in KNr zur Verfügung.
// Checkbox hat den Namen psp-ele
$kstnr = $_POST['KNr'];
if (isset($_POST['psp-ele']) {
    // Checkbox ist gecheckt, wir muessen das PSP-Element ermitteln
    // Query muesste ungefähr so aussehen:
    // SELECT pspele from pspelemns where kstnr=$kstnr
}
 

Braman

Mitglied
Ich habe das schema jetzt bei mir eingefügt:

PHP:
<div>

<input type="checkbox" name="psp-ele" id="Investnr" ><label for="Element">PSP Element</label>

</div>
<?php
    if (isset($_POST['psp-ele'])){

        $checkbox=mysqli_query($connection,"SELECT investpsp.InvestPSPID from investpsp JOIN kostenstelle on investpsp.kstnrr = kostenstelle.kstnr where kstnr=$kstnr'");

                                }

?>

(InvestPSPID ist hierbei die ID des PSP_Elements). Mit dieser Abfrage bekomme ich das PSP_Element (also die ID) von der jeweiligen kostenstelle. Das müsste doch heißen das jetzt irgendwie gesagt werden muss, dass der Select noch in die benötigte Tabelle eingefügt werden müsste? :unsure:

Ich schick mal die nötigen Tabellen hier rein damit du mal ein überblick hast ^^ :

Die PSP_Element Tabelle:

PSP_Element Tabelle.png


Die Kostenstellen Tabelle:

Kostenstellen tabelle.png


Und die Tabelle in der beide werte eingefügt werden sollen:

Tabelle wo alles rein soll.png


Ich habe bis jetzt die Kostenstelle als auch das PSP_Element mit der Dropdownauswahl in die Datenbank übertragen, daher passen die IDs '5' und '1' nicht zusammen (sind in der Tabelle ja unabhängig von einander)
 

Sempervivum

Erfahrenes Mitglied
Das müsste doch heißen das jetzt irgendwie gesagt werden muss, dass der Select noch in die benötigte Tabelle eingefügt werden müsste?
Ja, aber das sollte dann nur noch Routine sein, etwa so:
Code:
INSERT INTO kundenprojekt (kstnr, InvestPSPID) VALUES ($kstnr, $psp_element)
wobei ich davon ausgehe, dass die kundenprojekt_id autoincement ist und nicht angegeben werden muss und dass Du das PSP-Element in $psp_element wie beschrieben ermittelt hast.
 

Braman

Mitglied
ich hab jetzt mal bisschen rumprobiert mit deinen vorschlägen und denk ich bin auf der richtigen Spur, nur die umsetzung muss noch passen ^^
Also, ersteinmal muss ja der Wert der Kostenstelle emittelt werden, in meiner SQL abfrage ging das, jetzt muss ich dies in PHP auch hinbekommen.

Das ist die Dropdown liste für die kostenstellen:
PHP:
                                      <div class="form-group">
                                            <label for="formGroupExampleInput2">Kostenstelle</label>

                                    <?php

                                            $sql4 = "SELECT kstnr, kostenstelle FROM kostenstelle";
                                            $result4 = $connection->query($sql4);

                                            if ($result4->num_rows > 0) {

                                            echo "<select name='kstnr'>";
                                            // output data of each row
                                            while($row = $result4->fetch_assoc()) {
                                            echo "<option value='" . $row['kstnr'] . "'>" . $row['kostenstelle'] . "</option>";
                                            }
                                            echo "</select>";
                                            }

                                     ?>
                                    </div>

Nun müsste ich einer Variablen den Wert des PSP_Elements (bzw. der InvestPSPID) geben, welche zu der Kostenstelle passt (also die SELECT ausgabe)

das hatte ich mir so in der Art gedacht:

Code:
$checkbox=mysqli_real_escape_string($connection,"SELECT investpsp.InvestPSPID from investpsp JOIN kostenstelle on investpsp.kstnrr = kostenstelle.kstnr where kstnr=*kstnr*");

Wie ich das jetzt verstanden habe, mache ich dies, in dem ich den <select name='kstnr'> mit der kstnr von der Datenbank gleichsetze (also da wo *kstnr* ist). Diese definition scheint aber auch falsch geschrieben worden zu sein, da ich ja noch die InvestPSPID damit verbinden muss, da weis ich aber leider nicht wie :confused:

Nun müsste ich diesen Wert theoretisch nur noch übertragen mit:

PHP:
<?php
if (isset($_POST['psp-ele'])){


    $query  = " INSERT INTO kunde_projekt (InvestPSPID)";
    $query .= " VALUES ('$checkbox');";


}

?>

Ich habe mit dieser Methode zwei querys, einmal mit allen werten außer der InvestPSPID:
PHP:
$query  = " INSERT INTO kunde_projekt (kundenname_projekt, kstnr, info_uebergabe, standort)";
$query .= " VALUES ('$kundenname_projekt','$kstnr', '$info_uebergabe', '$standort');";

Und einmal wie beim "if (isset)", jedoch nur mit der InvestPSPID. Die InvestPSPID ist nicht auf NOT NULL gesetzt, damit da natürlich auch etwas übertragen wird, wenn ich die Checkbox nicht auswähle.

Meinst du so könnte es in der Art klappen? und wenn ja, weis du was ich ändern müsste damit es funktioniert? ^^
 

Sempervivum

Erfahrenes Mitglied
Ich habe da zwei Einwände:

1. Ich bin der Meinung, dass für die Ermittlung des PSP-Elementes kein join erforderlich ist, sondern ein einfaches select mit der Kostenstelle in der where-Klausel ausreicht.
2. Wenn Du zwei insert-Statements verwendest, wirst Du auch zwei Datensätze bekommen. Aber Du willst ja das PSP-Element in den selben Datensatz eintragen.

Ich schlage folgendes Vorgehen vor:
1. Ist die Checkbox gecheckt, das PSP-Element lesen und in einer Variablen speichern. Ist sie nicht gecheckt, null in diese Variable eintragen.
2. Dann mit einem insert-Statement alle Werte einschl. des PSP-Elementes in die Zieltabelle eintragen.

Ich war in der Zwischenzeit nicht untätig und habe mit Mockaroo Testtabellen angelegt und es kodiert. Sieht bei mir so aus:
Code:
if (isset($_POST['submit'])) {
    var_dump($_POST);
    $kstnr = $_POST['Knr'];
    if (isset($_POST['psp-element'])) {
        $sql1 = "SELECT InvestPSPID FROM psp_element WHERE kstnr=$kstnr";
        $result1 = $connection->query($sql1);
        if ($result1->num_rows == 1) {
            $row = $result1->fetch_row();
            $psp_id = $row[0];
        } else {
            $psp_id = 'null';
        }
    } else {
        $psp_id = 'null';
    }
    var_dump($_POST['Knr'], $psp_id);
    $sql2 = "INSERT INTO bestellungen (kstnr, InvestPSPID) VALUES($kstnr, $psp_id)";
    var_dump($sql2);
    $result = $connection->query($sql2);
    var_dump($connection->error);
    var_dump($result);
}
Funktioniert soweit, dass die betr. Werte in die Tabelle eingetragen werden. Wie ich sehe, heißt die Zieltabelle bei dir kunde_projekt. Und dort müssen noch mehr Werte hinein. Versuche mal, meinen Code so umzuändern, ob es dann bei dir funktioniert.
Ich habe mich bei dem Testcode auf die Substanz konzentriert, sicher musst Du noch all die Sicherheitssachen einbauen. Dabei als erstes prepared statements verwenden, das ist dann schon die halbe Miete.
 

Braman

Mitglied
Habs bei mir jetzt übertragen und es funktioniert tatsächlich wenn ich die checkbox auswähle, dass beide Werte übertragen werden:D, jedoch aber auch nur wenn ich ein else entferne, da ich sonst "Parse error: syntax error, unexpected 'else' (T_ELSE)" ausgegeben bekomme :unsure: (und logischerweise wird dann kein null in die Tabelle übertragen, heißt die Werte kommen nur in die Datenbank wenn ich die Checkbox auswähle)
Fehlt mir speziell noch was oder hab ich einfach ein doofen fehler mit reingebaut den ich nicht sehe ? :unsure:
PHP:
<?php
if (isset($_POST['submit'])){

var_dump($_POST);
$kstnr = $_POST['kstnr'];

if (isset($_POST['psp-ele'])){

    $sqlpsp = "SELECT InvestPSPID FROM investpsp WHERE kstnrr=$kstnr";

    $result1 = $connection->query($sqlpsp);
    if ($result1->num_rows == 1){

        $rowpsp = $result1->fetch_row();
        $investpspid = $rowpsp[0];
    
    }    else{

        $investpspid ='null';
    
    }
        
        else{

        $investpspid ='null';

    }
var_dump($_POST['kstnr'], $investpspid);
$sql12 = $query  = " INSERT INTO kunde_projekt (kundenname_projekt, kstnr, info_uebergabe, standort, InvestPSPID)
                     VALUES ('$kundenname_projekt','$kstnr', '$info_uebergabe', '$standort', '$investpspid')";

var_dump($sql12);
$result2 = $connection->query($sql12);
var_dump($connection->error);
var_dump($result2);

}

}

?>

Ps: Freut mich, dass das schon mal klappt, bin dir echt dankbar ^^
 

Sempervivum

Erfahrenes Mitglied
Ich hatte zwei else benötigt, weil ich da noch die Abfrage nach num_rows drin hatte. D. h. nachdem Du das entfernt hast, muss auch das zweite else raus.
 

Sempervivum

Erfahrenes Mitglied
Das war jetzt ein Irrtum von mir: Du hast ja das num_rows drin, d. h. beide else sind richtig. Was überflüssig ist, ist eine schließende Klammer ganz am Schluss.
 

Braman

Mitglied
Habe jetzt die else entfernt, leider klappt es nicht, dass nur die Kostenstelle übertragen wird :(
Habe versucht ein <input type="hidden" name="psp-ele" value="null" über der Checkbox zu platzieren, so dass dieser "Wert" übermittelt wird, wenn die Checkbox nicht ausgewählt wurde, hat aber leider auch nichts funktioniert :confused:

Sieht übrigens so bei mir aus ^^:

PHP:
<?php
if (isset($_POST['submit'])){

var_dump($_POST);
$kstnr = $_POST['kstnr'];

if (isset($_POST['psp-ele'])){

    $sqlpsp = "SELECT InvestPSPID FROM investpsp WHERE kstnrr=$kstnr";

    $result1 = $connection->query($sqlpsp);
    if ($result1->num_rows == 1) {

        $rowpsp = $result1->fetch_row();
        $investpspid = $rowpsp[0];

    }
var_dump($_POST['kstnr'], $investpspid);
$sql12 = $query  = " INSERT INTO kunde_projekt (kundenname_projekt, kstnr, info_uebergabe, standort, InvestPSPID)
                     VALUES ('$kundenname_projekt','$kstnr', '$info_uebergabe', '$standort', '$investpspid')";

var_dump($sql12);
$result2 = $connection->query($sql12);
var_dump($connection->error);
var_dump($result2);

}

}

?>