Übergabe von einem Dropdownfeld in ein Inputfeld

Spiro

Mitglied
Hallo Leute,

ich bin neu hier und ich finde keine Lösung für mein Problem.

Ich möchte eine Kunden/Rechnungsverwaltung selbst erstellen. Das meiste hab ich auch schon und soweit funktioniert auch alles.
Nun möchte ich die Artikel (liegen in einer separaten Tabelle), nach Kategorie und Unterkategorie getrennt, in meine Rechnung bekommen.
Ich hab mal ein Bild gemacht.

Zur Erklärung:
Ganz unten sind die Auswahlfelder für die Artikel. Diese Funktionen klappen auch.
Bitte wählen = Die Kategorie der Artikel wird aus der Datenbank zur Auswahl geholt, man kann wählen
Auswahl = Je nachdem welche Kategorie ausgewählt wurde, werden hier die Unterkategorien angezeigt
Artikel = Hier werden die entsprechenden Artikel angezeigt.

Nun benötige ich eine Funktion, die einen gewählten Artikel in die Zeile (Menge/Art.Nr./Artikel/Einzelpreis) einfügt.

Meine Artikeldatenbank beinhaltet folgende Spalten:
Nummer (automatisch)
Menge
Art.Nr.
Artikel
Kurztitel (wird unten rechts als Artikel angezeigt)
Preis (Einzelpreis)
Kategorie
Unterkategorie

Relevant für die Rechnung sind nur:
Menge (könnte man weglassen)
Art.Nr.
Artikel
Preis (Einzelpreis)

Also noch mal kurz, je nach dem welcher Kurztitel gewählt wird, sollen weiter oben die Felder
Art.Nr.
Artikel
Preis
automatisch gefüllt werden.

Der Bereich von Rechnungsanschrift bis zum Button Update speichern liegt in einem Form-Tag, die Artikelauswahl in eigenen, jeweils ein Form-Tag für Kategorie, Unterkategorie, Kurztitel.

rechnung.png


