online 1
gast (50)

/ Forum / Skripte(PHP,ASP,Perl...)

Skripte(PHP,ASP,Perl...)Skripte(PHP,ASP,Perl...)

Fragevon wid vom 08.01.2022, 13:26 Options

Eine SQL-Abfrage oder mehrere?

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?


Antwort schreiben

Antwort 1 von son_quatsch vom 11.01.2022, 08:18 Options

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:
Zitat:
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:
  • 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?)

Antwort 2 von wid vom 11.01.2022, 11:15 Options

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

Antwort 3 von son_quatsch vom 11.01.2022, 12:19 Options

Zitat:
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.

Antwort 4 von wid vom 11.01.2022, 12:50 Options

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!

Ähnliche Themen

SQL Timestamp mit PHP bearbeiten
Timi_79  16.07.2008 - 52 Hits - 1 Antwort

PHP prepared Stataments SQL-Update
detommy  03.12.2008 - 40 Hits - 1 Antwort

SQL Befehl USER ID
Joe4589  23.01.2009 - 218 Hits - 3 Antworten

SQL Abfrage, doppelte Einträge
S1lv3R  30.06.2009 - 743 Hits - 6 Antworten

SQL Abfrage / Array
hsez  10.10.2009 - 454 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026