[PHP] Select-Box: Datenübergabeproblem

SHViperia

Member
4 November 2006
12
0
Hallo, ich nochmal ^^

Folgendes Problem:

Will per Formular (Select-Box, multiple) einige Daten in eine Datenbank speichern. Das speichern an sich klappt ja ganz gut, aber es wird immer nur der zuletzt ausgewählte Wert abgespeichert.

tab3.jpg


Was jedoch passiert, ist, dass nur die Größe 70x40 eingetragen wird.

tab4.jpg


hier die Strucktur der DB:


tab5.jpg

tab6.jpg


admin_schilder.php:
PHP:
<?
//Datenbankverbindung
mysql_connect ("localhost", "root", "") or die ("Keine Verbindung zum Server");
mysql_select_db ("dgs") or die ("Keine Verbindung zur Datenbank");
//Formular
echo '
<link href="design.css" rel="stylesheet" type="text/css" />		
		<form method="post" action="speichern.php">
        <label>Artikel:</label><input name="name" type="text" id="name"><br>
        <label>Artikel-Nummer:</label><input name="artnr" type="text" id="artnr"><br>
        <label>Beschreibung:</label><textarea name="description" cols="40" rows="10" wrap="standard" id="description"></textarea><br>
		<select name="size" id="size" size="5" multiple="multiple">
    <option value="<li>30x40</li>">30x40</option>
    <option value="<li>50x40</li>">50x40</option>
  	<option value="<li>60x40</li>">60x40</option>
  	<option value="<li>70x40</li>">70x40</option>
  </select>
        <input name="speichern" type="submit" id="speichern" value="Speichern">
    </form>'; 
  ?>

speichern.php:
PHP:
<?
mysql_connect ("localhost", "root", "") or die ("Keine Verbindung zum Server");
mysql_select_db ("dgs") or die ("Keine Verbindung zur Datenbank");
if(isset($_POST['speichern']) and !empty($_POST['speichern']))
{
  $name = $_POST["name"];
  $artnr = $_POST["artnr"];
  $description = $_POST["description"];
  $size = $_POST["size"]; 

  $eintrag = "INSERT INTO schilder (name, artnr, description, size) VALUES ('$name', '$artnr',
  '$description', '$size')";

  $eintragen = mysql_query($eintrag);
echo 'Eintrag wurde gespeichert!';
}
?>

Wie lautet der Code, dass alles, was ausgewählt wurde, auch gespeichert wird?

Danke für eure schnelle hilfe.
 
Bevor die Seite online geht, musst du dir dringend noch einige Sachen aneignen:
:arrow: Datenbank mit anderem Benutzer und mit ordentlichem Passwort verwenden
:arrow: Keine HTML Tags in die Datenbank schreiben
:arrow: Keine PHP Befehle in die Datenbank schreiben
:arrow: Daten, die vom Besucher kommen, insbesondere Formulareinträge ($_POST), Adresszeilenparameter ($_GET) und Cookies ($_COOKIES) IMMER auf deren Inhalt überprüfen und auf keine Fall direkt in Datenbankbefehlen verbauen.
 
Hi Joschilein,

Jo, du hast schon Recht. Mir fehlen noch sehr viel Kenntnisse.
Das mit dem Benutzernamen und Passwort wird dann schon ordentlich sein.
Nur zur Zeit habe ich es halt local und daher keine Benutzerorientierte Verwaltungsschicht vorgesehen.

Was bei mir allerdings noch ein Problem ist, ist das "Aneignen". Ich kann zwar in diversen manuals diese ganzen befehle recht gut verstehen, aber wenn ich das jetzt auf mein Projekt anwenden will, dann weiss ich plötzlich überhaupt nicht weiter.

Mir fehlen da ganz konkrete, vorallem projektbezogene Beispiele, um mir diese ganzen Befehle wirklich "aneignen" zu können.

Mit der Antwort von Ares komme ich zBsp. nicht recht klar.

HTML-Tags:

Wie kann ich es realisieren, dass diese html-tags nicht direkt in die db geschrieben werden, sondern an den stellen generiert werden, wo sie später selbst mal geparst werden sollen?

