PHP/MySQL Problem

Pennywise09

Lt. Junior Grade
Registriert
Dez. 2004
Beiträge
287
Hallo

ich habe folgendes Problem:

Ich möchte das folgende Einträge der Html Datei in eine MySQL Datenbank eingetragen werden.

Es klappt auch alles, bis auf den Eintrag für die Checkboxen "Studiengang". Da habe ich das Problem, dass er mir immer nur den zuletzt ausgewählten Studiengang Einträgt. Wählt man also 4 Studiengänge, W, L, P, H aus, trägt er nur H in die Datenbank ein.

Hier die 2 Quellcodes zu meinem Problem:

Html:
HTML:
<body>

Mat.Nr.:&nbsp;&nbsp;
<form action="student.php" method="POST">
<input type="text" name="matrnr" /> &nbsp;&nbsp;Studiengang: 
<INPUT TYPE="checkbox" NAME="StudiengangW">&nbsp;&nbsp;W&nbsp;
<INPUT TYPE="checkbox" NAME="StudiengangL">&nbsp;&nbsp;L&nbsp;
<INPUT TYPE="checkbox" NAME="StudiengangP">&nbsp;&nbsp;P&nbsp;
<INPUT TYPE="checkbox" NAME="StudiengangH">&nbsp;&nbsp;H&nbsp;
<p>
<BR>
	<p> Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	<input type="text" name="name" /> &nbsp;&nbsp;Vorname: &nbsp;
	<INPUT TYPE="text" NAME="vorname"><p>
    <BR>
	<p> e-mail: &nbsp;&nbsp;&nbsp;&nbsp;
	<input type="text" name="email" /> &nbsp;&nbsp;Semester: &nbsp;<SELECT NAME="semester">
    <option value="1"> 5</option>
    <option value="1"> 6</option>
    <option value="1"> 7</option>
    <option value="1"> 8</option>
    <option value="1"> 9</option>
	</SELECT>
	<BR><BR><BR>
	<p>



<INPUT TYPE="submit" value="Fertig">
</form>
</BODY>

und der php code:

PHP:
<?php
mysql_connect("xxx.xx.xxx.xxx",root,"");

$id=mysql_select_db("test");



$erg=mysql_query("INSERT INTO studenten(name,vorname,matrnr,email) VALUES('$name','$vorname', '$matrnr', '$email')");


if ($studiengangW =! "")
mysql_query("update studenten set studiengang = 'w' where matrnr='$matrnr' ");

if ($studiengangL =! "")
mysql_query("update studenten set studiengang = 'L' where matrnr='$matrnr' ");

if ($studiengangP =! "")
mysql_query("update studenten set studiengang = 'P' where matrnr='$matrnr' ");

if ($studiengangH =! "")
mysql_query("update studenten set studiengang = 'H' where matrnr='$matrnr' ");
?>
 
Zuletzt bearbeitet von einem Moderator: ([html] und [php]-Tags)
Update bezieht sich nur auf vorhandene Datensätze.
Wenn du also den selben Datensatz 4 mal hintereinander veränderst bleibt logischerweise nur die letzte Änderung erhalten.

Eine Mehrfachauswahl wird also aufwändiger. Mein Ansatz wäre:

Alle Datensätze einer Matrikelnummer löschen (Studiengangszuordnung) und mit insert die jetzt korrekten Datensätze neu anlegen.

HTH, Erazor

p.s.: verwende für php bitte
PHP:
 und für code [code].
 
Zuletzt bearbeitet:
Also in Deinem Beispiel lässt du auch nur einen EIntrag in der Datenbank zu und nicht vier.
Du müsstest das mit einem seperator, wie z.B. ; machen.

Also das im Prinzip in der Datenbank je nachdem folgendes steht:

W;P;H

oder:
W;P

usw.

Kannst du ja einfach mit .= anhängen und beim auslesen einfach immer an dem ; splitten
 
Also wie genau müsste dann der php code aussehen, damit ich in der Spalte matrnr der MySQL Datenbank bis zu 4 Studiengänge eingetragen bekomme ?

bisher habe ich ja

if ($studiengangW =! "")
mysql_query("update studenten set studiengang = 'w' where matrnr='$matrnr' ");

if ($studiengangL =! "")
mysql_query("update studenten set studiengang = 'L' where matrnr='$matrnr' ");

if ($studiengangP =! "")
mysql_query("update studenten set studiengang = 'P' where matrnr='$matrnr' ");

if ($studiengangH =! "")
mysql_query("update studenten set studiengang = 'H' where matrnr='$matrnr' ");
 
Ich meine schon genau das :)

Was du da hast ist eine sog. m:n (m zu n, Viele zu Viele)-Beziehung.
Es gibt also "viele" Studiengänge, denen "viele" Studenten angehören.

In relationalen Datenbanken löst man dieses Problem mit einer Zwischentabelle / Mappingtabelle.

Du machst also folgendes:

1. Neue Tabelle anlegen
Code:
CREATE TABLE studenten_studiengaenge (
matrikelnummer int not null,
studiengang char(5) not null,
PRIMARY KEY (matrikelnummer, studiengang)
);
Mit Indizes kannst du noch variieren, mit den Feldtypen auch.

2. Statt deinem INSERT Statement:
Code:
DELETE FROM studenten_studiengaenge WHERE matrikelnummer = '$matrnr'

3.
PHP:
if ($studiengangW =! "")
mysql_query("INSERT INTO studenten_studiengaenge (matrikelnummer, studiengang) VALUES ('$matrnr','W');");

if ($studiengangL =! "")
mysql_query("INSERT INTO studenten_studiengaenge (matrikelnummer, studiengang) VALUES ('$matrnr','L');");

if ($studiengangP =! "")
mysql_query("INSERT INTO studenten_studiengaenge (matrikelnummer, studiengang) VALUES ('$matrnr','P');");

if ($studiengangH =! "")
mysql_query("INSERT INTO studenten_studiengaenge (matrikelnummer, studiengang) VALUES ('$matrnr','H');");
Natürlich kann man die Auswahl auch eleganter machen sodass du ein Array der markierten Studiengänge hast, das du dann mit einer Schleife durchgehen kannst und je Durchlauf ne Query startest oder ein mass insert oder sowas... aber das war ja nicht die Frage :)

Wenn du das mit den m:n (aka. many-to-many) Beziehungen noch nicht so verstanden hast, emfehle ich dir allgemeine Bücher oder Seiten über relationale Datenbanken oder dieses Forum ;)

ps: keine Garantie, dass der Code oder die Queries funktionieren, es geht ums Grundverständnis.

@ludieku:
Dein Vorschlag ist böse...
Sowas machen leider viele PHP/MySQL Programmierer die es nicht besser wissen.
Das Problem hierbei ist grottenschlechtes Tabellendesign. Die Werte sind nicht konsistent (Stichwort Datenintegrität) und können syntaktisch fehlerhaft sein. MySQL würde dich nicht warnen wenn zwei Kommas hintereinander kommen...
Standardlösung für m:n Beziehungen ist immer eine Zwischentabelle. Alles andere ist leider nur Flickwerk und Pfusch, sorry...
 
Zurück
Oben