Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
LioGetz
Threadersteller
Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht:
|
Verfasst Mo 18.06.2007 09:53
Titel [MySQL] Schreiben & Lesen aus mehreren Tables "glei |
|
|
Hola an alle.
Ich hab ein MySQL Problem, und Google, div. Foren & Co konnten mir nicht helfen. Vielleicht weiß hier ja jemand Rat .
Also, eigentlich ganz "einfach" :
Ich habe ein Formular in der sich ein User eintragen kann (vorname, nachname, email, etc.), mit normalen Textfeldern und Checkboxen für verschiedene E-Mail-Verteilern.
Dafür habe ich 3 Tables angelegt, 1 für die Userdaten (user_ID, vorname, nachname...) , 1 für die Verteiler (verteiler_ID, name) und eine Zuordnungstabelle (user_ID, verteiler_ID) die einen User den verschiedenen Verteilern zuordnen soll.
Soweit - so gut.
Die Verteiler werden dynamisch beim Aufruf der Formular-Seite erzeugt, da es sein kann das sich die Anzahl etc. ändert:
Code: |
// Schleife für die Checkboxen aus der DB
while ($data=mysql_fetch_array($result)) {
echo "<input type='checkbox' name='verteiler[]' value='" . $data['name']. "'>" . $data['name'] . "<br />";
}
|
Beim einfügen der Daten kommt jetzt das große Problem!
Die Benutzerdaten kommen ganz normal in die Tabelle "kontakte". Nur WIE schaffe ich es, das er beim abschicken des Formulars sofort die user_ID des neuen Kontaktes mit den (angeklickten) Verteiler-IDs in die zuordnungstabelle steckt. Er kennt ja weder die user_ID, noch die verteiler_ID (notfalls ginge auch verteilername, weil er den durch die Schleife kennt). Ich hatte mir ein schreiben (kontakte) - lesen (kontakte) - schreiben (zuordnung) überlegt aber das haut irgendwie nicht hin.
Hier mal mein Code:
Code: |
// Benutzer anlegen
$query = "INSERT INTO kontakte (vorname,nachname,strasse,telefon,email) VALUES ('$_POST[vorname]','$_POST[nachname]','$_POST[strasse]','$_POST[telefon]','$_POST[email]')"; // Befehl an Datenbank
$result = mysql_query($query); // Befehl an DB senden
// Benutzer_ID auslesen für Eintrag in die Zuordnungs-DB
// HIER MUSS DER FEHLER SEIN :D...Kann man sofort die Kontakt_ID auslesen wenn das Formular gerade abgeschickt wurde und der Benutzer gerade erstellt wird ???
$select = "SELECT kontakt_ID FROM kontakte WHERE email={$_POST['email']}";
$select_result = mysql_query($select); // Befehl an DB senden
// Schleife für jede Checkbox der angeklickt ist
foreach ($_POST['verteiler'] as $elem) {
// Eintag für Benutzer und ausgewählte Checkboxen
$query2 = "INSERT INTO zuordnung (k_ID, v_name) VALUES ($select, $elem)";
$result2 = mysql_query($query2); // Befehl an DB senden
|
Mit dem Code legt er mir zwar ganz normal den User an, aber es passiert nix in der zuordnungs-table.
Vielleicht hab ich auch den totalen Denkfehler und das muss anders gelöst werden...ich hab bei der Recherche immer was von current_val gelesen, aber das scheints bei MySQL nicht zu geben (und wenn, wüsste ich nicht wie das geht) .
Ansonsten wüsste ich nicht wie ich das sonst anstellen sollte, aber vielleicht weiß das ja einer von euch.
(Die Verteiler müssen ne eigene Table bekommen und können nicht einfach als Spalte an die Kontakte-Table drangehangen werden, da ggf. noch weitere Infos zu den Verteilern da rein müssen...)
Vielen Dank im voraus
CU
Lio
|
|
|
|
|
Kraat
Dabei seit: 05.10.2006
Ort: Köln
Alter: 42
Geschlecht:
|
|
|
|
|
Anzeige
|
|
|
LioGetz
Threadersteller
Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht:
|
Verfasst Mo 18.06.2007 10:02
Titel
|
|
|
wow geil.
den kannte ich noch nicht...damit versuch ich mal mein glück...
ich meld mich wieder
Danke,
CU
Lio
Hmmm...das insert_id hat geklappt, aber irgendwo steckt immer noch ein fehler. Ist das auslesen der checkboxen denn so richtig ?
Auslesen:
Code: |
// Schleife für die Checkboxen aus der DB
while ($data=mysql_fetch_array($result)) {
echo "<input type='checkbox' name='verteiler[]' value='" . $data['name']. "'>" . $data['name'] . "<br />";
}
|
und dann das einfügen der angeklickten Checkboxen:
Code: |
$lastid = mysql_insert_id();
// Schleife für jede Checkbox der angeklickt ist
foreach ($_POST['verteiler'] as $elem) {
// Eintag für Benutzer und ausgewählte Checkboxen
$query2 = "INSERT INTO zuordnung (k_ID, v_name) VALUES ($lastid, $elem)";
$result2 = mysql_query($query2); // Befehl an DB senden
}
|
Ist die foreach-Schleife so richtig? Bzw. ist das die richtige Art & Weise um Checkboxen für ne DB zu lesen? Bei Radio-Buttons hat das so geklappt..."eigentlich" sollte doch in $elem der Name des Verteilers stehen die angeklickt sind, oder? Meine Zuordnungs-Table bleibt leer nach dem abschicken
Danke im voraus
CU
Lio
[edit by Nimroy]
Bitte edit verwenden.
Zuletzt bearbeitet von Nimroy am Mo 18.06.2007 11:40, insgesamt 1-mal bearbeitet
|
|
|
|
|
Kraat
Dabei seit: 05.10.2006
Ort: Köln
Alter: 42
Geschlecht:
|
Verfasst Mo 18.06.2007 10:26
Titel
|
|
|
Code: |
$lastid = mysql_insert_id();
// Schleife für jede Checkbox der angeklickt ist
foreach ($_POST['verteiler'] as $elem => $value) {
// Eintag für Benutzer und ausgewählte Checkboxen
$query2 = "INSERT INTO zuordnung (k_ID, v_name) VALUES ($lastid, $value)";
$result2 = mysql_query($query2); // Befehl an DB senden
}
|
Müsste es net eher so sein! Bin mir grad aber auch nicht ganz sicher ^^ [/quote]
|
|
|
|
|
LioGetz
Threadersteller
Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht:
|
Verfasst Mo 18.06.2007 10:46
Titel
|
|
|
hhhmm, nö, habs mal umgesetzt aber klappt nicht.
sonst noch ne idee
|
|
|
|
|
m
Moderator
Dabei seit: 18.11.2004
Ort: -
Alter: -
Geschlecht:
|
|
|
|
|
LioGetz
Threadersteller
Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht:
|
Verfasst Mo 18.06.2007 11:28
Titel
|
|
|
AHHHH, ich könnte .
Ich habs gelöst - es war (mal wieder) ein dämlicher Mini-Fehler.
Die VALUES müssen in Hochkomma ('beispiel') geschrieben werden...ohne klappts nicht !!!
Na toll - gut zu wissen .
Danke für den Tipp mit dem mysql_insert_id(), das werd ich mir merken
CU
Lio
|
|
|
|
|
rob
Dabei seit: 11.12.2003
Ort: ~/
Alter: 46
Geschlecht:
|
Verfasst Mo 18.06.2007 13:21
Titel Formulare, PHP, MySQL und Angriffe per SQL-Injection |
|
|
Ich weiß nicht, wie oft ich das schon geschrieben hab...
Eigentlich schreibe ich das jedesmal wieder, wenn jemand mit Formularen und einer Datenbank arbeitet...
Dein Code ist nicht gesichert. Das ist ganz gefährlich.
Man kann problemlos einen Angriff per SQL-Injection starten und damit beliebigen SQL-Code ausführen.
Auch das PHP-Handbuch enthält eine Seite über SQL-Injections.
Du mußt alle Daten, die von außen kommen, immer grundsätzlich als "böse" ansehen, überprüfen und ggf. bereinigen.
Niemals darfst du Daten einfach so in deine Querys einbauen.
Du mußt in fast jedem Fall immer die Funktion mysql_real_escape_string() aufrufen, um eventuell übermittelten SQL-Code unschädlich zu machen.
Beispiel:
Folgendes ist fahrlässige Programmierung. Man darf sich dann nicht wundern, wenn die Datenbank mal gekillt wird oder sonstwas passiert.
Code: | $select = "SELECT kontakt_ID FROM kontakte WHERE email={$_POST['email']}"; |
Wenn du die Abfrage jetzt folgendermaßen sicherst, gibt es keine Probleme mehr:
Code: | $select = "SELECT kontakt_ID FROM kontakte WHERE email = '". mysql_real_escape_string( $_POST['email'] ) ."'"; |
Und dann hätte ich noch ein paar Anmerkungen zu dem Code.
1. Fehlerbehandlung
Code: | $select = "SELECT kontakt_ID FROM kontakte WHERE email={$_POST['email']}";
$select_result = mysql_query($select); // Befehl an DB senden |
Was ist, wenn dort jetzt irgendwo ein Fehler auftreten sollte?
Eventuell funktioniert der MySQL-Server mal kurzzeitig nicht oder irgendetwas anderes, unvorhergesehenes, passiert.
Dann bekommt der User eine recht unschön aussehende PHP-Fehlermeldung zu sehen und dein Script bricht eventuell ab.
Ich würde dir daher raten, eine Fehlerbehandlung einzubauen.
Das beste wäre natürlich, wenn du dir eine Klasse mit Fehlerbehandlung für den Datenbankzugriff schreiben würdest.+
Aber wenn du direkt mit dem PHP-MySQL-Funktionen arbeitest, würde ich eventuelle Fehlermeldungen mit einem vorrangestellten @-Zeichen unterdrücken und selbst für eine Fehlermeldung (oder eine andere Reaktion) sorgen.
Code: | $select_result = @mysql_query($select) or echo "Fehler: " . mysql_error(); |
2. Nicht mehr einsetzen, als benötigt wird
Hier holst du beispielsweise deine Ergebnisse mit mysql_fetch_array() aus der Tabelle.
Code: | while ($data=mysql_fetch_array($result)) { |
Diese Funktion liefert einen Datensatz als assoziatives Array, als numerisches Array oder beides.
Du nutzt nur das assoziative Array. Daher könntest du der Funktion mit dem zweiten, optionalen Parameter sagen, das du nur dieses haben willst.
Code: | while ( $data = mysql_fetch_array( $result, MYSQL_ASSOC ) ) { |
Alternativ dazu könntest du natürlich auch gleich die Funktion mysql_fetch_assoc() einsetzen.
|
|
|
|
|
|
|
|
Ähnliche Themen |
Zufallszahl in Datenbank schreiben und Lesen
[mysql] Nur aus lesen was größer als ... ist [solved]
Bestimmte Einträge (durch ID bestimmt) aus MySQL-DB lesen
[MySQL] Zwei Datenbanken gleichzeitig abfragen
mysql->updaten von mehreren Spalten??
Daten in MySQL schreiben (Code funktioniert nicht)
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|