mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Mi 24.04.2024 01:48 Benutzername: Passwort: Auto-Login

Thema: [MySQL] Schreiben & Lesen aus mehreren Tables "gleichzeitig" vom 18.06.2007


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [MySQL] Schreiben & Lesen aus mehreren Tables "gleichzeitig"
Autor Nachricht
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Mo 18.06.2007 09:53
Titel

[MySQL] Schreiben & Lesen aus mehreren Tables "glei

Antworten mit Zitat Zum Seitenanfang

Hola an alle.

Ich hab ein MySQL Problem, und Google, div. Foren & Co konnten mir nicht helfen. Vielleicht weiß hier ja jemand Rat * Ich bin unwürdig * .

Also, eigentlich ganz "einfach" Au weia! :

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) * Keine Ahnung... * .
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 Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Kraat

Dabei seit: 05.10.2006
Ort: Köln
Alter: 42
Geschlecht: Männlich
Verfasst Mo 18.06.2007 09:59
Titel

Antworten mit Zitat Zum Seitenanfang

http://de.php.net/manual/de/function.mysql-insert-id.php

Das sollte Dir auf die Sprünge helfen ^^

Lächel Gruß
  View user's profile Private Nachricht senden
Anzeige
Anzeige
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Mo 18.06.2007 10:02
Titel

Antworten mit Zitat Zum Seitenanfang

wow geil.
den kannte ich noch nicht...damit versuch ich mal mein glück...
ich meld mich wieder *zwinker*

Danke,

CU
Lio Grins

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 * Keine Ahnung... *

Danke im voraus

CU
Lio Grins

[edit by Nimroy]
Bitte edit verwenden.


Zuletzt bearbeitet von Nimroy am Mo 18.06.2007 11:40, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Kraat

Dabei seit: 05.10.2006
Ort: Köln
Alter: 42
Geschlecht: Männlich
Verfasst Mo 18.06.2007 10:26
Titel

Antworten mit Zitat Zum Seitenanfang

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]
  View user's profile Private Nachricht senden
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Mo 18.06.2007 10:46
Titel

Antworten mit Zitat Zum Seitenanfang

hhhmm, nö, habs mal umgesetzt aber klappt nicht.

sonst noch ne idee * Keine Ahnung... *
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
m
Moderator

Dabei seit: 18.11.2004
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Mo 18.06.2007 11:23
Titel

Antworten mit Zitat Zum Seitenanfang

Das kann ja nicht das ganze Script sein? Was hältst denn davon mal anständig
zu erklären was nicht funktioniert? Fehlermeldungen, irgendetwas?

Dann einfach auch zusätzlich mal hier nen Blick drauf werfen:
http://www.mediengestalter.info/forum/22/php-fehler-finden-leicht-gemacht-85038-1.html


Zuletzt bearbeitet von m am Mo 18.06.2007 11:24, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Mo 18.06.2007 11:28
Titel

Antworten mit Zitat Zum Seitenanfang

AHHHH, ich könnte * Ich muß mich mal kurz übergeben... * .
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 *zwinker*.

Danke für den Tipp mit dem mysql_insert_id(), das werd ich mir merken * huduwudu! *

CU
Lio Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
rob

Dabei seit: 11.12.2003
Ort: ~/
Alter: 46
Geschlecht: Männlich
Verfasst Mo 18.06.2007 13:21
Titel

Formulare, PHP, MySQL und Angriffe per SQL-Injection

Antworten mit Zitat Zum Seitenanfang

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.
  View user's profile Private Nachricht senden
 
Ä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)
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


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.