• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Massenversand aus Datenbank

BigSanch

New member
Hi

Ich habe ein Problem beim versenden von internen Nachrichten an mehrere User, welche in einer Datenbank drin stehen. Ich habe das Script so geschrieben, dass es die ID's der User aus der Datenbank ausliest, per eplode diese einzeln ausgibt und diese wieder in einer anderen Datenbank, samt text und betreff und so speichern. Soweit funtzt das Script, dass es nun an alle in der Datenbank eingetragenen User eine Mail sendet. Aber ich habe das Problem, trotzdem dass die einfache echo Ausgabe der ID List ohne Leerzeichen oder sonstiges ist, dass es für jeder gesendete Mail an eine bestehende ID auch eine ohne ID sendet, also leer in die Datenbank schreibt, also habe ich bei 5 Usern 10 Mails. % Mails an die User auch mit entsprechender ID und 5 ohne ID und ich weiss nicht wieso.

Hier mein Script ohne Formular:

PHP:
if ($action == "massenmailsend"){

  $massmail = "SELECT * FROM users WHERE";
  $massmail2 = mysql_query ($massmail);

  $1 = $_POST['betreff'];
  $2 = $_POST['text']; 
  $3 = $_POST['email'];
  $4 = $_POST['name'];

  while($mm = mysql_fetch_array($massmail2)){
    $mailids = $mm["id"]."||";
    $ids=explode("||",$mailids);
    foreach($ids as $5){
      $sql = ("
        INSERT INTO pm (betreff, name, email, nachricht, gelesen, uid) 
        VALUES ('".$1."', '".$2."', '".$3."', '".$4."', '0', '".$5."')
      ");
      mysql_query($sql) or die ("Eintrag fehlgeschlagen,<br /> 
      MySQL Error: <strong>".mysql_error()."</strong>");
    }
  }
  echo "
    <center>Nachricht wurde erfolgreich gesendet</center>
    <script>
      function goto(){top.window.location='index.php?datei=pm'}
    </script>
    <script>goto()</script>
  ";
  exit;
}

Die Ausgabe eines einfachen echo $5 ergibt: 12345

Die Anordnung nach versenden in der Datenbank: 0504030201
Wobei 0 für einen Eintrag ohne ID steht. Wie bekomme ich die weg, und vor allem wieso sind die da?

Stimmt da etwas wegen dem explode nicht?

-----------------------------------------------------

MfG und Danke für alle Antworten

BigSanch

-----------------------------------------------------
:icon6:ES IST MIR SCHEISS EGAL WER DEIN VATER IST, WENN ICH HIER ANGEL, HAST DU NICHT ÜBERS WASSER ZU LAUFEN!

:eek:Man muss schon etwas wissen, um verbergen zu können, dass man nichts weiß.
-----------------------------------------------------
 
Zuletzt bearbeitet:
Das ganze Script sieht konfus aus. Wofür das WHERE in der ersten SQL wenn da keine Daten hinter auftauchen?

Mit
PHP:
while($mm = mysql_fetch_array($massmail2)){
startest du die Schlaufe zum Auslesen der Datenbank.

Warum halt direkt danach
PHP:
    $mailids = $mm["id"]."||";
Da hast du dann immer genau eine ID im Array.
Du solltest mal mit echos arbeiten um zu sehen was du programmierst. Da kommt man dann schnell auf Fehler und deren Lösungen.
PHP:
    $ids=explode("||",$mailids);
    foreach($ids as $5){
      $sql = ("
        INSERT INTO pm (betreff, name, email, nachricht, gelesen, uid) 
        VALUES ('".$1."', '".$2."', '".$3."', '".$4."', '0', '".$5."')
      ");
      mysql_query($sql) or die ("Eintrag fehlgeschlagen,<br /> 
      MySQL Error: <strong>".mysql_error()."</strong>");
    }
Das kannst du dir als Schleifen sparen. Denn die eine ID kannst du logischerweise direkt in die DB schreiben ohne dass du da noch ein irgendetwas explodieren lässt und eine foreach nutzt.
 
@kkapsner

Danke für die kompetente und ausführliche Problemlösung :)

Es gab mal Zeiten, da wurden einem Fragen direckt beantwortet :)
 
@ ToM80

Danke für die Antwort

Warum halt direkt danach
PHP:
    $mailids = $mm["id"]."||";
Da hast du dann immer genau eine ID im Array.

Weil ich in einer andren Seite bzw. Sparte dieses Arrey benutze als Text Ausgabe

Du solltest mal mit echos arbeiten um zu sehen was du programmierst. Da kommt man dann schnell auf Fehler und deren Lösungen.

Wie ich schon geschrieben habe ist die Ausgabe : 1||2||3||4||5
Mit dem Explode ist die Ausgabe: 12345
Daher besteht ja gar kein Fehler im Eigentlichen sinne, es ist ja so wie ich es brauche.

Das kannst du dir als Schleifen sparen. Denn die eine ID kannst du logischerweise direkt in die DB schreiben ohne dass du da noch ein irgendetwas explodieren lässt und eine foreach nutzt.

Es ist ja nicht nur eine ID, mit dem WHILE werden alle ausgelesen, mit dem Arrey für weitere Zwecke gespeichert mit "||" und mit dem Explode wieder zerpflückt, damit ich die einzelnen ID's weiter benutzen kann. Mit dem foreach ( wie es selbstsagend für jeden/jede) wird eine Aktion gestartet für jede einzelne ID, welche im WHILE ausgegeben werden.

Soweit funtzt es ja auch, mit dem foreach sendet/speichert er nun für jede einzelne ID einen neuen Datensatz in der Datenbank.
Also komplett alles was ich will, nur mit dem Unterschied, dass mir die MAils doppelt gespeichert werden, nach jeder ID Speicherung gibts ne leere Speicherung, das liegt denke ich ganz bestimmt nicht an der Schleife oder dem explode. Denn die Echo ausgabe ist ja richtig. Wären in der Echo Ausgabe irgend welche Leerzeichen würde ich das verstehen, nur so verstehe ich das nicht richtig.

Aber ich hoffe dennoch, dass ihr das versteht, was ich meine und was ich hoffe zu erfahren.
 
Wie ich schon geschrieben habe ist die Ausgabe : 1||2||3||4||5
Es kann ja sein, dass das beim Browser ankommt, aber es gibt keine Variable, die jemals diesen Wert annimmt. Die Variable $mailids hat nämlich nacheinander die Werte "1||", "2||", "3||",... das ist ein himmelweiter Unterschied. (bei einem sinnvollen echo (z.B. echo $mailids . "<br>\n";) wäre dir das sofort aufgefallen)
Mit dem Explode ist die Ausgabe: 12345
Falsch! Die Augabe ist "1" und ""(!) vom ersten, "2" und ""(!) vom zweiten, ... D.h. du hast immer einen Druchlauf mit einem leeren String - genau deshalb der obere (sehr kurze) Post.
Es ist ja nicht nur eine ID
DOCH! In jeder Zeile des MySQL-Results steht nur eine ID.
, mit dem WHILE werden alle ausgelesen, mit dem Arrey für weitere Zwecke gespeichert
? Du überschreibst die Varibale $mailids immer wieder
mit "||" und mit dem Explode wieder zerpflückt, damit ich die einzelnen ID's weiter benutzen kann. Mit dem foreach ( wie es selbstsagend für jeden/jede) wird eine Aktion gestartet für jede einzelne ID, welche im WHILE ausgegeben werden.
Ja - die verschiedenen $mailids werden mit explode zerpflückt - da diese aber immer so aussehen (oder mit einer anderen Zahl) "1||" hat der resultierende Array zwei Elemente "1" und eben "".
Soweit funtzt es ja auch, mit dem foreach sendet/speichert er nun für jede einzelne ID einen neuen Datensatz in der Datenbank.
Also komplett alles was ich will, nur mit dem Unterschied, dass mir die MAils doppelt gespeichert werden, nach jeder ID Speicherung gibts ne leere Speicherung, das liegt denke ich ganz bestimmt nicht an der Schleife oder dem explode.
Äh - ich hoffe es erübrigt sich jetzt ein Kommentar.
Denn die Echo ausgabe ist ja richtig.
s.o.
Wären in der Echo Ausgabe irgend welche Leerzeichen würde ich das verstehen, nur so verstehe ich das nicht richtig.
Da die Elemente leere Strings sind wird natürlich auch nichts ausgegeben - und ich hoffe, du verstehst jetzt warum.
Aber ich hoffe dennoch, dass ihr das versteht, was ich meine und was ich hoffe zu erfahren.
Ich verstehe dein Problem - habe den Finger auf die kritische Stelle in meinem ersten Post gelegt und nun hoffe ich, dass du hiermit erfahren hast, was du willst.

EDIT: Ich hoffe, das war jetzt ausführlich genug.
 
Na das war doch ga net so schwer :)

Hab es verstanden und sogar selbst drauf gekommen durch rumfummeln, dadurch aber etwas zu spät fertig damit. Ich habe kein Problem, wenn andre Recht haben, aber es wäre doch (auch von mir Kommentarlos) angenommen worden, wenn du das gleich so beschrieben hättest, hättest nicht mal SO EXTREM ausführlich werden müssen um es zu verstehen.

Manchmal hat man einfach nach zu langem scripten einfach nur noch Hieroglyphen im Kopf :)

Danke Dir für deine Antwort.
 
Dann hättest du einfach meine Antwort mal mehr durch den Kopf gehen lassen sollen. Denn da stand alles drin.
 
Zurück
Oben