1.7k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

ich habe in meiner Datenbank eine Tabelle, in der zu einer E-Mail-Adresse zusätzlich ein Datum und weitere Felder gespeichert sind.

Nun habe ich ein Formular mit einem textarea-Element, wo zeilenweise beliebig viele E-Mail-Adressen eingegeben werden können. Beim Abschicken des Formulars soll nun für jede E-Mail (sofern korrekt) geprüft werden, ob sie in der Tabelle vorhanden ist und wenn ja, entsprechende Felder anzeigen. D.h. später im HTML möchte ich eine Tabelle mit allen eingegebenen E-Mails anzeigen und ob sie vorhanden ist (dnan mit den Feldern) oder nicht.

Jetzt hänge ich nur an der Abfrage...kann ich das mit einer machen oder muss ich zwangsläufig mehrere Selects durchführen? Ne alternative wäre, das gesamte Rückgabeergebnis in einem Array zu speichern, aber das scheint mir zu speicherintensiv....

Was sagt ihr dazu?

4 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Alles nein!

Das ganze geht mit einer Abfrage und das ist am optimalsten, weil deren Ergebnismenge in jedem Fall immer nur datensatzweise zurückgegeben wird statt komplett.

Aber du kannst nicht den gesamten TEXTAREA-Inhalt in die SQL-Abfrage einbauen. Dieser muss vorher aufbereitet werden, z.B. mittels der Funktion split(), um daraus dann einen Text in angemessener SQL-Form zu erstellen, wie z.B.
'eins@eins.de', 'zwei@zwei.com', 'drei@drei.net'


Dieser wird dann in die SQL-Abfrage eingebaut:
SELECT t.email, t.datum, t.weitere FROM tabelle_emails t WHERE t.email IN ( $aufbereiteterText )


Und die Ergebnisse lässt du einfach auflisten.

Für ein konkretes Beispiel brauch ich:
[list][*]Die Art, wie die E-Mails eingegeben werden (wirklich nur eine pro Zeile?)
[*]Eine Beschreibung der Tabelle mit den E-Mails (DESC tabelle)
[*]Den Datenbanktyp (MySQL?)
[/list]
0 Punkte
Beantwortet von
Erstmal vielen Dank für die Antwort.

An das IN-Statement hatte ich auch schon gedacht, aber dann werden doch nur die Datensätze angezeigt, die auch in der Tabelle vorhanden sind oder?

Hier die von dir gewünschten Infos:

- E-Mails werden wirklich Zeilenweise eingegeben, ich prüfe vorher auch auf gültiges Format etc, das heißt, ich könnte alle gültigen E-Mails für die SQL-Abfrage korrekt aufbereiten
- Datenbanktyp ist MySQL
- Beschreibung der Tabelle:

Field | Type | Null | Key | Default
----------------------------------------------------------------
mailing_list | int(11) | NO | PRI | NULL
email | varchar(100) | NO | PRI | NULL
remote_addr | char(15) | NO | | NULL
user | int(11) | NO | | NULL
date | timestamp | NO | | CURRENT_TIMESTAMP
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
aber dann werden doch nur die Datensätze angezeigt, die auch in der Tabelle vorhanden sind oder?
Genau - diesen Wunsch hast du erst jetzt geäußert ;-)

Also mal gesetzt den Fall du hast die E-Mails in PHP bereits alle in einem Feld drin (weil du sie vorher gesplittet hast). Testhalber füll ich das Feld jetzt mal selbst:


// alle E-Mail-Adressen, die abgefragt werden sollen
$aEmail= array
( 'eins@eins.de'
, 'zwei@zwei.com'
, 'drei@drei.net'
);

// Mehrfachvorkommen verhindern
$aEmail= array_unique( $aEmail );

// zum DBMS verbinden und DB wählen
mysql_connect( 'host', 'user', 'pass' ) or die( 'connection fail: '. mysql_error() );
mysql_select_db( 'db' ) or die( 'selectdb fail: '. mysql_error() );

// E-Mails in SQL einfügen und das ganze ausführen
$sSql= '
SELECT t.email
, t.mailing_list
, t.remote_addr
, t.user
, t.date
FROM tabelle t
WHERE t.email IN ( \''. implode( '\', \'', $aEmail ). '\' )';
$res1= mysql_query( $sSql ) or dir( 'query fail with '. $sSql. '...: '. mysql_error() );

// Ergebnismenge
$aErg= array();
while( $row1= mysql_fetch_array( $res1 ) ) {
$aErg[$row1['email']]= $row1;
}

// Abfrage beenden
mysql_free_result( $res1 );

// Ausgabe: existiert die E-Mail-Adresse in der Ergebnismenge?
$sOut= '';
foreach( $aEmail as $key1=> $val1 ) {
$sOut.= 'E-Mail='. $key1;
if( isset( $aErg[$key1] ) ) {
$sOut= $sOut
. ', Mailing_List='. $aErg[$key1]['mailing_list']
. ', Remote_Addr='. $aErg[$key1]['remote_addr']
. ', User='. $aErg[$key1]['user']
. ', Date='. $aErg[$key1]['date']
;
} else {
$sOut.= ' (nicht vorhanden)';
}
$sOut.= '<br/>';
}

echo $sOut;
Ungetestet.
0 Punkte
Beantwortet von
Naja ich hatte ja im ersten Beitrag geschrieben, dass ich zu jeder E-Mail anzeigen lassen möchte, ob sie vorhanden ist oder nicht. Aber ok, du hast es nun auch so umgesetzt, dass du das Ergebnis erstmal in einem Array speicherst, was ich ja auch schon so geplant hatte. Vielleicht hab ich mich auch einfach etwas ungeschickt ausgedrückt.
Vielen Dank!
...