Mit meinst du das mit dem Inhalt überprüfen???
Meinst du damit die formatierung der Daten? Die Datenmenge? Oder was ist damit gemeint?
--------------------------

Ich will jetzt auch am anfang noch nicht zu weit ausschweifen. Ich bin ja noch Anfänger in PHP.
Jedoch möchte ich wenigstens für meinem bekannten (der ja nun absolut null ahnung von dem ganzen zeug hat) eine möglichst für ihn einfache verwaltung seiner homepage machen.

Security und w3c sei erstmal dahingestellt.
Funktionieren soll es nur.
 
du must die werte auch als array übergeben

select name="size[]"

Ok ich habs jetzt so:
PHP:
<?
//Datenbankverbindung
mysql_connect ("localhost", "root", "") or die ("Keine Verbindung zum Server");
mysql_select_db ("dgs") or die ("Keine Verbindung zur Datenbank");
//Datensätze
$size = array ("30x40","50x40","60x40","70x40");
//Formular
echo '
<link href="design.css" rel="stylesheet" type="text/css" />		
		<form method="post" action="speichern.php">
        <label>Artikel:</label><input name="name" type="text" id="name"><br>
        <label>Artikel-Nummer:</label><input name="artnr" type="text" id="artnr"><br>
        <label>Beschreibung:</label><textarea name="description" cols="40" rows="10" wrap="standard" id="description"></textarea><br>
		<select name="size[]" id="size" size="5" multiple="multiple">
    <option value="<li>30x40</li>">30x40</option>
    <option value="<li>50x40</li>">50x40</option>
  	<option value="<li>60x40</li>">60x40</option>
  	<option value="<li>70x40</li>">70x40</option>
  </select>
        <input name="speichern" type="submit" id="speichern" value="Speichern">
    </form>'; 
  ?>

nun stehen aber nicht die größen da, sondern das wort "array".
Was ist falsch?
 
array bedeutet einfach gesagt mehrere werte in einer variable
so wie du es z.z. machst wird der immer der letzte der vorherige wert überschrieben und es passiert wie bei dir das nur der letzte wert angezeigt wird
wenn du beim name size die eckigen klammer dahinter setzt dann wird jeder wert der angeklickt wird übergeben

mit einer einfachen schleife kannst du dann jeden wert auslesen
PHP:
foreach ($size as $wert){
echo "$wert<br>";
}

bzw für dich einfacher
PHP:
foreach ($size as $wert){
$a .= "$wert<br>";
}

jetzt kannst du den wert $a einfach in deine DB speichern
 
Kannst du mir bitte deinen code in meine Dateien anbinden, die ich oben gepostet habe.

ich bekomms nicht hin.

PHP:
  $name = $_POST["name"];
  $artnr = $_POST["artnr"];
  $description = $_POST["description"];
foreach ($size as $wert){
$a .= "$wert<br>";
}   
  $size = $_POST["$size"];
  	


  $eintrag = "INSERT INTO schilder (name, artnr, description, size) VALUES ('$name', '$artnr',
  '$description', '$a')";

Danke dir :D
 
aus
PHP:
foreach ($size as $wert){
$a .= "$wert<br>";
}   
  $size = $_POST["$size"];
machst du:
PHP:
$size = '';
foreach ($_POST['size'] as $wert){
$size .= "$wert<br>";
}
 
Security und w3c sei erstmal dahingestellt.
Funktionieren soll es nur.
Genau das ist das Problem, denn wenn es erstmal funktioniert, kümmert sich keiner mehr um die Sicherheit und dann kommt mal einer daher, der sich mit SQL Injections auskennt und wenn dann auch noch "root" der ausführende Benutzer ist und der kein Passwort hat, dann ist schneller als man schauen kann die ganze Datenbank am unbemerkt manipuliert oder komplett zerschossen und falls das ganze dann noch auf einem Shared Server (viele Benutzer teilen sich einen Server) läuft, ist die Sicherheit für die anderen auch dahin.
So das war mal die obligatorische Standpauke zum Thema Sicherheit 8)