Die Felder wo es rein soll: (Die Backslashes kommen daher, da der HTML-Code in einem echo drin ist)
PHP:
<form action=\"update.php\" method=\"post\">
<tr>
<td style=\"vertical-align: top;\">
<input id=\"menge\" name=\"menge01\" type =\"\" value=\"$menge01\">
</td>
<td style=\"vertical-align: top;\">
<input id=\"artnr\" name=\"artikelnummer01\" type =\"\" value=\"$artikelnummer01\">
</td>
<td style=\"vertical-align: top;\">
<input id=\"artikel\" name=\"artikel01\" type =\"\" value=\"$artikel01\">
</td>
<td style=\"vertical-align: top;\">
<select name=\"kategorie\" onkeyup=\"this.form.unterkategorie.value = this.value\">
<option value=\"\">bitte wählen</option>
";
include ("config/config.php");
$Connect = mysql_connect($server, $user, $pass);
@mysql_select_db("$dbase");
$result =  mysql_query("SELECT DISTINCT kategorie FROM $tabelle1a");
while($row = mysql_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysql_free_result( $result );
print_r($_POST);
$kategorie=$_POST['kategorie'];   

echo "
</select>
</td>
<td style=\"vertical-align: top;\">
";
echo "$kategorie";
echo "
<select id=\"unterkategorie\" name=\"unterkategorie\">
<option value=\"\">Auswahl</option>
";
/*
include ("config/config.php");
$Connect = mysql_connect($server, $user, $pass);
@mysql_select_db("$dbase");

$result =  mysql_query("SELECT DISTINCT unterkategorie FROM $tabelle1a WHERE kategorie='$kategorie'");
while($row = mysql_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysql_free_result( $result );
print_r($_POST);
$unterkategorie=$_POST['unterkategorie'];   
$kategorie=$_POST['kategorie'];   
*/
echo "
</select>
</td>
<td style=\"vertical-align: top;\">
<input id=\"einzel\" name=\"einzelpreis01\" type =\"\" value=\"$einzelpreis01\">
</td>
<td style=\"vertical-align: top;\">
<input id=\"gesamt\" name=\"gesamtpreis01\" type =\"\" value=\"
";
$gesamtpreis01 = gesamta($menge01, $einzelpreis01);
echo "$gesamtpreis01";
echo "
\">
</td></form>

Die Felder zur Artikelauswahl:
PHP:
<table style="text-align: left; width: 100%;" border="1" cellpadding="0"cellspacing="0">
<tbody><tr><td width="30%">
<form name="artikel" method="post" action="">
<select name="kategorie" onchange="this.form.submit();">
<option value="">bitte wählen</option>
<?php
include ("config/config.php");
$Connect = mysql_connect($server, $user, $pass);
@mysql_select_db("$dbase");
$result =  mysql_query("SELECT DISTINCT kategorie FROM $tabelle1a");
while($row = mysql_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysql_free_result( $result );
print_r($_POST);
$kategorie=$_POST['kategorie'];   
?></select></form>
</td><td width="30%"><form name="artikel2" method="post" action="">
<?php echo $kategorie; ?>
<select name="unterkategorie" onchange="this.form.submit();">
<option value="">Auswahl</option>
<?php
include ("config/config.php");
$Connect = mysql_connect($server, $user, $pass);
@mysql_select_db("$dbase");
$result =  mysql_query("SELECT DISTINCT unterkategorie FROM $tabelle1a WHERE kategorie='$kategorie'");
while($row = mysql_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysql_free_result( $result );
print_r($_POST);
$unterkategorie=$_POST['unterkategorie'];   
$kategorie=$_POST['kategorie'];   
?></select></form>
</td><td width="30%"><form name="artikel3" method="post" action="">
<?php echo "$kategorie - $unterkategorie"; ?>
<select name="kurzartikel" onkeyup="this.form.unterkategorie.value = this.value">
<option value="">artikel</option>
<?php
include ("config/config.php");
$Connect = mysql_connect($server, $user, $pass);
@mysql_select_db("$dbase");
$result =  mysql_query("SELECT kurzartikel FROM $tabelle1a WHERE unterkategorie='$unterkategorie'");
while($row = mysql_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";
mysql_free_result( $result );
print_r($_POST);
$kurzartikel=$_POST['kurzartikel'];   
?></select></form>
</td></tr>
</tbody></table>

Ich danke jetzt schon mal für euer Verständnis und eure Hilfe!!

LG Spiro
 
Guten Morgen,

meine Antwort hat nur indirekt mit deiner Frage zu tun, denn ich mich darauf hinweisen dein Script zum Wohle deiner Kunde und dir "SQL Injection" sicher zu machen.

Beispiel:
PHP:
<?php
$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".$_POST['spalte2Wert']."'";

$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
?>

Mit den Gegenmaßnahmen könnte es folgendermaßen aussehen.
PHP:
<?php
$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'";

$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
?>

Ansonsten besteht die Gefahr das durch SQL Injection Daten ausgelesen, manipuliert oder gelöscht werden. Es reicht eine Filterung/Maskierung -> Escapen.

Nun zu deinem Problem. Das was du benötigst ist die Eigenschaft onchange="". http://www.w3schools.com/jsref/event_onchange.asp

Mit freundlichen Grüßen
Halfbax
 
Zuletzt bearbeitet:
Hallo halfbax,

die Seite ist nur für meinen Gebrauch. Der Zugang ist Passwort geschützt.

Danke für deinen Tipp, da werde ich mich morgen mal einlesen.
 
Ergänzend zum Beitrag von Halfbax:

die mysql_* Funktionen in PHP sind deprecated und sollte schon ein paar Jahre nicht mehr genutzt werden.
Eine Alternative dazu bietet mysqli und PDO.

In beiden gibt es auch sogenannte Prepared Statements, welche eine Effektive Methode ist SQL-Injections vorzubeugen.
 
Hallo Halfbax,
gibt es da rein zufällig eine deutsche Seite zu? Ich verstehe zwar ein wenig Englisch, aber dafür ist es zu wenig.

Außerdem hab ich da mal eine kurze Frage. Muss ich zu jedem onChange eine Funktion definieren? Bisher habe ich nämlich nur diese Variante gefunden.

Ich hab ein onkeyup drin, um von einem Input in ein anderes zu übertragen. Dies klappt ohne definierte Funktion. Funktioniert einfach mit: onkeyup="this.form.versendet.value = this.value"

So eine kurze Form finde ich für ein onChange leider nicht.
 
Ich habe das bei mir so gelöst, dass ich bei dem Dropdownmenu die benötigten Daten in die Values gespeichert habe.

PHP:
if($dataset['mybacks']==1)
        {
            echo "<select id=\"fsides\" name=\"fsides\" onchange=\"changeFunc()\">
                    <option value=',,'>Back wählen</option>";

            foreach($frontside as $front)
            {
                $sollTime = $daypage_data->secTOmin($front['prodtime']);
                echo "<option value='{$front['POOLNR']},{$front['VERBRAUCH']},{$front['praefix']},{$sollTime}'>{$front['POOLNR']}</option>";
            }

            echo '  </select>';
        }

Und anschließend ein JS welches mir bei der Auswahl die vorhandenen Daten in die Inputs schiebt. Jedoch habe ich nur ein Input und nicht mehrere. Das kann man aber sicherlich einfach lösen.

Code:
function changeFunc()
    {
        var selectBox = document.getElementById("fsides");
        var selectedValue = selectBox.options[selectBox.selectedIndex].value;
        var parts = selectedValue.split(",");

        document.getElementById("auflage").value = parts[1];
        document.getElementById("verbrauch").value = parts[1];
        var partsPoolnr = parts[0].split("-");
        //entfernt den verwendenten präfix aus der Poolnummer
        var newPoolnr = partsPoolnr[0].replace(parts[2],'');

        if(partsPoolnr[1]>0)
        {
            document.getElementById("poolnrteil").value = partsPoolnr[1];
            document.getElementById("poolnr").value = newPoolnr;
        }
        else
        {
            document.getElementById("poolnrteil").value = '';
            document.getElementById("poolnr").value = newPoolnr;
        }
        document.getElementById("flpl").value = parts[2];

        if(parts[3]>0)
        {
            document.getElementById("soll").value = parts[3];
        }
    }
 
Zuletzt bearbeitet:
Hallo zusammen,

ich meinte eine deutsche Seite zu dem onChange, nicht zu dem mysqli.

Naja, irgendwie werden meine Fragen hier auch nicht beantwortet. Ich such dann mal weiter.
 
Ich habe dir doch einen Ansatz gepostet. Ich kenne auch kein deutsches tutorial , welches sich ausschließlich mit onchange beschäftigt, da onchange nur ein Eventauslöser ist. Das bedeutet, wenn ich das Dropdown Menü ändere, also einen Artikel auswähle, dann mach was. Was es machen soll, weiß das onchange nicht. Dies wird in eine Funktion ausgelagert und diese besteht dann in deinem Fall aus Javascript, da js clientseitig funktioniert. Also musst du mal bitte Google anders Fragen. Wenn dir mein Beispiel nicht weiterhilft.

Zumal du alles vorhanden hast.

PHP:
while($row = mysql_fetch_row($result))
    echo "<option value=\"$row[0]\">$row[0]</option>";

In die Values einfach wie bei mir die zu übergebenen Daten einfügen. Ich bin zwar kein Fan von fetch_row, da man damit keine Übersicht bekommt und man nie weiß, was in den Zahlen gepostet wird, aber gut.
Dann bitte arbeite mit Einrückungen und den {} Klammern, damit man Fehler auch schneller erkennen kann.

Außer du hast das PHP Buch "Quick and Dirty" gelesen ;) Da wird sowas nämlich super beschrieben.

Danach musst du evtl. jeder Zeile eine einmalige ID vergeben die du auch in die option Value per php hochzählen lässt, damit das Script auch weiß, in wlecher Zeile du dich befindest. Dazu schaue mal nach "attr ID js" oder versuche erstmal meinen Ansatz umzusetzen.
$i=1;
PHP:
while($row = mysql_fetch_row($result)) {
    echo "<option value=\"$i\">$row[0]</option>";

}
$i++;
 
Zuletzt bearbeitet:
ich meinte eine deutsche Seite zu dem onChange, nicht zu dem mysqli.

Naja, irgendwie werden meine Fragen hier auch nicht beantwortet. Ich such dann mal weiter.
Die (meiner Meinung nach) einzige offene Frage steht im selben Post, in dem du schon nicht mehr warten willst...
Ich kenn leider auch keine deutsche gute Seite dazu, aber es sollte auch keine nötig sein. Eventlistener ist Eventlistener.

Für dich und für einige andere hier auch noch einmal in Kürze:
a) Die Mysql-Funktion sind schlecht, zB. weil sie nach PHP5 nicht mehr vorhanden sind und PHP5 ab Dezember auch nicht mehr vorhanden ist. Entweder man dann hat Code, der einfach nicht funktioniert (weil man Zeug verwendet, dass 1996 einführt wurde und schon längst überholt ist), oder man hat einen schnell gehackten Server (Datenklau, Malware, Anzeigen wegen dem Unsinn den der eigene Server macht, ...)
b) PHP-Variablen in Abfragen direkt einzufügen ist schlecht, weil damit jeder die Abfrage nach Belieben anpassen kann. Und "die Seite ist passwortgeschützt" ist keine Ausrede. zB. Wenn deine Benutzer in der DB stehen kommt man eben aus dem Grund ganz einfach rein.
 
Zurück