Was bei SQL Injections passieren kann und wie man sie vermeidet erklärt Onkel Google.
Darüber hinaus müssen Daten aber auch noch anderweitig überprüft werden, von wegen "gehört das, was mir gerade jemand im Formular gesendet hat überhaupt zu den Möglichkeiten, die ich zulassen will?". Beispielhaft: Wird die Eingabe einer Postleitzahl verlangt, gehören Buchstaben nicht wirklich in das Feld. Ist nach einem Usernamen gefragt, sollte der auch in der Datenbank vorhanden sein etc. In deinem Fall wäre ein Beispiel, ob die eingegebene Abmessung zu den zugelassenen Möglichkeiten zählt. Und die trügerische Sicherheit, dass der Nutzer ja nur auswählen kann, was man ihm im Formular vorgegeben hat, ist grottenfalsch. Alles was vom Besucher kommt, kann manipuliert sein.

Es gibt eine ganz einfache Regel: Trenne strikt Inhalt vom Design. Du musst dir einfach eine Gruppe von Personen vorstellen. Person A (dargestellt durch das PHP Programm) schaut in die Datenbank, holt sich alle Artikel raus und übergibt sie Person B (dargestellt durch ein Templatesystem (oder in einfacher Form durch ein zweites PHP Programm), das aus den erhaltenen Daten den Inhalt bastelt, also hier z.B. die Tabelle um den Inhalt baut. Die beiden müssen sich natürlich vorher klar sein, in welcher Form die Daten übergeben werden müssen, also z.B. wie die entsprechenden Arrays aufgebaut sein müssen.
Andersrum baut B ein HTML Formular zusammen, in dem verschiedene Daten übergeben werden. B kümmert sich um das Aussehen des Formulars und A ist das völlig egal und möchte nur mit dem Inhalt zu tun haben und schreibt dann z.B. entsprechend überprüfte Daten in eine Datenbank.
Als kleine Zusammenfassung: Person A hat null Ahnung von HTML (und CSS), während Person B keine Ahnung von Datenbanken hat. Schwer wird es nur, wenn man beide Aufgaben machen soll, aber nicht gescheit voneinander trennt.

In deinem Fall wäre es jetzt ein gewisser Overkill zwei Extratabellen zu machen. Eine in der einfach alle Möglichkeiten für die Größenangaben aufgeführt sind (das wäre z.B. schon ein Schritt zu einer einfachen Überprüfung, ist der Übergabewert nicht in dieser Tabelle vorhanden, ist irgendwas faul..). In einer zweiten Tabelle werden dann Verknüpfungen zwischen den Artikeleinträgen und den Größenangaben hergestellt.

Als Miniversion kann man aber schon bei der einen Tabelle bleiben, nur dann muss man sich ein ordentliches Format für den Eintrag überlegen. Dazu gehören aber sicher keine HTML Tags, sondern z.B. eine einfache Liste wie "30x40, 50x40, 60x40, 70x40". Die kann einfach per implode() aus einem Array erzeugt werden und genauso leicht per explode() wieder in ein Array verwandelt werden.

Und wenn B hier einfach so komische Sachen und HTML Tags in Option Felder packt, muss A weiter denken und entsprechendes aus der Übergabe filtern, denn der will ja wie gesagt nur die Daten verwenden. Sprechen sich beide ab, baut B gescheite Formulare und übergibt nur den Inhalt. A muss dann zwar immer noch überprüfen, ob nicht SQL Injections versucht werden und entsprechende Versuche (bzw. bei guter Scriptvorbereitung den verbleibenden Datenmüll) entweder filtern oder die Ausfühung mit Fehler beenden.
 
WoW!

Du scheints genau zu wissen, wovon du redest. Respekt!

Das gibt mir natürlich jetzt zu denken.

Ich denke, ich werde noch unmengen an wissen sammeln müssen, bis ich sowas, wie du gerade erklärt hast, einigermaßen gescheit hinbekomme.


Wegen dem explode und implode muss ich mich mal genauer belesen.
Vorallem genaue Beispiele sind wichtig, damit ich es richtig kapiere.

Aber bis hier her habt ihr schon sehr geholfen.
Find ich Klasse.

Ich hoffe, ich kann das später auch, wenn ich in 18 monaten mit meinem studium fertig bin.